【问题标题】:How to create a minimal PDF file according to PDF-2.0 spec without a corrupted document structure如何根据 PDF-2.0 规范创建最小的 PDF 文件而不损坏文档结构
【发布时间】: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


【解决方案1】:

手动构建 pdf 时的一个常见错误是忽略 pdf 交叉引用规范的细节,尤其是其中所需的条目大小:

每个条目的长度应为 20 个字节,包括行尾标记。

(ISO 32000-1 第 7.5.4 节“交叉引用表”)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-15
    • 1970-01-01
    • 2014-03-24
    • 1970-01-01
    • 2017-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多