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

Bri*_*ick 73 command-line pdf

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

发出touch blank.pdf会产生一个空的 PDF文件。是否有生成空 PDF页面的命令行工具?

Bar*_*hom 110

convert,Ketan 的答案中使用的 ImageMagick 实用程序,还允许您编写类似

convert xc:none -page Letter a.pdf
Run Code Online (Sandbox Code Playgroud)

或者

convert xc:none -page A4 a.pdf
Run Code Online (Sandbox Code Playgroud)

或(对于水平 A4 纸)

convert xc:none -page 842x595 a.pdf
Run Code Online (Sandbox Code Playgroud)

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

“xc:”的意思是“X 恒定图像”,但实际上可以被认为是“x 画布”。这是一种指定单个颜色块的方法,在这种情况下没有。更多信息请访问http://imagemagick.org/Usage/canvas/#solid,这是 ImageMagick 的“事实上的”手册。[补充有从管信息(比如像pdf:a可用于显式声明文件的格式。label:'some text'gradient:rose:logo: 似乎是特殊的文件格式其它例子。)

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

  • 运行此命令时,我收到错误 `convert-im6.q16: not authorized 'blank.pdf' @ error/constitute.c/WriteImage/1037`,但我在这里找到了解决方案:https://askubuntu.com/questions /1081895/trouble-with-batch-conversion-of-png-to-pdf-using-convert 在此发帖以防万一它可以帮助遇到相同问题的其他人。 (4认同)
  • ImageMagick 并没有真正有用的手册。“xc:<foo>”的意思是“X 常量图像”,但实际上可以被认为是“x 画布”。这是一种指定单个颜色块的方法,在本例中为 _none_。更多信息请访问 http://www.imagemagick.org/Usage/canvas/#solid,这是 ImageMagick 的“事实上的”手册。 (3认同)
  • 顺便说一句,如果您想要合理的纸张尺寸,这也适用于 A4 而不是 Letter。 (2认同)

zwo*_*wol 37

最小的 GIF 一样,最小的空白页 PDF 需要手工制作,因为它太小了,以至于不必要但无害的元数据位成为文件大小的重要组成部分,而压缩实际上使事情变得更大。它还需要仔细注意 PDF 规范中关于文件结构的哪些位是必需的和哪些不是必需的规则。(你知道吗,页面的对象必须包含一个/Resources字典,即使它是空的,但并不需要包括/Contents流?)

如果您不使用 PDF 1.5 对象和交叉引用流(其优点是文件可以完全打印 ASCII),我相信您能做的最好的事情是 317 字节。如果复制和粘贴,注意的是,需要有对交叉引用表项的所有四个尾随空间(之间的界限0 4trailer<<...),并且有应该是后一个最终换行符%%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
Run Code Online (Sandbox Code Playgroud)

用手动制作的 v1.5 交叉引用流替换交叉引用表确实会使文件稍微小一些,代价是它不再是可打印的 ASCII:294 字节。(为了可读性,更不用说能够输入它了,下面的外部参照流已被十六进制转储,但这并没有反映在它的流字典中。要恢复有效的 PDF,您必须将 hexdump 替换为对应的原始二进制字节,或更改/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
Run Code Online (Sandbox Code Playgroud)

我还尝试将对象 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
Run Code Online (Sandbox Code Playgroud)

可悲的是,尽管实际流数据的长度大大节省,但额外的/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
Run Code Online (Sandbox Code Playgroud)

.)

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

  • 这对于 http://codegolf.stackexchange.com 来说可能是一项有趣的活动 (11认同)
  • 我发布到 meta.codegolf 看看这样的东西是否会受到欢迎:http://meta.codegolf.stackexchange.com/questions/8990/hand-crafting-a-pdf (5认同)

mkc*_*mkc 24

如果您安装了convert(ImageMagick 实用程序),您可以这样做:

touch a.txt && convert a.txt -page Letter a.pdf
Run Code Online (Sandbox Code Playgroud)

  • 您还可以编写 `convert xc:none -page Letter a.pdf` 而无需创建空的 txt 文件。 (22认同)
  • @BartekChom 的方法似乎创建了一个更空白的空白页面。它生成一个较小的文件,上面绝对没有任何可选内容,并且不会触发任何“(null)”字体错误。 (3认同)

Jam*_*den 15

echo .bp | groff -T pdf > t.pdf

由世界上最被低估的软件 groff 带给您。

  • `.bp` 只是代表“中断页面”,这就是为什么会生成一个 2 页文档的原因。要生成一页文档,只需执行更简单的“echo |” groff -T pdf &gt; 空白.pdf`。 (4认同)
  • 我在 CentOS 7.2 上使用 groff 版本 1.22.2 得到 `groff: can't find \`DESC' file` 和 `groff:fatal error: invalid device \`pdf'`。 (2认同)
  • @gla3dr 安装完整的 groff 包,而不仅仅是 groff-base。 (2认同)

hma*_*ica 11

你可以使用 pdfTeX:

echo '\shipout\hbox{}\end' | pdftex
Run Code Online (Sandbox Code Playgroud)

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

不过,这会让您受到 TeX 安装默认纸张大小的影响。要明确设置大小,您可以改为使用 LaTeX:

echo '\documentclass[letterpaper]{article}\usepackage[pass]{geometry}
      \begin{document}\shipout\hbox{}\end{document}' | pdflatex
Run Code Online (Sandbox Code Playgroud)

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

echo showpage | ps2pdf -sPAPERSIZE=letter - blank.pdf
Run Code Online (Sandbox Code Playgroud)

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


GAD*_*D3R 5

在命令行上,您还可以使用命令ps2pdf将PostScript文件转换为PDF;例如:

touch blank.ps && ps2pdf blank.ps blank.pdf
Run Code Online (Sandbox Code Playgroud)