输出 pdf 2.0 规范中的 UTF-8 编码文本字符串

问题描述 投票:0回答:1

我正在尝试了解如何使用 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
pdf pdf-generation
1个回答
0
投票

您不需要使用 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
© www.soinside.com 2019 - 2024. All rights reserved.