PDF 低级:文本渲染
PDF Low-Level: Text Rendering
我正在尝试在 PDF 中呈现文本。我可以渲染基于矢量图的图形,但我也想用文字来表示它。
在下面提供的测试代码中,文件(保存为.pdf时)将通过矢量图形绘制在左上角显示'Test'。
我想使用以下基于 text 的命令编写 'Test'
BT
/F5 16 Tf
100 100 Td
(Test) Tj
ET
或
BT
9.6 0 0 9.6 200 200 Tm
/f-0-0 1 Tf
[<0001>169<000200030004>]TJ
ET
但是,似乎都没有生成所需的文本。我需要用 Tf
命令做一些额外的事情吗?我应该把它包含在我的 .pdf 源文件中的什么地方?
您可以使用此 pastebin 源下载文件(将扩展名修改为 .pdf):
%PDF-1.7
%¿÷¢þ
%QDF-1.0
%% Original object ID: 6 0
1 0 obj
<<
/Pages 3 0 R
/Type /Catalog
>>
endobj
%% Original object ID: 5 0
2 0 obj
<<
/Author (None)
/CreationDate (D:20150109100433)
/Creator (None)
/Keywords (None)
/ModDate (D:20150109100433)
/Producer (None)
/Subject (None)
/Title (test.pdf)
>>
endobj
%% Original object ID: 1 0
3 0 obj
<<
/Count 1
/Kids [
4 0 R
]
/Type /Pages
>>
endobj
%% Page 1
%% Original object ID: 3 0
4 0 obj
<<
/Annots [
]
/Contents 5 0 R
/MediaBox [
0
0
612
792
]
/Parent 3 0 R
/Resources 7 0 R
/Type /Page
>>
endobj
%% Contents for page 1
%% Original object ID: 4 0
5 0 obj
<<
/Length 6 0 R
>>
stream
BT
/F5 16 Tf
100 100 Td
(Test 1) Tj
ET
BT
9.6 0 0 9.6 200 200 Tm
/f-0-0 1 Tf
[<0001>169<000200030004>]TJ
ET
1 0 0 -1 0 792 cm
0.45 0 0 0.45 0 0 cm
1 0 0 1 0 0 cm
0 0 m 1360 0 l 1360 1760 l 0 1760 l h
q
1 1 1 rg f
Q
q
1 0 0 1 0 0 cm
q
q
q
q
q
1 0 0 1 96 113.6 cm
0.05 0 0 0.05 0 0 cm
1 0 0 1 0 -792 cm
q
1 0 0 1 0 0 cm
1 0 0 1 0 792 cm
1 0 0 1 0 0 cm
q
127 -220 m 127 0 l 93 0 l 93 -220 l 8 -220 l 8 -248 l 212 -248 l 212 -220 l 127 -220 l
q
0 0 0 rg f
Q
Q
Q
q
1 0 0 1 179 0 cm
1 0 0 1 0 792 cm
1 0 0 1 0 0 cm
q
100 -194 m 163 -194 186 -152 184 -88 c 49 -88 l 49 -48 63 -21 102 -20 c 128 -19 145 -32 151 -49 c 179 -41 l 168 -13 142 4 102 4 c 44 4 14 -33 15 -96 c 16 -157 41 -194 100 -194 c h 152 -113 m 158 -173 76 -190 55 -141 c 52 -134 49 -124 49 -113 c 152 -113 l
q
0 0 0 rg f
Q
Q
Q
q
1 0 0 1 379 0 cm
1 0 0 1 0 792 cm
1 0 0 1 0 0 cm
q
135 -143 m 132 -177 49 -181 48 -143 c 63 -90 163 -131 167 -53 c 171 25 17 21 10 -45 c 38 -50 l 42 -14 135 -5 136 -50 c 126 -106 23 -65 18 -140 c 14 -197 100 -203 140 -182 c 152 -175 161 -163 164 -147 c
q
0 0 0 rg f
Q
Q
Q
q
1 0 0 1 559 0 cm
1 0 0 1 0 792 cm
1 0 0 1 0 0 cm
q
59 -47 m 57 -23 77 -18 97 -25 c 97 -1 l 64 9 27 4 27 -40 c 27 -167 l 5 -167 l 5 -190 l 29 -190 l 38 -233 l 59 -233 l 59 -190 l 94 -190 l 94 -167 l 59 -167 l 59 -47 l
q
0 0 0 rg f
Q
Q
Q
q
1 0 0 1 659 0 cm
1 0 0 1 0 792 cm
1 0 0 1 0 0 cm
q
q
0 0 0 rg f
Q
Q
Q
Q
Q
endstream
endobj
6 0 obj
1772
endobj
%% Original object ID: 2 0
7 0 obj
<<
/ExtGState <<
>>
/Font <<
>>
/ProcSet [
/PDF
/Text
/ImageB
/ImageC
/ImageI
]
/Shading <<
>>
/XObject <<
>>
>>
endobj
xref
0 8
0000000000 65535 f
0000000052 00000 n
0000000133 00000 n
0000000391 00000 n
0000000500 00000 n
0000000701 00000 n
0000002528 00000 n
0000002576 00000 n
trailer <<
/Info 2 0 R
/Root 1 0 R
/Size 8
/ID [<78c80e1b6299c4ee49d43acfeb2655cf><78c80e1b6299c4ee49d43acfeb2655cf>]
>>
startxref
2745
%%EOF
尽管添加了文本命令,但我仍然只能看到矢量绘图。 http://i.stack.imgur.com/BMvhK.png
您的 PDF 文件不包含与名称 /F5
和 /f-0-0
关联的实际字体对象,因此没有显示文本的字体。页面 /Resources
中的 /Font
词典为空。
在这种情况下,一些 PDF 查看器会使用默认字体来显示文本,而另一些则不会显示任何内容。
正如@MihaiIancu 在他的回答中已经指出的那样(您应该赞成 以及接受!),您的代码PDF 文件使用 /F5
和 /f-0-0
作为字体资源,但该文件没有任何地方定义这些资源的确切含义。
这是我的 "repaired" PDF 源代码,源自您的 Pastebin。它应该使用 2 种不同的字体(未嵌入)提供正确的 "minimally viable example" PDF,并且不提供(可选)/Info
字典:
%PDF-1.7
1 0 obj
<<
/Pages 3 0 R
/Type /Catalog
>>
endobj
2 0 obj
<<
/BaseFont /Helvetica
/Subtype /Type1
/Type /Font
>>
endobj
3 0 obj
<<
/Count 1
/Kids [ 4 0 R ]
/Type /Pages
>>
endobj
4 0 obj
<<
/Contents 5 0 R
/MediaBox [ 0 0 612 792 ]
/Parent 3 0 R
/Resources 7 0 R
/Type /Page
>>
endobj
5 0 obj
<<
/Length 6 0 R
>>
stream
BT
/F5 16 Tf
100 100 Td
(Test) Tj
ET
BT
9.6 0 0 9.6 200 200 Tm
/f-0-0 10 Tf
[<0054>169<006500730074>]TJ
ET
endstream
endobj
6 0 obj
108
endobj
7 0 obj
<<
/Font 8 0 R
>>
endobj
8 0 obj
<<
/F5 2 0 R
/f-0-0 9 0 R
>>
endobj
9 0 obj
<<
/BaseFont /Helvetica-Bold
/Subtype /Type1
/Type /Font
>>
endobj
xref
0 10
0000000000 65535 f
0000000010 00000 n
0000000071 00000 n
0000000153 00000 n
0000000230 00000 n
0000000364 00000 n
0000000533 00000 n
0000000554 00000 n
0000000594 00000 n
0000000652 00000 n
trailer <<
/Root 1 0 R
/Size 10
/ID [<78c80e1b6299c4ee49d43acfeb2655cf><78c80e1b6299c4ee49d43acfeb2655cf>]
>>
startxref
739
%%EOF
这是它的另一个版本:去除了大部分换行符和空格,与第一个版本同样有效,但可读性较差且更短。
%PDF-1.7
1 0 obj
<</Pages 3 0 R/Type/Catalog>>
endobj
2 0 obj
<</BaseFont/Helvetica/Subtype/Type1/Type/Font>>
endobj
3 0 obj
<</Count 1/Kids[ 4 0 R ]/Type/Pages>>
endobj
4 0 obj
<</Contents 5 0 R/MediaBox[0 0 612 792]/Parent 3 0 R/Resources 7 0 R/Type/Page>>
endobj
5 0 obj
<</Length 6 0 R>>
stream
BT
/F5 16 Tf 100 100 Td(Test)Tj
ET
BT
9.6 0 0 9.6 200 200 Tm/f-0-0 10 Tf[<0054>169<006500730074>]TJ
ET
endstream
endobj
6 0 obj
103
endobj
7 0 obj
<</Font 8 0 R>>
endobj
8 0 obj
<</F5 2 0 R/f-0-0 9 0 R>>
endobj
9 0 obj
<</BaseFont/Helvetica-Bold/Subtype/Type1/Type/Font>>
endobj
xref
0 10
0000000000 65535 f
0000000010 00000 n
0000000056 00000 n
0000000120 00000 n
0000000174 00000 n
0000000271 00000 n
0000000425 00000 n
0000000445 00000 n
0000000477 00000 n
0000000519 00000 n
trailer <<
/Root 1 0 R
/Size 10
/ID [<78c80e1b6299c4ee49d43acfeb2655cf><78c80e1b6299c4ee49d43acfeb2655cf>]
>>
startxref
588
%%EOF
我正在尝试在 PDF 中呈现文本。我可以渲染基于矢量图的图形,但我也想用文字来表示它。
在下面提供的测试代码中,文件(保存为.pdf时)将通过矢量图形绘制在左上角显示'Test'。
我想使用以下基于 text 的命令编写 'Test'
BT
/F5 16 Tf
100 100 Td
(Test) Tj
ET
或
BT
9.6 0 0 9.6 200 200 Tm
/f-0-0 1 Tf
[<0001>169<000200030004>]TJ
ET
但是,似乎都没有生成所需的文本。我需要用 Tf
命令做一些额外的事情吗?我应该把它包含在我的 .pdf 源文件中的什么地方?
您可以使用此 pastebin 源下载文件(将扩展名修改为 .pdf):
%PDF-1.7
%¿÷¢þ
%QDF-1.0
%% Original object ID: 6 0
1 0 obj
<<
/Pages 3 0 R
/Type /Catalog
>>
endobj
%% Original object ID: 5 0
2 0 obj
<<
/Author (None)
/CreationDate (D:20150109100433)
/Creator (None)
/Keywords (None)
/ModDate (D:20150109100433)
/Producer (None)
/Subject (None)
/Title (test.pdf)
>>
endobj
%% Original object ID: 1 0
3 0 obj
<<
/Count 1
/Kids [
4 0 R
]
/Type /Pages
>>
endobj
%% Page 1
%% Original object ID: 3 0
4 0 obj
<<
/Annots [
]
/Contents 5 0 R
/MediaBox [
0
0
612
792
]
/Parent 3 0 R
/Resources 7 0 R
/Type /Page
>>
endobj
%% Contents for page 1
%% Original object ID: 4 0
5 0 obj
<<
/Length 6 0 R
>>
stream
BT
/F5 16 Tf
100 100 Td
(Test 1) Tj
ET
BT
9.6 0 0 9.6 200 200 Tm
/f-0-0 1 Tf
[<0001>169<000200030004>]TJ
ET
1 0 0 -1 0 792 cm
0.45 0 0 0.45 0 0 cm
1 0 0 1 0 0 cm
0 0 m 1360 0 l 1360 1760 l 0 1760 l h
q
1 1 1 rg f
Q
q
1 0 0 1 0 0 cm
q
q
q
q
q
1 0 0 1 96 113.6 cm
0.05 0 0 0.05 0 0 cm
1 0 0 1 0 -792 cm
q
1 0 0 1 0 0 cm
1 0 0 1 0 792 cm
1 0 0 1 0 0 cm
q
127 -220 m 127 0 l 93 0 l 93 -220 l 8 -220 l 8 -248 l 212 -248 l 212 -220 l 127 -220 l
q
0 0 0 rg f
Q
Q
Q
q
1 0 0 1 179 0 cm
1 0 0 1 0 792 cm
1 0 0 1 0 0 cm
q
100 -194 m 163 -194 186 -152 184 -88 c 49 -88 l 49 -48 63 -21 102 -20 c 128 -19 145 -32 151 -49 c 179 -41 l 168 -13 142 4 102 4 c 44 4 14 -33 15 -96 c 16 -157 41 -194 100 -194 c h 152 -113 m 158 -173 76 -190 55 -141 c 52 -134 49 -124 49 -113 c 152 -113 l
q
0 0 0 rg f
Q
Q
Q
q
1 0 0 1 379 0 cm
1 0 0 1 0 792 cm
1 0 0 1 0 0 cm
q
135 -143 m 132 -177 49 -181 48 -143 c 63 -90 163 -131 167 -53 c 171 25 17 21 10 -45 c 38 -50 l 42 -14 135 -5 136 -50 c 126 -106 23 -65 18 -140 c 14 -197 100 -203 140 -182 c 152 -175 161 -163 164 -147 c
q
0 0 0 rg f
Q
Q
Q
q
1 0 0 1 559 0 cm
1 0 0 1 0 792 cm
1 0 0 1 0 0 cm
q
59 -47 m 57 -23 77 -18 97 -25 c 97 -1 l 64 9 27 4 27 -40 c 27 -167 l 5 -167 l 5 -190 l 29 -190 l 38 -233 l 59 -233 l 59 -190 l 94 -190 l 94 -167 l 59 -167 l 59 -47 l
q
0 0 0 rg f
Q
Q
Q
q
1 0 0 1 659 0 cm
1 0 0 1 0 792 cm
1 0 0 1 0 0 cm
q
q
0 0 0 rg f
Q
Q
Q
Q
Q
endstream
endobj
6 0 obj
1772
endobj
%% Original object ID: 2 0
7 0 obj
<<
/ExtGState <<
>>
/Font <<
>>
/ProcSet [
/PDF
/Text
/ImageB
/ImageC
/ImageI
]
/Shading <<
>>
/XObject <<
>>
>>
endobj
xref
0 8
0000000000 65535 f
0000000052 00000 n
0000000133 00000 n
0000000391 00000 n
0000000500 00000 n
0000000701 00000 n
0000002528 00000 n
0000002576 00000 n
trailer <<
/Info 2 0 R
/Root 1 0 R
/Size 8
/ID [<78c80e1b6299c4ee49d43acfeb2655cf><78c80e1b6299c4ee49d43acfeb2655cf>]
>>
startxref
2745
%%EOF
尽管添加了文本命令,但我仍然只能看到矢量绘图。 http://i.stack.imgur.com/BMvhK.png
您的 PDF 文件不包含与名称 /F5
和 /f-0-0
关联的实际字体对象,因此没有显示文本的字体。页面 /Resources
中的 /Font
词典为空。
在这种情况下,一些 PDF 查看器会使用默认字体来显示文本,而另一些则不会显示任何内容。
正如@MihaiIancu 在他的回答中已经指出的那样(您应该赞成 以及接受!),您的代码PDF 文件使用 /F5
和 /f-0-0
作为字体资源,但该文件没有任何地方定义这些资源的确切含义。
这是我的 "repaired" PDF 源代码,源自您的 Pastebin。它应该使用 2 种不同的字体(未嵌入)提供正确的 "minimally viable example" PDF,并且不提供(可选)/Info
字典:
%PDF-1.7
1 0 obj
<<
/Pages 3 0 R
/Type /Catalog
>>
endobj
2 0 obj
<<
/BaseFont /Helvetica
/Subtype /Type1
/Type /Font
>>
endobj
3 0 obj
<<
/Count 1
/Kids [ 4 0 R ]
/Type /Pages
>>
endobj
4 0 obj
<<
/Contents 5 0 R
/MediaBox [ 0 0 612 792 ]
/Parent 3 0 R
/Resources 7 0 R
/Type /Page
>>
endobj
5 0 obj
<<
/Length 6 0 R
>>
stream
BT
/F5 16 Tf
100 100 Td
(Test) Tj
ET
BT
9.6 0 0 9.6 200 200 Tm
/f-0-0 10 Tf
[<0054>169<006500730074>]TJ
ET
endstream
endobj
6 0 obj
108
endobj
7 0 obj
<<
/Font 8 0 R
>>
endobj
8 0 obj
<<
/F5 2 0 R
/f-0-0 9 0 R
>>
endobj
9 0 obj
<<
/BaseFont /Helvetica-Bold
/Subtype /Type1
/Type /Font
>>
endobj
xref
0 10
0000000000 65535 f
0000000010 00000 n
0000000071 00000 n
0000000153 00000 n
0000000230 00000 n
0000000364 00000 n
0000000533 00000 n
0000000554 00000 n
0000000594 00000 n
0000000652 00000 n
trailer <<
/Root 1 0 R
/Size 10
/ID [<78c80e1b6299c4ee49d43acfeb2655cf><78c80e1b6299c4ee49d43acfeb2655cf>]
>>
startxref
739
%%EOF
这是它的另一个版本:去除了大部分换行符和空格,与第一个版本同样有效,但可读性较差且更短。
%PDF-1.7
1 0 obj
<</Pages 3 0 R/Type/Catalog>>
endobj
2 0 obj
<</BaseFont/Helvetica/Subtype/Type1/Type/Font>>
endobj
3 0 obj
<</Count 1/Kids[ 4 0 R ]/Type/Pages>>
endobj
4 0 obj
<</Contents 5 0 R/MediaBox[0 0 612 792]/Parent 3 0 R/Resources 7 0 R/Type/Page>>
endobj
5 0 obj
<</Length 6 0 R>>
stream
BT
/F5 16 Tf 100 100 Td(Test)Tj
ET
BT
9.6 0 0 9.6 200 200 Tm/f-0-0 10 Tf[<0054>169<006500730074>]TJ
ET
endstream
endobj
6 0 obj
103
endobj
7 0 obj
<</Font 8 0 R>>
endobj
8 0 obj
<</F5 2 0 R/f-0-0 9 0 R>>
endobj
9 0 obj
<</BaseFont/Helvetica-Bold/Subtype/Type1/Type/Font>>
endobj
xref
0 10
0000000000 65535 f
0000000010 00000 n
0000000056 00000 n
0000000120 00000 n
0000000174 00000 n
0000000271 00000 n
0000000425 00000 n
0000000445 00000 n
0000000477 00000 n
0000000519 00000 n
trailer <<
/Root 1 0 R
/Size 10
/ID [<78c80e1b6299c4ee49d43acfeb2655cf><78c80e1b6299c4ee49d43acfeb2655cf>]
>>
startxref
588
%%EOF