【问题标题】:Minimal PDF example in PDF specificationPDF 规范中的最小 PDF 示例
【发布时间】:2012-09-21 16:07:27
【问题描述】:

我从PDF Specification 获取了 PDF 规范中的最小 PDF 示例,将其复制到记事本中,将文件重命名为具有扩展名 .pdf

我可以用其他 PDF 查看器(PDF-XChange、SumatraPDF、MuPDF)打开它。但是当我用 Adob​​e Reader 打开它时,它说文件已损坏。

我不确定其他查看者是否将此“损坏”文件视为空白文件。

该文件应该显示一个空白页,因为它是一个最小的示例。

事实上,我修改了最小的例子。因为当我将它从 PDF 规范复制到记事本,并通过十六进制编辑器打开 .txt 文件时,我看到 .txt 文件中的新行给了我 2 个空间。例如,

1 0 obj
<< /Type /Catalog

给我(在十六进制编辑器中)

1 0 obj  << /Type /Catalog

这是(十六进制值)

31 20 30 20 6F 62 6A 0D 0A 3C 3C 20 2F 54 79 70
65 20 2F 43 61 74 61 6C 6F 67

j&lt; 之间的 2 个空格是 0D 0A

因此我不在记事本中创建新行,并修改xref部分中的值。

以下是完整代码。

你知道这个例子有什么问题吗?为什么 Adob​​e Reader 说它坏了?这是因为我在xref 中给出了错误的值吗?

%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 35 >> stream … Page-marking operators … endstream endobj 6 0 obj [/PDF] endobj xref 0 7 0000000000 65535 f 0000000009 00000 n 0000000074 00000 n 0000000119 00000 n 0000000176 00000 n 0000000295 00000 n 0000000373 00000 n trailer << /Size 7 /Root 1 0 R >> startxref 395 %%EOF

【问题讨论】:

    标签: pdf pdf-generation


    【解决方案1】:

    首先:当您从 PDF 规范“复制”示例时,很可能发生了一些事情,导致您的副本无法按预期工作:

    • ...您没有通过在文本编辑器中重新键入示例来“复制”,但是
    • ...您使用了复制粘贴,使用 PDF 作为源文件。

    根据您的文本编辑器,该方法可能导致换行约定的转换从 [cr]+[lf] 更改为 [cr],反之亦然。这反过来意味着对象“目录”(“xref”表)中的字节偏移量不再有效。

    您发布的 PDF 源代码的另一个问题是它现在根本不包含任何换行符。一些观众可能仍然能够默默地解析这件事,但并非所有人都如此。这肯定是违反规范的,因为根据规范,在第 7.5.2 章中明确说明

    "PDF 文件的第一行应该是由 5 个字符组成的标题 %PDF– 后跟 1.N 形式的版本号,其中 N 是 0 到 7 之间的数字。

    您的标题违反了该规则。

    另外,5 0 obj 中的“流”不是任何有效的 PDF 代码,它只是占位符文本 (… Page-marking operators …)。有些观众看到这样的“垃圾”时可能会倾斜。

    最后,您的 startxref 值不正确。

    所以这是一个有效的文件。我在文本编辑器中修复了它,我把你的原始代码作为注释放在%%EOF之后,以供比较和参考:

    %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 35 >>
    stream
    … Page-marking operators …
    endstream 
    endobj
    6 0 obj
    [/PDF]
    endobj
    xref
    0 7
    0000000000 65535 f 
    0000000009 00000 n 
    0000000074 00000 n 
    0000000119 00000 n 
    0000000176 00000 n 
    0000000295 00000 n 
    0000000376 00000 n 
    trailer 
    << /Size 7 /Root 1 0 R >>
    startxref
    394
    %%EOF
    
    %% %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 35 >> stream … Page-marking operators … endstream endobj 6 0 obj [/PDF] endobj xref 0 7 0000000000 65535 f 0000000009 00000 n 0000000074 00000 n 0000000119 00000 n 0000000176 00000 n 0000000295 00000 n 0000000373 00000 n trailer << /Size 7 /Root 1 0 R >> startxref 395
    

    【讨论】:

    • 谢谢Kurt,但是为什么startxref的值是394而不是396。这个值不应该是这个文件中xref中字符'x'的字节偏移量吗?在十六进制编辑器中为 396。但是对于 396,文件已损坏,而 394 可以正常工作。我不知道原因。
    • @user565739:你应该运行dd bs=1 skip=394 if=this.pdf。这意味着您在转储文件时跳过了前 394 个字节。现在输出应该以xref 开头,单独一行。
    • 当我复制/粘贴这个时,我不得不将“页面标记操作符”周围的单个字符“...”更改为三个字符“...”,并将 startxref 从 394 更改为 398。我怀疑当我复制/粘贴单个字符“...”时被删除了。通过扩展为三个,单独的“。”在流的任一侧,这又增加了 4 个字节,这将我从 394 移动到 398 以作为外部参照表的开始。
    • 当我尝试添加一些内容时,我只得到一个空白页,例如,使用“BT 10 50 Td (AwaY!)Tj ET”(说明和开始/结束标签在单独的行中)作为对象 5 的流 - 并在调整相应的字节偏移后。预览打开它很好,但只显示一个空白页。我在 OX 10.6.8 上使用 Preview 版本 5
    • @MASL:可以在这里找到更多(手动编码的)PDF 示例:github.com/angea/PDF101/tree/master/handcoded
    猜你喜欢
    • 2012-04-17
    • 1970-01-01
    • 2016-04-25
    • 2012-09-19
    • 1970-01-01
    • 1970-01-01
    • 2020-01-09
    • 1970-01-01
    • 2023-03-08
    相关资源
    最近更新 更多