在我的 Web 应用程序中,客户端使用的是 base64 编码的 PDF。这些 PDF 是从 LaTeX 即时生成的。目前,它们通过 pdflatex 编译为 Web 服务器文件系统上的文件,从中读取,编码为 base64 字符串并发送到客户端。
由于各种原因,这似乎不是最好的解决方案。那么:是否可以将 LaTeX 直接编译为 base64 字符串(或任何可转换/“可管道化”为 base64 的内容),而无需“绕道文件系统”?
当然,我需要一个命令行解决方案(或者更好的是:一个本机 Node.js 库,它不仅仅是 pdflatex 的包装器。好吧,人总是有梦想的......)
答案1
不是 Base64,而是使用 PdfTeX 的内置功能可以对 PDF 输出进行纯 HEX 编码\pdffiledump
。不幸的是,PdfTeX 中没有可用的 Base64 文件转储,但也许有人可以在 Lua 中编写一个用于 LuaTeX 的程序?
下面的示例将十六进制编码的输出写入终端和文件。在将终端输出管道传输到某处之前,必须删除\jobname.pdf.hex
正常输出,因为它无法被抑制。以下几行pdftex
#### \jobname.pdf.hex begin ####
和
#### \jobname.pdf.hex end ####
写在终端(STDOUT)上可能会帮助您编写用于剥离的过滤器。
要恢复 PDF,请xxd
在 HEX 输出上运行命令行工具:
xxd -r -p myDocument.pdf.hex myDocument.pdf.hex.pdf
示例(pdflatex
至少运行两次):
\documentclass{article}
\usepackage{ifthen} %\whiledo
\edef\fileName{\jobname.pdf}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% writes hex encoded \jobname.pdf to the terminal and
% into the file \jobname.pdf.hex
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\IfFileExists{\fileName}{
\typeout{#### \jobname.pdf.hex begin ####}%
\newwrite\OutFile%
\immediate\openout\OutFile=\fileName.hex%
\def\fileoffset{0}%
\edef\filesize{\pdffilesize{\fileName}}%
\whiledo{\fileoffset<\filesize}{%
\edef\ouputLine{\pdffiledump offset \fileoffset\space length 30 {\fileName}}%
\immediate\write\OutFile{\ouputLine}%
\typeout{\ouputLine}%
\edef\fileoffset{\the\numexpr\fileoffset+30\relax}%
}%
\immediate\closeout\OutFile%
\typeout{#### \jobname.pdf.hex end ####}%
}{}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\usepackage{kantlipsum}
\begin{document}
\kant[1-20]
\end{document}