本文转载自:
https://blog.csdn.net/u012632138/article/details/80505167
说明:
使用记事本敲入PDF关键字与指令,生成Hello World.PDF文件。是不是很熟悉,PDF也可以像C++或Java一样先来个Hello Word。
为了书写和讲解方便,本文的Hello World.PDF文件省去了交叉引用表的书写,PDF阅读器例如:Foxit Reader会重建交叉引用表,即容错处理。
目标:
能够用记事本编写一个包含“Hello World” 内容的PDF文件,使用Adobe Reader 与Foxit Reader打开都能够显示。
PDF结构图:
PDF解析流程:
a)从trailer中找到Root关键字,Root是指向Catalog字典,Catalog是一个PDF文件的总入口,它包含Page tree,Outline hierarchy等。
b)从Catalog中找到Pages关键字,Pages是PDF所有页面的总入口,即Page Tree Root。
c)从Pages中找到Kids和Count关键字,Kids中包含Page子节点,Count列出该文档的总页数。到这里我们已经知道PDF文件有多少页了。
d)从Page字典中获取MediaBox、Contents、Resources等信息,MediaBox包含页面宽高信息,Contents包含页面内容,Resources包含页面所需要的资源信息。
e)从Contents指向的内容流中获取页面内容。
简单流程
trailer→ Root→ Catalog→ Pages→ Page→ Contents
PDF基本信息:
1)% 符号表示注释
2)PDF文件区分大小写
后记:
本篇是简单的入门,主要是大家自己动手敲一个PDF文件,不能拷贝黏贴,一定要一个一个字的敲。大家在写的过程有碰到任何问题,都可留言给我。
%PDF-1.4
1 0 obj <<
/Type /Pages
/Kids [2 0 R]
/Count 1
>> endobj
2 0 obj <<
/Type /Page
/Parent 1 0 R
/MediaBox [0 0 612 792]
/Contents 4 0 R
/Resources << /Font <</Font1 5 0 R>>
>> endobj
3 0 obj <<
/Type /Catalog
/Pages 1 0 R
>> endobj
4 0 obj
<</Length 0 >> stream
BT
/Font1 10 Tf
100 700 TD
(Hello World!) Tj
ET
endstream
endobj
5 0 obj
<<
/Type /Font
/Subtype /Type1
/BaseFont /Helvetica
>>endobj
xref
trailer
<<
/Size 0
/Root 3 0 R
>>
startxref
0
%%EOF % end of file