【发布时间】:2020-01-09 16:32:30
【问题描述】:
我正在尝试从 PDF-2.0 标准重新创建“最小 PDF 文件”示例,如下所示: https://www.iso.org/standard/63534.html
可以在之前的 PDF-1.7 标准(第 707 页)中找到免费且类似的“最小 PDF 文件”示例: https://www.adobe.com/content/dam/acom/en/devnet/pdf/pdfs/PDF32000_2008.pdf
我遇到的问题是,无论我尝试什么,我总是以根据 Acrobat Reader / Acrobat Pro 的文档结构损坏的 pdf 告终。实际上,这意味着它确实成功打开了我的 pdf 并正确显示了页面,但是每当我尝试关闭文件时,Acrobat Reader / Pro 都会尝试修复 pdf 并提示保存。我不想要这个,我希望我的 PDF 从一开始就符合标准。
这是我的 PDF-2.0“最小 PDF 文件”代码:
%PDF-2.0
%����
1 0 obj
<</Type /Catalog
/Pages 2 0 R
/Metadata 5 0 R
>>
endobj
2 0 obj
<</Type /Pages
/Kids [3 0 R]
>>
endobj
3 0 obj
<</Type /Page
/Parent 2 0 R
/MediaBox [0 0 612 792]
/Contents 4 0 R
/Resources <<>>
>>
endobj
4 0 obj
<</Length 1
>>
stream
endstream
endobj
5 0 obj
<</Type /Metadata
/SubType /XML
/Length 1381
>>
stream
<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
<x:xmpmeta xmlns:x="adobe:ns:meta/">
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<rdf:Description rdf:about="" xmlns:pdf="http://ns.adobe.com/pdf/1.3">
<pdf:Producer>name of software which generates the PDF</pdf:Producer>
</rdf:Description>
<rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/">
<xmp:CreatorTool>name of tool used to create the document</xmp:CreatorTool>
<xmp:CreateDate>2019-09-04T20:57:49+02:00</xmp:CreateDate>
<xmp:ModifyDate>2019-09-04T20:57:49+02:00</xmp:ModifyDate>
</rdf:Description>
<rdf:Description rdf:about="" xmlns:dc="http://purl.org/dc/elements/1.1/">
<dc:format>application/pdf</dc:format>
<dc:title>
<rdf:Alt>
<rdf:li xml:lang="x-default">document title</rdf:li>
</rdf:Alt>
</dc:title>
<dc:creator>
<rdf:Seq>
<rdf:li>document author's personal name</rdf:li>
</rdf:Seq>
<dc:creator>
</rdf:Description>
<rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/">
<xmpMM:DocumentID>uuid:6cb4b2d9-6bb9-45b3-98b7-b5017ec34351</xmpMM:DocumentID>
<xmpMM:InstanceID>uuid:859fb9d9-08bd-4cb1-9ca2-035973ec93ec</xmpMM:InstanceID>
</rdf:Description>
</rdf:RDF>
</x:xmpmeta>
<?xpacket end="w"?>
endstream
endobj
xref
0 6
0000000000 65535 f
0000000024 00000 n
0000000101 00000 n
0000000157 00000 n
0000000280 00000 n
0000000333 00000 n
trailer
<</Size 6
/Root 1 0 R
>>
startxref
1972
%%EOF
我最感兴趣的是 PDF-2.0 标准的解决方案,但我知道该标准并非免费提供,因此我也对 PDF-1.7 标准的解决方案感到满意。我的 PDF-1.7“最小 PDF 文件”代码:
%PDF-1.4
%¥±ë
1 0 obj
<< /Type /Catalog
/Outlines 2 0 R
/Pages 3 0 R
>>
endobj
2 0 obj
<< /type Outlines
/Count 0
>>
endobj
3 0 obj
<< /Type /Pages
/Kids [4 0 R]
/Count 1
>>
endobj
4 0 obj
>> /Type /Page
/Parent 3 0 R
/MediaBox [0 0 612 792]
/Contents 5 0 R
/Resources << /ProcSet 6 0 R >>
>>
endobj
5 0 obj
<< /Length 29 >>
stream
...Page-marking operators...
endstream
endobj
6 0 obj
[/PDF]
endobj
xref
0 7
0000000000 65535 f
0000000018 00000 n
0000000098 00000 n
0000000153 00000 n
0000000225 00000 n
0000000369 00000 n
0000000450 00000 n
trailer
<< /Size 7
/Root 1 0 R
>>
startxref
475
%%EOF
我尝试了以下方法来解决这个问题:
- 检查保存后返回的“固定”pdf 的 Acrobat Reader / Pro 并尝试找出差异。这几乎是不可能的,因为“固定”文件已完全更改为其他文件;
- 我尝试在 Acrobat Pro 中使用 Preflight 工具。它确实有一个名为:“报告 PDF 语法问题”的配置文件,但只返回:“文档结构已损坏”,仅此而已;
- 使用有效的 PDF 文件并慢慢删除小部分。这确实有效,但过了一段时间我最终陷入了同样的境地,当我没有更改任何相关内容(据我所知)时,文档结构突然变得损坏。
附加信息:
- 对于行尾序列,我使用“LF”;
- 字节偏移量是使用一小段 JavaScript 代码计算的,该代码基本上由以下内容组成:new Blob([
pdf content]).size; - 您可以将上述代码复制并粘贴到文本编辑器中,然后将其保存为 .pdf,您应该能够重现我的问题。
【问题讨论】:
-
您的每个交叉引用条目的大小是否正好为 20 字节?
-
你太棒了@mkl 就是这样。我在两个文件上都更改了它,现在它们都可以工作了!您可以将此作为答案提交,以便我将其标记为解决方案吗?您可以从官方标准中使用它:“此行之后是交叉引用条目本身,每行一个。每个条目的长度应为 20 个字节,包括行尾标记。” (第 40 页)
标签: pdf pdf-generation