pdf 1.2:如何显示图形图像?

时间:2016-01-10 11:29:29

标签: pdf pdf-generation

我正在尝试从guide学习pdf文档的结构。我可以用线条添加文本和形状,但是我在显示图像时遇到问题。

我写的用于显示图像的代码是(第54页):

%PDF-1.2
% based on e08.pdf
1 0 obj
<<
    /Type /Page
    /Parent 5 0 R
    /Resources 3 0 R
    /Contents 2 0 R
>>
endobj

2 0 obj
<< /Length 51 >>
stream
    BT
        /F1 24 Tf
        1 0 0 1 260 254 Tm
        /CS1 cs
        63 127 127 sc
        (Hello World)Tj
    ET

    100 0 127 sc
    /CS2 CS
    0 0 1 SC
    315 226 m
    299 182 l
    339 208 l
    291 208 l
    331 182 l
    b
    100 0 0 100 65 326 cm
    BI /W 36 /H 32 /BPC 8
    /CS /DeviceGray
    ID
    ççççççççççççÕˇˇˇˇˇˇˇˇˇÕççççççççççç
    çççççççççççç͡ˇˇˇˇˇˇˇˇÍçççççççççççç
    ççççççççççç¢ˇˇˇˇˇˇˇˇˇˇˇ¢ççççççççççç
    çççççççççç瑡ˇˇˇˇˇˇˇˇˇˇ‘ççççççççççç
    ççççççççççˇˇˇˇˇˇˇˇˇˇˇîçççççççççç
    ççççççççççøˇˇˇˇˇˇˇˇˇˇˇˇˇøçççççççççç
    ççççççççççÒˇˇˇˇˇˇˇˇˇˇˇˇˇÒçççççççççç
    çççççççç籡ˇˇˇˇˇˇˇˇˇˇˇˇˇˇ±ççççççççç
    çççççççç瀡ˇˇˇˇˇˇˇˇˇˇˇˇˇˇ€ççççççççç
    ççççççççõˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇõçççççççç
    ççççççççDˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇDçççççççç
    çççççççç¯ˇˇˇˇˇˇˇˇ¯ˇˇˇˇˇˇˇˇ¯çççççççç
    çççççççÕˇˇˇˇˇˇˇˇˇÕˇˇˇˇˇˇˇˇˇÕçççççç
    çççççç炡ˇˇˇˇˇˇˇÍç͡ˇˇˇˇˇˇˇ‚ççççççç
    çççççç¢ˇˇˇˇˇˇˇˇˇÕçÕˇˇˇˇˇˇˇˇˇ¢ççççç
    ççççç瑡ˇˇˇˇˇˇˇ¯ççç¯ˇˇˇˇˇˇˇˇ‘çççççç
    çççççî¯ˇˇˇˇˇˇˇˇDçççÕˇˇˇˇˇˇˇˇ¯îççççç
    çççççøˇˇˇˇˇˇˇˇˇõçççõˇˇˇˇˇˇˇˇˇøççççç
    çççççÒˇˇˇˇˇˇˇˇ‘çççç瀡ˇˇˇˇˇˇˇÒççççç
    ççç癡ˇˇˇˇˇˇˇˇ™çççç癡ˇˇˇˇˇˇˇˇ™ççç
    ççç瑡ˇˇˇˇˇˇˇÒçççççççÒˇˇˇˇˇˇˇˇ‘çççç
    çççõˇˇˇˇˇˇˇˇˇÕçççççççøˇˇˇˇˇˇˇˇˇõççç
    çççDˇˇˇˇˇˇˇˇ¯îçççççççî¯ˇˇˇˇˇˇˇˇDççç
    çççÒˇˇˇˇˇˇˇˇÕçççççççç瑡ˇˇˇˇˇˇˇÒççç
    ççÕˇˇˇˇˇˇˇˇˇõçççççççççõˇˇˇˇˇˇˇˇˇÕçç
    ç炡ˇˇˇˇˇˇˇÒDDDDDDçççç炡ˇˇˇˇˇˇˇ‚çç
    çõˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇ™ççççÕˇˇˇˇˇˇˇˇˇõç
    瑡ˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇ‘çççççÒˇˇˇˇˇˇˇˇ‘ç
    î¯ˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇîççççDˇˇˇˇˇˇˇˇ¯î
    ÕˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇøççççˇˇˇˇˇˇˇÕ
    ͡ˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇÒçççç瑡ˇˇˇˇˇˇˇÒ
    ˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇ™ççç癡ˇˇˇˇˇˇˇˇ
    EI
endstream
endobj

3 0 obj
<<
    /ProcSet[/PDF/Text]
    /Font <</F1 4 0 R>>
    /ColorSpace
    <<
        /CS1 
            [ 
                /Lab 
                <<
                    /Range [-128 127 -128 127]
                    /WhitePoint [ 0.951 1 1.089]
                >> 
            ] 
        /CS2 
            [ 
                /CalRGB 
                    <<
                        /Gamma [2.222 2.222 2.222]
                        /Matrix 
                        [
                            0.412 0.213 0.019
                            0.358 0.715 0.119
                            0.181 0.072 0.951 
                        ]
                        /WhitePoint [0.951 1 1.089]
                    >> 
            ] 
    >>
>>
endobj
4 0 obj
<<
    /Type /Font
    /Subtype /Type1
    /Name /F1
    /BaseFont/Helvetica
>>
endobj
5 0 obj
<<
    /Type /Pages
    /Kids [ 1 0 R ]
    /Count 1
    /MediaBox [ 0 0 612 446 ] 
>>
endobj

6 0 obj
<<
    /Type /Catalog
    /Pages 5 0 R
>>
endobj

trailer
<< /Root 6 0 R >>

我对它的期望是:

Desired result from my code

但是当我在Acrobat Reader DC 2015中打开文件时,我会看到文字和星号,但不会看到图像徽标。

注意:

  • 我自己格式化了代码,如果不合适,请告诉我。
  • 我认为用于显示Adobe徽标的字符存在问题。我猜这些字符应该是二进制数据,当生成PDF时,它们会转换为那些符号。
  • 这里的作者使用的是pdf 1.2,这是相当古老的,但据我所知它不应该出问题,因为pdf是向后兼容的。

我的问题:

  • 为什么我无法使用此代码查看图像中显示的所需结果?
  • 如何获取在PDF中使用以显示图像所需的代码。让我们说一下我在代码中使用的二进制代码(甚至二进制本身)的文本表示?

更新:

  • 如评论中所述,我的代码中不存在交叉引用表,但是当我使用 pdftk 工具生成交叉引用表时,结果是相同的。

1 个答案:

答案 0 :(得分:4)

内联图片的主要问题 是您尝试使用文本创建二进制数据块。

ID EI 之间的数据被解释为单个(!)空格字符的流,后跟 height x width x bits-per- component / 8 x number-of-components 数据字节,即在你的情况下(根据/W 36 /H 32 /BPC 8 /CS /DeviceGray)32 * 36 * 8/8 * 1 bytes。

您的样本中并非如此。在您的问题中,您将该数据块缩进,这会向流中添加大量字节。此外,您的行包含不同的字节数(即使它们在编辑器中看起来可能相同)。

您的二进制下载与问题文本大不相同,例如:而不是填充 A ˇ字符,那里有.个字符。如果线路长度不等,

我假设您使用文本编辑器来编写PDF,这是一个糟糕的选择,因为您没有正确查看使用的实际字节数。特别有问题的是控制字符和字节值与编码中的字符无关。

让我们尝试一些更简单的 ,并且只使用ASCII范围内的字符和更小,更简单的形式:

根据您的行尾序列(它们的字节是数据字节的一部分!!)使用以下两个样本中的任何一个

  • 如果是单字节行结束序列(仅CR或仅LF,典型的Mac或Unix):

    BI /W 5 /H 4 /BPC 8
    /CS /DeviceGray
    ID
    zzzz
    z..z
    z..z
    zzzz
    EI 
    
  • 如果是两个字节的行结束序列(CR LF,典型的DOS / MS Windows):

    BI /W 6 /H 4 /BPC 8
    /CS /DeviceGray
    ID
    zzzz
    z..z
    z..z
    zzzz
    EI
    

请注意不要添加任何前导或尾随空格!它们也会被解释为数据字节!

第一种情况下的结果如下所示

single byte line endings

这是第二种情况

two byte line endings

右侧/左侧和右侧的暗条是/由于行结束字符所致。

如果你不想要这样的酒吧,你必须摆脱行结束,例如

BI /W 4 /H 4 /BPC 8
/CS /DeviceGray
ID zzzzz..zz..zzzzz EI

导致

no line endings inbetween

所有人都说过,请帮自己一个忙,

  • 不要将文档创建为文本 ,例如在文本编辑器中!虽然在文本查看器中可以理解它们,但在文本编辑器中创建它们很快就会变成地狱;
  • 不使用内嵌图片 ,而是使用图片资源!内联图片已被证明很麻烦,而且PDF 2.0将会是弃用或至少限于非常小的尺寸;最后
  • 不使用PDF 1.2参考 ,而是使用当前的PDF标准ISO 32000-1 Adob​​e个人称为旧的PDF引用本质上不是规范,所以你不能指望他们说什么。