如何获取字体数据以嵌入PDF?

3
我的MFC应用程序创建了一个PDF,现在我正在尝试嵌入字体,创建的PDF在Foxit、Chrome和Windows 8 PDF Reader中打开,但在Acrobat中无法打开。
我尝试使用这个在线验证器验证pdf文件,它说:
对象标识6与对象引用标识5不匹配。 无法读取嵌入字体程序'Candara'。
我认为我嵌入字体的方式是正确的。
3 0 obj
<</Type /Font
    /Subtype /TrueType
    /BaseFont /Candara
    /FirstChar 0
    /LastChar 255
    /Widths 4 0 R
    /FontDescriptor 5 0 R
>>
endobj

5 0 obj
<<
    /Type /FontDescriptor
    /FontName /Candara
    /Flags 32
    /FontBBox [-700 -500 1800 1500]
    /ItalicAngle 0
    /Ascent 12
    /Descent -4
    /CapHeight 8
    /StemV 109
    /FontFile2 6 0 R
>>
endobj

6 0 obj
<<
    /Length 100376
    /Length1 100376
>>
stream
    ... font bytes ...
endstream
endobj


我认为我的问题出在获取字体数据时

LONG ret = ::TTEmbedFont(pDC->GetSafeHdc(),
                    TTEMBED_TTCOMPRESSED, 
                    CHARSET_UNICODE,
                    &ulPrivStatus,
                    &ulStatus,
                    WriteEmbedProc,
                    lpvVecBytes,
                    nullptr,
                    0,
                    0,
                    nullptr);

我还尝试使用TTEMBED_RAWTTEMBED_EMBEDEUDC



抱歉解释有点长,也许有些含糊不清,但我有点迷茫,

所以这是获取嵌入字体数据的正确方法吗?如果是,应该对字体文件对象应用过滤器吗?

编辑:我更改了应用程序,使用GetFontData返回字体文件的字节,并根据我的研究,这样使用是可以的。但我仍然无法在Acrobat中打开,而在线验证站点仍然给出相同的错误消息。

链接 提供了一个带有我的问题的示例PDF。

感谢任何帮助!


@mkl 已完成,但现在我相信我的问题出在PDF对象上,而不是字体数据,但我仍然不确定。 - Penachia
1
Xpdf报告xref存在问题:“内部错误:未找到但需要的xref num 5,尝试重建<0a>”。 - dwarring
1
我认为这也是在线验证器试图告诉您的。交叉引用已将对象5和6映射到相同的字节偏移1081。 - dwarring
1
还要注意内容流的末尾有一些垃圾(8 0 R),它以ET0�4Oendstream endobj结尾。 - dwarring
@dwarring 先生,您是一个英雄,非常感谢您。我因此而疯狂了。谢谢! - Penachia
显示剩余2条评论
1个回答

2
< p > 字体嵌入本身看起来没问题。实际上,获取字体对象存在较低级别的错误。

使用Xpdf查看PDF时,交叉引用表出现错误:xref num 5 not found but needed, try to reconstruct<0a>

查看PDF末尾的交叉引用表:

xref 0 10 0000000000 65535 f 0000242485 00000 n 0000242426 00000 n 0000000016 00000 n 0000000155 00000 n 0000001081 00000 n % 错误应为0000241738 0000001081 00000 n
0000241929 00000 n 0000242056 00000 n 0000242353 00000 n

交叉引用表的第6行包含对象6 0 R的字节偏移量,而不是5 0 R

在线验证器的消息The object's identity 6 doesn't match with the object's reference identity 5.是由于在线验证器尝试通过索引获取对象5 0 R,但实际上获取的是对象6 0 R

需要修复此PDF的交叉引用表。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接