如何从命令行创建空白 PDF?

如何从命令行创建空白 PDF?

我最近需要一个空白 PDF 页面(8.5 英寸 x 11 英寸大小),并意识到我不知道如何从命令行制作一个。

发行touch blank.pdf生成一个空的 PDF文件。有没有可以生成空 PDF 的命令行工具

答案1

convertKetan 的答案中使用的 ImageMagick 实用程序还允许您编写类似的内容

convert xc:none -page Letter a.pdf

或者

convert xc:none -page A4 a.pdf

或(对于水平 A4 纸)

convert xc:none -page 842x595 a.pdf

ETC。,无需创建空文本文件。 @chbrown 注意到这会创建一个较小的 pdf 文件。

“xc:”的意思是“X Constant Image”,但实际上可以被认为是“x canvas”。这是一种指定单个颜色块的方法,在本例中没有。更多信息请访问http://imagemagick.org/Usage/canvas/#solid这是 ImageMagick 的“事实上的”手册。 [补充了来自管道的信息](诸如此类的东西pdf:a可以用来显式声明文件的格式。label:'some text'gradient:rose:logo: 似乎是特殊文件格式的其他示例。)

Anko 建议将此修改作为单独的答案发布,所以我正在这样做。

答案2

尽可能最小的 GIF,最小的空白页 PDF 需要手动计算出来,因为它太小了,以至于不必要但无害的元数据成为文件大小的重要组成部分,而压缩实际上使事情变得简单。它还需要仔细注意 PDF 规范中关于文件结构中哪些位是必需的、哪些位不是必需的规则。 (您是否知道页面对象必须包含/Resources字典,即使它是空的,但是不是需要包含/Contents流吗?)

如果您不使用 PDF 1.5 对象和交叉引用流(其优点是文件可以完全打印 ASCII),我相信您能做的最好是 317 字节。如果复制和粘贴,请注意所有四个交叉引用表条目(0 4和之间的行)都需要有一个尾随空格trailer<<...,并且有不是应该是 . 之后的最后一个换行符%%EOF

%PDF-1.4
1 0 obj<</Type/Catalog/Pages 2 0 R>>endobj
2 0 obj<</Type/Pages/Count 1/Kids[3 0 R]>>endobj
3 0 obj<</Type/Page/MediaBox[0 0 612 792]/Parent 2 0 R/Resources<<>>>>endobj
xref
0 4
0000000000 65535 f 
0000000009 00000 n 
0000000052 00000 n 
0000000101 00000 n 
trailer<</Size 4/Root 1 0 R>>
startxref
178
%%EOF

用手动制作的 v1.5 交叉引用流替换交叉引用表确实会使文件稍微小一些,但代价是它不再是可打印的 ASCII:294 字节。 (为了可读性,更不用说能够输入它了,下面的外部参照流已经被十六进制转储,但这是不是反映在它的流字典中。要恢复有效的 PDF,您必须将十六进制转储替换为相应的原始二进制字节,或者更改/Length 15/Length 30/Filter/ASCIIHexDecode并接受长度为 328 字节的文件。)

%PDF-1.5
1 0 obj<</Type/Catalog/Pages 2 0 R>>endobj
2 0 obj<</Type/Pages/Count 1/Kids[3 0 R]>>endobj
3 0 obj<</Type/Page/MediaBox[0 0 612 792]/Parent 2 0 R/Resources<<>>>>endobj
4 0 obj<</Type/XRef/Size 5/W[1 1 1]/Root 1 0 R/Length 15>>stream
0000ff01090001340001650001b200endstream endobj
startxref
178
%%EOF

我还尝试将对象 1 到 3 包装到对象流中,但这增加的开销比节省的开销更多,即使流被压缩也是如此。

外部参照流的一种可能的替代表述是

4 0 obj<</Type/XRef/Size 4/W[0 1 0]/Index[1 4]/Root 1 0 R/Length 4>>stream
091365b2endstream endobj

遗憾的是,尽管实际流数据的长度大大节省,但额外的长度却/Index[1 4]耗尽了除一个字节之外的所有节省。另外,我不清楚是否允许将对象 0 完全保留在文件之外。 (我也不清楚对象 0 是否必须具有生成编号 -1。如果那是不是必需的,您实际上可以节省更多字节

4 0 obj<</Type/XRef/Size 5/W[1 1 0]/Root 1 0 R/Length 10>>stream
000001090134016501b2endstream endobj

.)

要更改纸张尺寸,请替换612 792为适当的宽度和高度,以 PostScript 点表示(72 PostScript 点 = 1 美国英寸或 25.4 毫米)。例如,595 842对于 A4。您可以将其嵌入到 shell 脚本中,该脚本会输出所需纸张尺寸的空白 PDF;唯一棘手的部分是确保startxref即使对象 3 的大小发生变化,偏移量仍然准确。

答案3

如果您convert安装了(ImageMagick 实用程序),您可以执行以下操作:

touch a.txt && convert a.txt -page Letter a.pdf

答案4

你可以使用 pdfTeX:

echo '\shipout\hbox{}\end' | pdftex

它会生成约 900 字节的空白单页texput.pdf,是 ImageMagick 使用的一半。

不过,这会让您受到 TeX 安装默认纸张尺寸的影响。要明确设置大小,您可以转至 LaTeX:

echo '\documentclass[letterpaper]{article}\usepackage[pass]{geometry}
      \begin{document}\shipout\hbox{}\end{document}' | pdflatex

另一种选择是使用 Ghostscript 的 PDF 驱动程序,尽管ps2pdf脚本很方便:

echo showpage | ps2pdf -sPAPERSIZE=letter - blank.pdf

它比 TeX 安静得多,但产生的输出不太紧凑(大约 2300 字节)。

相关内容