PDF语法BT ET文本操作

时间:2018-04-30 06:30:51

标签: pdf pdf-generation

查看PDF语法流BT ET我有一些问题,我无法理解PDF32000操作手册:

良好的在线资源链接也很棒......

BT /F1 24 Tf ... (My String is here)Tj ET

看一下这段代码,

  • 如何插入换行符?使用\n\r没有帮助
  • 如何更改字体粗细    在字符串中间加粗
  • 尝试过英语以外的其他语言并且无法正确使用,我怎么能做其他语言,希伯来语,阿拉伯语,中文等...改变字体没有帮助,编码到UTF16也无济于事,我应该编码到不同的东西并在某处设置编码吗?
  • 如何将文字限制为一定宽度
  • 如何设置行高属性
  • 在同一行中混合多种字体

我知道我可以使用PDFKit和PDFJS等...但我真的想知道 PDF语法的工作原理,在线PDF32000手册真的很长很复杂......

1 个答案:

答案 0 :(得分:6)

首先,Michaël当然是对的

  

不幸的是,如果您想了解PDF语法的工作原理,您需要阅读规范。当然,您只能阅读适用于文本的部分,第9章,可能只有9.2。但是,本章当然假设您了解PDF在结构上的工作原理以及对象的类型。我建议阅读它。

为了给你一些印象,这里有一些问题的答案......

换行符

  

如何插入换行符?使用\ n \ r没有帮助

通过将文本分成不同的行来绘制文本,每行一个,并分别绘制它们,通过重新定位当前文本位置前进到下一行。有不同的方法来重新定位。 E.g。

(Line 1 text) Tj
0 -20 Td
(Line 2 Text) Tj

字体重量

  

如何在字符串中间将字体粗细更改为粗体

选择粗体字体,例如

/MyNormalFont 12 Tf
(Normal text - ) Tj
/MyBoldFont 12 Tf
(bold text) Tj
/MyNormalFont 12 Tf
( - normal text again) Tj

您可以输出“普通文字 - 粗体文字 - 再次播放正常文字”。

(还有一些穷人的大胆效果,比如双重打印带有小偏移的字母......)

其他语言

  

尝试过英语以外的其他语言并且无法正确使用,我怎么能做其他语言,希伯来语,阿拉伯语,中文等...改变字体没有帮助,编码到UTF16也无济于事,我应该编码到不同的东西并在某处设置编码吗?

您必须声明字体才能在内容流中使用它们。在此声明中,您特别定义了用于使用相关字体绘制的文本的编码。对于上面的样本,编码必须是ASCII'ish,例如 WinAnsiEncoding ,但您经常会找到其他编码,尤其是非英文文本。

为此,您必须考虑字体类型的资源。详情请参阅规范第9章。

另请参阅下面“非拉丁字符”下的示例。

限制文字宽度

  

如何将文字限制为一定宽度

通过绘制足够的字符。

见上文,在将字符串绘制指令放入内容流之前,必须将其拆分为行。只需根据需要选择这些行。

行高

  

如何设置行高属性

你的意思是从一条线的底部到下一条底线的距离?或者你的意思是字体高度?

如何选择前一距离取决于您前一行的方式,请参阅上面的“换行符”。如果您在那里的例子中这样做,那么使用

进入下一行20个单位
0 -20 Td

您可以在字体选择指令中设置后一个高度,字体高度,例如在“字体重量”上面

/MyNormalFont 12 Tf

选择 MyNormalFont ,大​​小为12个单位。

关于那些单位:单位通常以1/72英寸开始,但通过更改变换矩阵(参见规范第8节),您可以更改它。

多种字体

  

在同一行中混合多种字体

请参阅上面的“字体粗细”,使用不同的字体实现不同的字体粗细。

非拉丁字符

来自评论:

  

你能举例说明插入英语以外的外语吗?

您拥有的一个选项是创建一个PDF字体,将您需要的字符按名称从给定的字体程序映射到0..255范围,以进行单字节编码。这对希伯来语或阿拉伯语写作是好的,但对于CJK写作则不那么好。

由于你只要求一个字符,我只在示例中添加一个字符...此外,我使用Arial并期望有问题的PDF查看器在手边的系统中找到,即我没有嵌入它。

因此,对于在代码为32的Adobe Glyph List中放置阿拉伯字符a​​lef maksura并命名为 alefmaksuraarabic 的字体(ASCII派生编码中的 space ),你可以使用:

1 0 obj
<<
  /Type /Font
  /Subtype /TrueType
  /BaseFont /Arial
  /Encoding
  <<
    /BaseEncoding /WinAnsiEncoding
    /Differences [ 32 /alefmaksuraarabic ]
  >>
  /FirstChar 32
  /LastChar 32
  /FontDescriptor 2 0 R
  /Widths [ 600 ]
>> 
endobj
2 0 obj
<<
  /Type /FontDescriptor
  /FontName /Arial
  /StemV 44
  /Leading 33
  /Ascent 905
  /Flags 32
  /XHeight 250
  /FontWeight 400
  /AvgWidth 441
  /Descent -210
  /CapHeight 728
  /MaxWidth 2665
  /FontBBox [-665 -210 2000 728]
  /ItalicAngle 0
>>
endobj

标准 Times-Roman / WinAnsiEncoding 字体为字体资源 F ,上面定义的字体为字体资源 G < / strong>,你可以写

BT
/F 12 Tf
15 815 Td
(Test: ) Tj
/G 12 Tf
( ) Tj
ET

进入您的内容流并获取

screen shot