首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从命令行创建空白PDF?

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

Unix & Linux用户
提问于 2016-04-20 18:38:36
回答 9查看 53.4K关注 0票数 95

最近,我需要一个空白的PDF页面(8.5“x11”大小),并意识到我不知道如何从命令行创建一个页面。

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

EN

回答 9

Unix & Linux用户

回答已采纳

发布于 2016-04-21 04:29:25

convert是Ketan的答案中使用的ImageMagick实用程序,它还允许您编写以下内容

代码语言:javascript
复制
convert xc:none -page Letter a.pdf

代码语言:javascript
复制
convert xc:none -page A4 a.pdf

或(用于水平A4纸)

代码语言:javascript
复制
convert xc:none -page 842x595 a.pdf

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

"xc:“的意思是"X常量图像”,但实际上可以认为是"x画布“。这是一种指定单个颜色块的方法,在本例中为none。更多的信息在http://imagemagick.org/Usage/canvas/#solid,这是ImageMagick的“事实”手册。辅之以管道信息

蚁子建议把这个修改作为一个单独的答案,所以我正在做。

票数 128
EN

Unix & Linux用户

发布于 2016-04-21 00:33:31

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

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

代码语言:javascript
复制
%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字节。(为了可读性,更不用说能够键入它了,下面的xref流已经被转储了,但是它的流字典中没有反映这一点。要恢复有效的PDF,必须用相应的原始二进制字节替换十六进制,或者将/Length 15更改为/Length 30/Filter/ASCIIHexDecode,并接受一个长度为328字节的文件。)

代码语言:javascript
复制
%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封装到对象流中,但是这会增加比它节省的开销更多的开销,即使流被压缩了。

xref流的一种可能的替代形式是

代码语言:javascript
复制
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。如果这不是必需的,那么实际上可以用

代码语言:javascript
复制
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 For A4。您可以将其嵌入到一个shell脚本中,该脚本可以释放出所需纸张大小的空白PDF;唯一棘手的部分是确保startxref偏移量保持准确,即使对象3的大小发生了变化。

票数 42
EN

Unix & Linux用户

发布于 2016-04-20 18:42:57

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

代码语言:javascript
复制
touch a.txt && convert a.txt -page Letter a.pdf
票数 24
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/277892

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档