如何根据 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   

我尝试了以下方法来解决这个问题:

附加信息:

手动构建 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')

事实证明,这也是这里的问题。