PDF显示错误字符而不是换行符

时间:2018-06-28 19:47:45

标签: pdf pdf-generation

我的应用程序创建了PDF,但是当用户编写的字符串包含换行符(\ n)时,它将显示错误的字符(大多数字体显示一个小方块)

使用this在线验证工具时,会显示错误消息

  

缺少字体“ Arial”中字符代码10的编码。

当我开始嵌入字体,但是在较旧的PDF中使用相同的在线验证器(没有嵌入字体)时,“方形字符”开始出现。

Link转换为PDF示例。
PS:该错误在Windows 8中的Acrobat,Foxit Reader和Windows阅读器中发生,但在chrome中不发生。

任何帮助将不胜感激,在此先感谢!

1 个答案:

答案 0 :(得分:1)

在字符串中显示的换行符本身就是错误。

详细

您的应用程序使用如下指示创建页面内容流

1 0 0 1 15.1732 592.4547 Tm
(Test with line break
) Tj
1 0 0 1 15.1732 580.4547 Tm
(New Line.) Tj 

尤其是第一条 Tj 指令的字符串参数在右括号之前包含一个0x0a字节。

Tj 是文本显示运算符。如果您查看PDF规范,将会阅读

  

文本显示运算符的字符串操作数应解释为标识要绘制的字形的字符代码序列。

(ISO 32000-1第9.4.3节“文本显示运算符”)

即这样的字符串中的每个字节都属于一个字节序列,该字节序列形成一个字符代码以从字体中识别字形。

在您的情况下,字体定义为

<<
/Type /Font
/Subtype /TrueType
/BaseFont /Arial
/FirstChar 30
/LastChar 255
/Widths 4 0 R
/FontDescriptor 5 0 R
/Encoding /WinAnsiEncoding
>> 

即编码为 WinAnsiEncoding ,该定义在ISO 32000-1的附件D中定义。如您所见,对于为此编码定义的040 = 0x20 = 32以下的字符代码,没有映射,特别是没有为您使用的字符代码0x0a映射。

因此,PDF验证器的错误消息是正确的:

  

缺少字体“ Arial”中字符代码10的编码。

和显示某些“错误字符”(如您所说的)的PDF查看器仅试图从 Tj 的字符串参数中的无效元素0x0a中弄清楚。