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

显示错误字符而不是换行符的PDF,pdf,pdf-generation,Pdf,Pdf Generation,我的应用程序创建了一个PDF,但是当用户编写的字符串包含换行符(\n)时,它会显示错误的字符(在大多数字体中显示一个小正方形) 当使用在线验证工具时,它会告诉我错误 缺少字体“Arial”中字符代码10的编码 当我开始嵌入字体时,“方形字符”开始出现,但在旧版PDF中使用相同的在线验证程序(没有嵌入字体),它给了我相同的信息 以PDF为例。 PS:错误发生在Windows 8中的Acrobat、Foxit Reader和Windows Reader中,但不发生在chrome中。 任何帮助都将不

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

当使用在线验证工具时,它会告诉我错误

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

当我开始嵌入字体时,“方形字符”开始出现,但在旧版PDF中使用相同的在线验证程序(没有嵌入字体),它给了我相同的信息

以PDF为例。
PS:错误发生在Windows 8中的Acrobat、Foxit Reader和Windows Reader中,但不发生在chrome中。


任何帮助都将不胜感激,提前感谢

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

详细地 应用程序创建页面内容流的指令如下

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
>> 
>
也就是说,编码为WinAnsienceODing,定义见ISO 32000-1附录D。正如您将看到的,对于040=0x20=32以下的字符代码,没有为此编码定义映射,特别是对于您使用的字符代码0x0a,没有定义映射

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

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


PDF查看器显示一些“错误字符”(您称之为错误字符)只是试图从Tj

的字符串参数中的无效元素0x0a中找出意义,非常感谢!有没有一种解决方法可以让使用WinAnsienceoding的TrueType字体理解换行符?@Penachia“理解换行符”是什么意思?显示运算符的文本的字符串参数仅标识glyph。如果您希望此类字符串中的0x0a表示特定的标志符号,这没有问题,请参阅ISO 32000-1的第9.6.6节字符编码。但是如果您希望0x0a导致显示的文本跳转到下一行,这是不可能的,因为显示参数的文本没有控制字符解释。(第31页)他使用\n断线我也想使用,有办法吗?换句话说,PDF不知道断线的概念。只能指定要显示图示符的位置。因此,您必须处理源文本中的换行符;只需停止在当前行上显示图示符,并在其下方开始一个新行。不要在Tj的参数中包含新行字符。@Penachia关于PDF引用链接:是的,字符串通常可以包含任意内容,包括0x0a字节。但意义、解释取决于使用字符串的上下文。而对显示运算符的文本的字符串参数的解释是“识别字形的字符代码序列”。在其他上下文中,特别是在内容流之外,解释是不同的。也就是说,使用非规范性的PDF参考文件,尤其是这样一个旧的参考文件,对你自己没有好处。您最好切换到ISO 32000-1,甚至更好的ISO 32000-2。