如何根据 PDF-2.0 规范创建一个没有损坏文档结构的最小 PDF 文件
How to create a minimal PDF file according to PDF-2.0 spec without a corrupted document structure
我正在尝试根据 PDF-2.0 标准重新创建 "Minimal PDF file" 示例,如下所示:
https://www.iso.org/standard/63534.html
可以在以前的 PDF-1.7 标准(第 707 页)中找到一个免费且类似的 "Minimal PDF file" 示例:
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 代码 "Minimal PDF file":
%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 "Minimal PDF file" 代码:
%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
我尝试了以下方法来解决这个问题:
- 查看 'fixed' pdf 的 Acrobat Reader / Pro 保存后返回并尝试找出不同之处。这几乎是不可能的,因为 'fixed' 文件完全变成了别的东西;
- 我尝试使用 Acrobat Pro 中的印前检查工具。它确实有一个名为:"Report PDF syntax issues" 的配置文件,但只有 returns:"The document structure is corrupt",没有别的;
- 使用有效的 PDF 文件并慢慢删除小部分。这确实有效,但过了一会儿我遇到了同样的情况,当我没有更改任何相关内容时突然文档结构损坏(据我所知)。
附加信息:
- 对于行尾序列我使用 "LF";
- 字节偏移量是使用一小段 JavaScript 代码计算出来的,基本上由以下组成:new Blob([
pdf content
]).size;
- 您可以将上述代码复制并粘贴到文本编辑器中,并将其另存为 .pdf 格式,您应该能够重现我的问题。
手动构建 pdf 时的一个常见错误是忽略了 pdf 交叉引用规范的细节,特别是其中所需的条目大小:
Each entry shall be exactly 20 bytes long, including the end-of-line marker.
(ISO 32000-1 第 7.5.4 节 'Cross-Reference Table')
事实证明,这也是这里的问题。
我正在尝试根据 PDF-2.0 标准重新创建 "Minimal PDF file" 示例,如下所示: https://www.iso.org/standard/63534.html
可以在以前的 PDF-1.7 标准(第 707 页)中找到一个免费且类似的 "Minimal PDF file" 示例: 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 代码 "Minimal PDF file":
%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 "Minimal PDF file" 代码:
%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
我尝试了以下方法来解决这个问题:
- 查看 'fixed' pdf 的 Acrobat Reader / Pro 保存后返回并尝试找出不同之处。这几乎是不可能的,因为 'fixed' 文件完全变成了别的东西;
- 我尝试使用 Acrobat Pro 中的印前检查工具。它确实有一个名为:"Report PDF syntax issues" 的配置文件,但只有 returns:"The document structure is corrupt",没有别的;
- 使用有效的 PDF 文件并慢慢删除小部分。这确实有效,但过了一会儿我遇到了同样的情况,当我没有更改任何相关内容时突然文档结构损坏(据我所知)。
附加信息:
- 对于行尾序列我使用 "LF";
- 字节偏移量是使用一小段 JavaScript 代码计算出来的,基本上由以下组成:new Blob([
pdf content
]).size; - 您可以将上述代码复制并粘贴到文本编辑器中,并将其另存为 .pdf 格式,您应该能够重现我的问题。
手动构建 pdf 时的一个常见错误是忽略了 pdf 交叉引用规范的细节,特别是其中所需的条目大小:
Each entry shall be exactly 20 bytes long, including the end-of-line marker.
(ISO 32000-1 第 7.5.4 节 'Cross-Reference Table')
事实证明,这也是这里的问题。