PDF 语法 BT ET 文本操作
PDF syntax BT ET text operations
看PDF语法流BT ET有一些疑问,看PDF32000操作手册看不懂:
一个好的在线资源 link 也很好...
BT /F1 24 Tf ... (My String is here)Tj ET
看这段代码,
- 如何插入换行符?使用
\n\r
没有帮助
- 如何更改字体粗细
在字符串中间加粗
- 尝试了英语以外的其他语言,但无法正确使用,我怎么能使用其他语言,希伯来语、阿拉伯语、中文等...更改字体没有帮助,编码为 UTF16 也没有帮助或者,我应该编码成不同的东西并在某处设置编码吗?
- 如何将文字限制在一定宽度
- 如何设置行高属性
- 在同一行中混合使用多种字体
我知道我可以使用 PDFKit 和 PDFJS 等...但我真的很想知道 PDF 语法是如何工作的,在线 PDF32000 手册真的又长又复杂.. .
首先,迈克尔说的当然是对的
Unfortunately, if you want to understand how PDF syntax works, you'll need to read the specification. You could of course only read the part that applies to text, Chapter 9, and probably 9.2. But this chapter of course assumes that you have knowledge of how PDF works structurally and what the types of objects are. I suggest reading it.
不过,为了给您留下一些印象,这里有一些问题的答案...
换行符
How do I insert line breaks? using \n\r didn't help
通过将文本分成单独的字符串,每行一个字符串,然后分别绘制,通过重新定位当前文本位置前进到中间的下一行,从而在不同的行上绘制文本。有不同的方法可以进行这种重新定位。例如
(Line 1 text) Tj
0 -20 Td
(Line 2 Text) Tj
字体粗细
How can I change the font-weight to bold in the middle of the string
选择粗体,例如
/MyNormalFont 12 Tf
(Normal text - ) Tj
/MyBoldFont 12 Tf
(bold text) Tj
/MyNormalFont 12 Tf
( - normal text again) Tj
可以输出"Normal text - bold text - normal text again".
(也有穷人大胆的效果,比如双印小偏移的字母...)
其他语言
Tried languages other than english and couldn't get it right, how can I do other languages, hebrew, arabic, chinese, etc... changing the font didn't help, encoding to UTF16 didn't help either, should I encode to something different and set encoding somewhere?
您必须声明字体才能在内容流中使用它们。在此声明中,您特别定义了用于使用相关字体绘制的文本的编码。对于上面的示例,编码必须是 ASCII'ish,例如WinAnsiEncoding,但您会经常发现其他编码,尤其是对于非英语文本。
为此,您必须考虑类型为 Font 的 Resources。详情请参阅。规范第 9 章。
另请参阅下面 "A non-Latin character" 下的示例。
限制文本宽度
How to limit the text to a certain width
通过绘制足够少的字符。
见上文,在将字符串绘制指令放入内容流之前,您必须将其拆分成行。只需根据需要选择尽可能短的这些行。
行高
How to set line-height properties
你的意思是从一条线的底部到下一条线的底部的距离?或者你指的是字体高度?
如何选择前一个距离取决于您如何转到下一行,请参见上文 "Line breaks"。如果你像那里的例子那样这样做,你可以使用
向下移动 20 个单位到下一行
0 -20 Td
你在字体选择指令中设置后一个高度,即字体高度,例如在"Font weight"上面
/MyNormalFont 12 Tf
选择 MyNormalFont,大小为 12 个单位。
关于那些 单位 :一个单位通常以 1/72 英寸开始,但通过更改转换矩阵(参见规范的第 8 节),您可以更改它。
多种字体
Mixing multiple fonts in the same line
参见上文"Font weights",不同的字体粗细是使用不同的字体实现的。
一个非拉丁字符
来自评论:
could you give an example of inserting a foreign language character other than english?
您可以选择创建一个 PDF 字体,将给定字体程序中所需的字符按名称映射到 0..255 范围内以进行单字节编码。这对于希伯来语或阿拉伯语写作来说是可以的,但对于 CJK 写作来说就不是这样了。
由于您只要求一个字符,所以我在示例中只放了一个字符...此外,我使用 Arial 并希望有问题的 PDF 查看器可以在手头的系统中找到,即我没有嵌入它。
因此,对于名为 alefmaksuraarabic 的阿拉伯字符 alef maksura 的字体,在 Adobe Glyph List 中放置在代码 32(space 在 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
对于标准 Times-Roman/WinAnsiEncoding 字体作为字体资源 F 和上面定义的字体为字体资源G,可以这样写
BT
/F 12 Tf
15 815 Td
(Test: ) Tj
/G 12 Tf
( ) Tj
ET
进入您的内容流并获得
看PDF语法流BT ET有一些疑问,看PDF32000操作手册看不懂:
一个好的在线资源 link 也很好...
BT /F1 24 Tf ... (My String is here)Tj ET
看这段代码,
- 如何插入换行符?使用
\n\r
没有帮助 - 如何更改字体粗细 在字符串中间加粗
- 尝试了英语以外的其他语言,但无法正确使用,我怎么能使用其他语言,希伯来语、阿拉伯语、中文等...更改字体没有帮助,编码为 UTF16 也没有帮助或者,我应该编码成不同的东西并在某处设置编码吗?
- 如何将文字限制在一定宽度
- 如何设置行高属性
- 在同一行中混合使用多种字体
我知道我可以使用 PDFKit 和 PDFJS 等...但我真的很想知道 PDF 语法是如何工作的,在线 PDF32000 手册真的又长又复杂.. .
首先,迈克尔说的当然是对的
Unfortunately, if you want to understand how PDF syntax works, you'll need to read the specification. You could of course only read the part that applies to text, Chapter 9, and probably 9.2. But this chapter of course assumes that you have knowledge of how PDF works structurally and what the types of objects are. I suggest reading it.
不过,为了给您留下一些印象,这里有一些问题的答案...
换行符
How do I insert line breaks? using \n\r didn't help
通过将文本分成单独的字符串,每行一个字符串,然后分别绘制,通过重新定位当前文本位置前进到中间的下一行,从而在不同的行上绘制文本。有不同的方法可以进行这种重新定位。例如
(Line 1 text) Tj
0 -20 Td
(Line 2 Text) Tj
字体粗细
How can I change the font-weight to bold in the middle of the string
选择粗体,例如
/MyNormalFont 12 Tf
(Normal text - ) Tj
/MyBoldFont 12 Tf
(bold text) Tj
/MyNormalFont 12 Tf
( - normal text again) Tj
可以输出"Normal text - bold text - normal text again".
(也有穷人大胆的效果,比如双印小偏移的字母...)
其他语言
Tried languages other than english and couldn't get it right, how can I do other languages, hebrew, arabic, chinese, etc... changing the font didn't help, encoding to UTF16 didn't help either, should I encode to something different and set encoding somewhere?
您必须声明字体才能在内容流中使用它们。在此声明中,您特别定义了用于使用相关字体绘制的文本的编码。对于上面的示例,编码必须是 ASCII'ish,例如WinAnsiEncoding,但您会经常发现其他编码,尤其是对于非英语文本。
为此,您必须考虑类型为 Font 的 Resources。详情请参阅。规范第 9 章。
另请参阅下面 "A non-Latin character" 下的示例。
限制文本宽度
How to limit the text to a certain width
通过绘制足够少的字符。
见上文,在将字符串绘制指令放入内容流之前,您必须将其拆分成行。只需根据需要选择尽可能短的这些行。
行高
How to set line-height properties
你的意思是从一条线的底部到下一条线的底部的距离?或者你指的是字体高度?
如何选择前一个距离取决于您如何转到下一行,请参见上文 "Line breaks"。如果你像那里的例子那样这样做,你可以使用
向下移动 20 个单位到下一行0 -20 Td
你在字体选择指令中设置后一个高度,即字体高度,例如在"Font weight"上面
/MyNormalFont 12 Tf
选择 MyNormalFont,大小为 12 个单位。
关于那些 单位 :一个单位通常以 1/72 英寸开始,但通过更改转换矩阵(参见规范的第 8 节),您可以更改它。
多种字体
Mixing multiple fonts in the same line
参见上文"Font weights",不同的字体粗细是使用不同的字体实现的。
一个非拉丁字符
来自评论:
could you give an example of inserting a foreign language character other than english?
您可以选择创建一个 PDF 字体,将给定字体程序中所需的字符按名称映射到 0..255 范围内以进行单字节编码。这对于希伯来语或阿拉伯语写作来说是可以的,但对于 CJK 写作来说就不是这样了。
由于您只要求一个字符,所以我在示例中只放了一个字符...此外,我使用 Arial 并希望有问题的 PDF 查看器可以在手头的系统中找到,即我没有嵌入它。
因此,对于名为 alefmaksuraarabic 的阿拉伯字符 alef maksura 的字体,在 Adobe Glyph List 中放置在代码 32(space 在 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
对于标准 Times-Roman/WinAnsiEncoding 字体作为字体资源 F 和上面定义的字体为字体资源G,可以这样写
BT
/F 12 Tf
15 815 Td
(Test: ) Tj
/G 12 Tf
( ) Tj
ET
进入您的内容流并获得