PDF语法BT ET文本操作

lev*_*evi -1 pdf pdf-generation

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

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

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

看看这段代码,

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

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

mkl*_*mkl 6

首先,Michaël当然是对的

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

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

换行

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

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

(Line 1 text) Tj
0 -20 Td
(Line 2 Text) Tj
Run Code Online (Sandbox Code Playgroud)

字体重量

如何在字符串中间将font-weight更改为粗体

通过选择粗体字体,例如

/MyNormalFont 12 Tf
(Normal text - ) Tj
/MyBoldFont 12 Tf
(bold text) Tj
/MyNormalFont 12 Tf
( - normal text again) Tj
Run Code Online (Sandbox Code Playgroud)

您可以输出"普通文本 - 粗体文本 - 再次正常文本".

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

其他语言

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

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

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

另请参阅下面的"非拉丁字符"下的示例.

限制文字宽度

如何将文本限制为一定的宽度

通过绘制足够少的字符.

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

线高

如何设置行高属性

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

如何选择前一个距离,取决于你如何进入下一行,见上文"换行符".如果您在那里的示例中这样做,则使用20个单位下一行到下一行

0 -20 Td
Run Code Online (Sandbox Code Playgroud)

您可以在字体选择指令中设置后一个高度,字体高度,例如上面的"字体粗细"

/MyNormalFont 12 Tf
Run Code Online (Sandbox Code Playgroud)

选择大小为12个单位的MyNormalFont.

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

多种字体

在同一行中混合多种字体

请参阅上面的"字体粗细",使用不同的字体实现不同的字体粗细.

非拉丁字符

来自评论:

你能举一个插入英语以外的外语字符的例子吗?

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

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

因此,对于具有阿拉伯字符的字体alef maksuraAdobe Glyph List中的名为alefmaksuraarabic的代码为32(ASCII派生编码中的空格),您可以使用:

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
Run Code Online (Sandbox Code Playgroud)

对于标准Times-Roman/WinAnsiEncoding字体作为字体资源F和上面定义为字体资源G的字体,您可以编写

BT
/F 12 Tf
15 815 Td
(Test: ) Tj
/G 12 Tf
( ) Tj
ET
Run Code Online (Sandbox Code Playgroud)

进入你的内容流并得到

屏幕截图