最简单的pdf文件

本文的目的是生成最简单的pdf文件,可用来研究下pdf文件的格式。基本的思路是用postscript写一个简单的ps文件,然后利用ps2pdf将其转为pdf,此时的pdf是经过压缩的格式,直接在编辑器(比如vim或者emacs)中比较难看。需要利用pdftk来解压,变成可以直接编辑的格式。其实例文件如下所示

1 ps文件

其内容如下,文件将在坐标的(72,500)显示hello world

%!PS
/Courier 
20 selectfont 
72 500 moveto  
(Hello world!) show  
showpage

2 生成pdf文件

利用ps2pdf来将这个文件转为pdf,命令为 ps2pdf aa.ps 生成文件为aa.pdf

3 利用pdftk解压pdf

命令行如下:

pdftk aa.pdf output adoc.unc.pdf uncompress

这个命令将生成adoc.unc.pdf,这也是一个标准的pdf文件,只是它的stream数据是没有压缩的。这个文件有100多行,所以可以完全放在这里,以供参考,其内容如下:(三个问号处,有些编码无法用utf-8保存,所以换成了问号,其中第二行的内容是 \342\343\317\323 ,xpacket那行的内容为 \357\273\277

%PDF-1.4
%???
1 0 obj 
<<
/Metadata 2 0 R
/Type /Catalog
/Pages 3 0 R
>>
endobj 
3 0 obj 
<<
/Kids [4 0 R]
/Type /Pages
/Count 1
>>
endobj 
4 0 obj 
<<
/pdftk_PageNum 1
/Resources 
<<
/Font 5 0 R
/ProcSet [/PDF /Text]
/ExtGState 6 0 R
>>
/Rotate 0
/Contents 7 0 R
/Parent 3 0 R
/Type /Page
/MediaBox [0 0 595 842]
>>
endobj 
7 0 obj 
<<
/Length 106
>>
stream
q 0.1 0 0 0.1 0 0 cm
/R7 gs
0 g
q
10 0 0 10 0 0 cm BT
/R8 20 Tf
1 0 0 1 72 500 Tm
(Hello world!)Tj
ET
Q
Q

endstream 
endobj 
8 0 obj 
<<
/OPM 1
/Type /ExtGState
>>
endobj 
9 0 obj 
<<
/Subtype /Type1
/Type /Font
/BaseFont /Courier
>>
endobj 
6 0 obj 
<<
/R7 8 0 R
>>
endobj 
5 0 obj 
<<
/R8 9 0 R
>>
endobj 
2 0 obj 
<<
/Subtype /XML
/Type /Metadata
/Length 1344
>>
stream
<?xpacket begin='???' id='W5M0MpCehiHzreSzNTczkc9d'?>
<?adobe-xap-filters esc="CRLF"?>
<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 2.9.1-13, framework 1.6'>
<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
<rdf:Description rdf:about='uuid:f30af71a-a104-11f1-0000-204e07208565' xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:Producer='GPL Ghostscript 9.06'/>
<rdf:Description rdf:about='uuid:f30af71a-a104-11f1-0000-204e07208565' xmlns:xmp='http://ns.adobe.com/xap/1.0/'><xmp:ModifyDate>2016-08-23T12:16:44+08:00</xmp:ModifyDate>
<xmp:CreateDate>2016-08-23T12:16:44+08:00</xmp:CreateDate>
<xmp:CreatorTool>UnknownApplication</xmp:CreatorTool></rdf:Description>
<rdf:Description rdf:about='uuid:f30af71a-a104-11f1-0000-204e07208565' xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='uuid:f30af71a-a104-11f1-0000-204e07208565'/>
<rdf:Description rdf:about='uuid:f30af71a-a104-11f1-0000-204e07208565' xmlns:dc='http://purl.org/dc/elements/1.1/' dc:format='application/pdf'><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>Untitled</rdf:li></rdf:Alt></dc:title></rdf:Description>
</rdf:RDF>
</x:xmpmeta>


<?xpacket end='w'?>
endstream 
endobj 
10 0 obj 
<<
/ModDate (D:20160823121644+08'00')
/CreationDate (D:20160823121644+08'00')
/Producer (GPL Ghostscript 9.06)
>>
endobj xref
0 11
0000000000 65535 f 
0000000015 00000 n 
0000000669 00000 n 
0000000082 00000 n 
0000000141 00000 n 
0000000636 00000 n 
0000000603 00000 n 
0000000326 00000 n 
0000000486 00000 n 
0000000533 00000 n 
0000002098 00000 n 
trailer

<<
/Info 10 0 R
/ID [<2af497b742bcdac1a80de9115b8b2d72> <2af497b742bcdac1a80de9115b8b2d72>]
/Root 1 0 R
/Size 11
>>
startxref
2229
%%EOF


本文地址: http://www.bagualu.net/wordpress/archives/6494 转载请注明




发表评论

电子邮件地址不会被公开。 必填项已用*标注