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


57

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

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


你为什么需要它?我有一个打印程序包,用于在非双面打印机上模拟双面(双面)打印。为此,在打印具有奇数页数的作业的偶数页时,需要多出一个空白页。为此,我只是向lp发送一个换页。这是卓有成效的,而无需创建一个空白页的文件,等等。

10
@Joe Brian想要或需要这个与我们无关。
Iain Holder

6
@IainHolder:希望更多的SE用户像您一样。
Mehrdad

3
@IainHolder-我不是在尝试OP的业务!我只是想建议,如果这就像我正在做的事情,那么还有另一种方法可以做到。这样的事情通常是xy问题(meta.stackexchange.com/questions/66377/what-is-the-xy-problem),因此询问目标是非常合适的。

5
我只是仔细阅读了上面的链接。我没有意识到这是一个有争议的问题。TL; DR-如果您知道自己在做什么,那么您只需要答案即可。如果您不那么精通,则可能是您提出了错误的问题,并且弄清真正的问题是有帮助的。

Answers:


85

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

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

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

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


2
ImageMagick确实没有有用的手册。“ xc:<foo>”的意思是“ X Constant Image”,但实际上可以认为是“ x canvas”。这是一种指定颜色的单独块的方法,在这种情况下为none。有关更多信息,请访问imagemagick.org/Usage/canvas/#solid,这是ImageMagick的“事实上”手册。
管道

2
作为顺便说一句,如果您需要合理的纸张尺寸,则它也适用于A4而不是Letter。
TRiG

@TRiG:当然可以。很抱歉,我在编辑中没有提到您,但是在这种情况下,我已经知道了。
BartekChom

我将此更改为已接受的答案,因为这是我输入的答案~/bin
Brian Fitzpatrick

可以更改此命令以生成n个空白页面的pdf文件吗?
布赖恩·菲茨帕特里克

34

最小的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

用手动制作的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 US英寸或25.4毫米)表示。例如,595 842对于A4。您可以将其嵌入到shell脚本中,该脚本会弹出所需纸张大小的空白PDF。唯一棘手的部分是startxref即使对象3的大小发生变化,也要确保偏移量保持准确。



5
我贴到meta.codegolf,看看这样的事情会好评:meta.codegolf.stackexchange.com/questions/8990/...
内特埃尔德雷奇

虽然这是在文本编辑器中创建具有空白页的有效PDF文档的不错的解决方案,但它并不是我所认为的命令行解决方案(正如OP所要求的)。
Kurt Pfeifle

23

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

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

1
convert也有一个-size选项,您可以用来设置输出pdf的大小。
mkc '16

21
您也可以编写convert xc:none -page Letter a.pdf而不创建空的txt文件。
BartekChom

3
@BartekChom的方法似乎创建了一个更空白的空白页。它产生的文件较小,绝对没有任何选择,并且不会触发任何(null)字体错误。
chbrown '16

1
@BartekChom我想作为一个单独的答案,这样我可以投票赞成。
Anko 2016年

1
我得到convert.im6: improper image header a.txt'@ error / txt.c / ReadTXTImage / 429。convert.im6:未定义图像a.pdf' @ error/convert.c/ConvertImageCommand/3044.
Sigur,

12

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

由groff带给您的东西,这是世界上被低估的软件。


2
我得到groff: can't find `DESC' filegroff:fatal error: invalid device `pdf'用在CentOS 7.2版本的groff 1.22.2。
gla3dr '16

使用bash 4.1.2跑步给我同样的消息groff 1.18.1.4
zundarz 2016年

2
@ gla3dr安装完整的groff软件包,而不仅仅是groff-base。
长颈鹿船长

1
.bp只是代表“分页”,这就是为什么生成2页文档的原因。要生成一页文档,只需执行更简单的操作即可echo | groff -T pdf > blank.pdf
Faheem Mitha

非常好的解决方案,但echo .bp确实应该由代替echo,就像@FaheemMitha所说的
myrdd

8

您可以使用pdfTeX:

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

它将产生texput.pdf约900字节的空白单页,仅为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字节)。


1
我使用变体echo "" | ps2pdf -sPAPERSIZE=a4 - blank.pdf。它稍小一点,为2200字节。
Faheem Mitha

echo '\documentclass[letterpaper]{article}\usepackage[pass]{geometry} \begin{document}\shipout\hbox{}\end{document}' | pdflatex创建article.pdf。是否可以blank.pdf直接创建?
Faheem Mitha

@FaheemMitha:嗯,我希望ps2pdf的输入为空会产生一个包含零页的PDF文件-但是当我尝试时确实有一个页面。想知道那是哪里来的……
Henning Makholm '16

@Faheem:至少使用Texlive,您可以-jobname <basename>在命令行上使用来设置输出文件的基本名称。
Henning Makholm '16

1
@FaheemMitha:每个\shipout\hbox{}showpage产生一页。TeX和Postscript都具有可以使用的循环结构,但是使用所选的脚本语言将命令重复适当的次数可能更简单
Henning Makholm

3

使用空白页制作PDF的一种简单方法是rst2pdf

echo -e '.. raw:: pdf\n\n   PageBreak' | rst2pdf -o blank.pdf

只是在单个空格中回显是行不通的,您最终会得到一个没有页面的PDF文件(与空文件不同)。


2

在命令行上,输入:

ps2pdf blank.pdf

该命令ps2pdf用于将PostScript文件转换为pdf

ps2pdf file.ps file.pdf

1
ps2pdf blank.pdf返回错误,因为它期望将Postscript文件作为参数。第二个命令需要一个预先存在的命令file.pdf。我想念什么吗?
Faheem Mitha

1
试试这个:1 touch blank.ps。2 ps2pdf blank.ps blank.pdf.; 3.pdftk A=1.pdf B=blank.pdf cat A1-end B output 2.pdf
Victoria Stuart,

2

最后,同样重要的是,这是使用Ghostscript方法创建显示空白页面的PDF的方法:

 gs -sDEVICE=pdfwrite -o empty.pdf -c showpage

页面大小很可能是Letter。如果要A4,请使用此:

 gs -sDEVICE=pdfwrite -o empty.pdf -g5950x8420 -c showpage

背景:-c参数可以跟任何合法的PostScript字符串,它的Ghostscript会尽量解释。这个短代码块表示PostScript中的空白页:

%!PS
showpage
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.