我正在尝试了解如何使用 utf-8 编码字符串生成 PDF,并一直在手工制作 pdf 文件。我从下面非常简单的文件开始,并调整文本流中的指令(修复每个测试的偏移量等)。目前,文本被“打印”到渲染页面:
239 187 191 (test åäö abc) Tj
但是,这在页面上呈现为“test ˆ¥ˆ⁄ˆ¶ abc”。在一些 sample pdf 中,我发现它们将彩虹渲染为文档大纲的一部分(在页面上不可见)。他们在那里使用了字节字符串:
<EF BB BF F0 9F 8C 88 EF B8 8F 0A>
但是将其与
Tj
指令一起使用只会输出几个乱码,并且尝试使用 åäö <EF BB BF F0 9F 8C 88 EF B8 8F 0A>
的十六进制编码会产生相同的结果。
如何构建包含正确呈现的 utf-8 编码字符串的 pdf 文件(只要字体支持这些字符/字形)?
这是我尝试过的完整文件内容:
%PDF-2.0
1 0 obj
<<
/Type /Catalog
/Pages 2 0 R
>>
endobj
2 0 obj
<<
/Type /Pages
/MediaBox [0 0 595.28 841.89]
/Count 1
/Kids [ 3 0 R ]
>>
endobj
3 0 obj
<<
/Type /Page
/Parent 2 0 R
/Resources <<
/Font <<
/F1 4 0 R
>>
>>
/Contents 5 0 R
>>
endobj
4 0 obj
<<
/Type /Font
/Subtype /Type1
/BaseFont/Helvetica
>>
endobj
5 0 obj
<<
/Length 66
>>
stream
BT
70 791.89 TD<F9>
/F1 12 Tf
239 187 191 (test åäö abc) Tj
ET
endstream
endobj
xref
0 6
0000000000 65535 f
0000000009 00000 n
0000000063 00000 n
0000000161 00000 n
0000000289 00000 n
0000000365 00000 n
trailer
<<
/Size 6
/Root 1 0 R
>>
startxref
484
%%EOF
您不需要使用 2.0 版本来实现没有字体嵌入的简化方法
主要问题是 ANSI Helvetica 纯文本将呈现为
ˆ¥ˆ⁄ˆ¶
而 WinAnsiEncoding Arial 字体看起来像 åäö
我们实际上可以通过使用八进制值十进制 64 = @ or = hex <40> 来使用 1.0 Helvetica 方法,并且十六进制更容易查找,因此 e5=å
这确实意味着您需要一种方法来转换为 UniCode,并且无需嵌入 CID 或 CMAP,这可以通过添加 Unicode 字体名称(如 MS Arial)来完成。这是版本 1.X 的示例
%PDF-2.0
%¿¾½¼
1 0 obj <</Type/Catalog/Pages 2 0 R>> endobj
2 0 obj <</Type/Pages/MediaBox[0 0 595.28 841.89]/Count 1/Kids[3 0 R]>> endobj
3 0 obj <</Type/Page/Parent 2 0 R/Resources<</Font<</F0 4 0 R/F1 5 0 R>>>>/Contents 6 0 R>> endobj
4 0 obj <</Type/Font/Subtype/Type1/BaseFont/Helvetica>> endobj
5 0 obj <</BaseFont/Arial/Encoding/WinAnsiEncoding/FirstChar 228/LastChar 246/Subtype/TrueType/Type/Font/Widths[556 556 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 556]>> endobj
6 0 obj
<</Length 183>>
stream
q
/GS0 gs
1 0 0 1 70 800.50607 cm
0 g
BT
/F0 12 Tf
1 0 0 1 0 -10.86 Tm
[(test )] TJ
/F1 12 Tf
1 0 0 1 22.68 -10.86 Tm
[<E5E4F6>] TJ
/F0 12 Tf
1 0 0 1 42.696 -10.86 Tm
( abc) Tj
ET
Q
endstream
endobj
xref
0 7
0000000000 65536 f
0000000015 00000 n
0000000060 00000 n
0000000139 00000 n
0000000238 00000 n
0000000301 00000 n
0000000467 00000 n
trailer
<</Size 7/Root 1 0 R>>
startxref
699
%%EOF