我最近需要一个空白 PDF 页面(8.5 英寸 x 11 英寸大小),并意识到我不知道如何从命令行制作一个。
发行touch blank.pdf
生成一个空的 PDF文件。有没有可以生成空 PDF 的命令行工具页?
答案1
convert
Ketan 的答案中使用的 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 字节)。