现在的位置: 首页 > 综合 > 正文

[PDF文件全攻略]-PDF二次开发(.NET开发 C++开发 Java PHP)

2012年11月01日 ⁄ 综合 ⁄ 共 6232字 ⁄ 字号 评论关闭

原文:http://www.cankau.cn/news/tech/2009112016.html

[PDF文件全攻略]-PDF二次开发(.NET开发 C++开发 Java PHP)

2009-11-20 22:17:18 来源:参考在线

所谓PDF开发,无非就是根据PDF的文档标准,借助编程语言来创建、编辑PDF文件。这样你就可以编写一个自己用的PDF阅读器什么的,也可以将PDF文件处理功能嵌入到你的项目主程序中。当然很多时候都没有必要自己从头开始一句一句地敲代码,借助框架和开源项目通常可以很快编出一个像样的东西。

PDF标准

PDF/A – 针对长期存档的 PDF 标准

2005 年 9 月,国际标准化组织(ISO)批准了针对存档电子文档的 PDF/A 新标准。根据 ISO 19005-1 标准,PDF/A 是 PDF 的一种变型。它“提供了一种工具,使电子文件在长时间之后依然以一种保留其外观的方式重现,而不管该文件是用什么工具和系统创建、储存或制作的。
这种保留方式使 PDF 文件可自我持续。PDF/A 通过嵌入在文档自身内部显示该文档的信息(内容、颜色、字体、图像,等等),存储这种自我持续。换句话说,PDF/A 文件不要求任何附加的外部信息才能适当地显示。但是,此种格式要存储其自身的持续性,就必须排除某些在诸如电影、音响和透明纸等标准 PDF 文件中的功能。
PDF/A 文件类别分为两部分,PDF/A-1 和 PDF/A-2。第一种类别,PDF/A-1 又进一步分为两个次类,PDF/A-1a 和 PDF/A-1b。PDF/A-1a 和 PDF/A-1b 之间的主要差别在于各自处理文本提取的方式不同。
PDF/A-1a: 此级别,又叫作“遵从级别 A (Level A Conformance)完全服从 ISO 19005-1 标准。此版本包括标签,以便文本可通过包括手握设备在内的多种设备来提取和查看。
PDF/A-1b: 又叫作”遵从级别 B(Level B Conformance)。此类别可算 PDF/A 最低级别的遵从标准。此级别保证文档可在计算机屏幕上显示和查看,但是文本的合法性却没有保障。
PDF/A-2: 这是一种附加于 PDF/A 标准的较新内容,并且仍然处在“技术委员会”的规范过程中。基本上,PDF/A-2 将处理一些附加到 PDF 参考资料(如电子签名)的较新功能。
PDF/A 是一个将使商务和政府机构存储重要文件和档案发生革命性变化的新标准。目前,很多商务机构都通过保存纸张文件的方式存储文件。另一种方式则是使用微缩胶卷和微缩平片存储档案。PDF/A 设计为用一个易于更新、所搜、整理,又效益高、可传送,更好的是可长期持续的单一标准格式,取代所有那些老方式。对于您的业务,这意味着低花费,并以小体积取代在您的档案室里存储体积大的纸张文件和文件夹小体积。另外,因为这是电子格式,您可很容易地将您的存档文件储存在多个位置,使其减少遭受火灾、水灾或任何自然灾害的危险性。

针对印前数据的 PDF/X – A PDF 标准

PDF/X,与 PDF/A 一样,是 PDF 的一个子集。PDF/X 的目的在于为设计员、绘图员、工程师和图像艺术家提供一种可为任何服务提供者正确打印的电子文件格式。PDF/X 使保持完全一致性成为可能,即使文件被人们在多处位置,用不同的机器处理,也一样。 这种格式对大多数网络公司的打印就绪文件传输很理想;这里,打印就绪信息的输送者和接收者并无很强的互相关联。除了为打印任务提供坚实的传送格式之外,PDF/X 还具备其他好处,包括有一个文件查看器,更佳的压缩效果(文件大小更小),支持专色印刷色彩这种识别打印条件(比如哪个文件已就绪)的技术手段,以及更多。不过,也与
PDF/A 一样,PDF/X 的好处也伴随着一些妥协。 比如透明、加密和 JBIG2 压缩等功能在 DF/X 中就是被禁止的。
PDF/X 标准次分为三个类别:
PDF/X-1a: 此标准对于想要保持对打印任务最多控制权的文件发送者很理想。它支持盲送交换信息,并遵从世界上很多地方使用的一般要求。
PDF/X-3: PDF/X-3 和 PDF/X-1a 之间最重要的区别在于事实上 PDF/X-3 文件包含由色彩管理的数据。这意味着任何可以读取 PDF/X-3 文件的工具也均可读取 PDF/X-1a 文件。
PDF/X2: 与前述两种设计来支持盲送交换的格式不同,PDF/X2 对于交换信息是有保护的;信息输送者与接收者之间更多是对话。它是 PDF/X-3 格式的超集,而 PDF/X-3 又是 PDF/X-1a 格式的超集。
PDF/X 标准设计目的在于可在印刷业的多个部门和业务机构之间跨机构应用。如果您处正在打印就绪文件的接收端,请务必弄清楚您可接受的文件类型到底是什么(PDF/X-1a、PDF/X-3 还是 PDF/X2)。还有,只要有 PDF/X 工具的更新版本即升级到新版本很安全,因为新版本可以读取老版本文件。 大多数支持基本功能 PDF 的产品也支持 PDF/X 文件。请务必预先测试任何输入文件,弄清楚它们是否与合适的 PDF/X 版本兼容。而且,如果您是一位印刷商或者出版商,也请弄清楚您的整个工作流程均与 PDF/X
兼容。如果您正在将印刷就绪的数据传送给出版商或印刷商,请仔细考虑您对 PDF/X 子集的选项,以决定哪一个才是对您的业务最好的。最最重要的一点是,PDF/X 旨在提供一种方法,以传输完整的电子文件,并自信地知道这些文件将要顺利通过印前程序,既无错误也无需再加工。

PDF/E

PDF/E 是一种即将使用的标准,主要针对工程技术工业。 尤其是,它针对一些 PDF 技术的一些工程技术界使用的最新功能,包括对象级元数据和 3D 模型。

PDF/UA

“UA” 是“通用可访问性”(Universal Accessibility)二字的首字母缩写。此标准仍处在建设阶段,主要通过扩展“508 条”(Section 508)提供对 PDF 文件的可访问性。PDF/UA 将确保任何用户,无论是否有残疾,均可使用和访问 PDF。

PDF文件结构[下载PDF手册]

文件结构可以分为四方面:
1、首部。用文本编辑器打开的时候就可以看到:%PDF-1.4 这样的字眼,其中最后一位就是PDF文件格式版本号,软件的版本号总要比文件格式的版本号高1,比如说Read 5能打开的内容就是4。
2、文件体。里面有若干个的obj来组成,OBJ这种形式:

  30979 0 obj
  <<
  /Linearized 1
  /O 30982
  /H [ 15061 25084 ]
  /L 9379963
  /E 166967
  /N 978
  /T 8760262
  >>
  endobj

第一个数字就是这个OBJ的顺序号,是为了便于在xref中查找,后面的0是为了区分不同的OBJ,后面就是关键字obj.下面的各行就是属性,/关键字 值 的形式。
3.索引表。
用来索引各个obj在文档中的起始位置,它的形式是:

  xref
  0 211
  0000000000 65535 f
  0000000009 00000 n
  ……
  0000087999 00000 n

4、文件尾。

     trailer
  <<
  /Size 211
  /Root 2 0 R
  /Info 1 0 R
  /ID [<B29FBB52459C4623DB1A90CBFC28381E><B29FBB52459C4623DB1A90CBFC28381E>]
  >>
  startxref
  88019
  %%EOF

其中0,211分别代表这个xref的obj的起始和终止序号。其中0这个是估计是为了程序中好处理所以加了这个(个人英文水平不行,有些地方看不明白),可以不加入这个。下面的各行就代表各个obj在这个文档的起始位置,其中第一串字符(10个)代表起始位置,中间的五个字符也是为了区分用的,现在基本上全为0,后面的字母有两种f代表删除的,n代表要使用的。后面的trailer是对整个xref的摘要,说明里面有多少个OBJ,读的时候从哪个OBJ开始解析,信息节点等,ID是为了让一些文件检索工具能够唯一区分文件。

简单的pdf文件

将下面的内容保存为hello.pdf 即可

  %PDF-1.1
  1 0 obj
  <<
  /Type /Catalog
  /Pages 3 0 R
  /Outlines 2 0 R
  >>
  endobj
  2 0 obj
  <<
  /Type /Outlines
  /Count 0
  >>
  endobj
  3 0 obj
  <<
  /Type /Pages
  /Count 1
  /Kids [4 0 R]
  >>
  endobj
  4 0 obj
  <<
  /Type /Page
  /Parent 3 0 R
  /Resources << /Font << /F1 7 0 R >> /ProcSet 6 0 R
  >>
  /MediaBox [0 0 612 792]
  /Contents 5 0 R
  >>
  endobj
  5 0 obj
  << /Length 44 >>
  stream
  BT
  /F1 24 Tf
  200 400 Td (Hello World) Tj
  ET
  endstream
  endobj
  6 0 obj
  [/PDF /Text]
  endobj
  7 0 obj
  <<
  /Type /Font
  /Subtype /Type1
  /Name /F1
  /BaseFont /Helvetica
  /Encoding /MacRomanEncoding
  >>
  endobj
  xref
  0 8
  0000000000 65535 f
  0000000009 00000 n
  0000000074 00000 n
  0000000120 00000 n
  0000000179 00000 n
  0000000322 00000 n
  0000000415 00000 n
  0000000445 00000 n
  trailer
  <<
  /Size 8
  /Root 1 0 R
  >>
  startxref
  553
  %%EOF


PDF开发框架[开源项目]

.NET组件

1.iTextSharp :iTextSharp 是用来生成 PDF 文档的 C# 组件 2.PDFsharp PDFsharp is a C# library that easily creates PDF documents on the fly. The same GDI+ like drawing routines can be used to create PDF documents, draw on the screen, or send output to any printer. PDFsharp can also modify, merge, and split existing PDF files or incorporate pages from existing PDF files into new PDF documents. 3.Report.NET:Report.NET 是一个功能强大且易用的用来生成 PDF 文档的 C# 组件  

C++库

1.PoDoFo  PoDoFo 是一个用来操作 PDF 文件格式的 C++ 类库。它还包含一些小工具用来解析、修改和创建 PDF 文档。 2.Xpdf:Xpdf是一个开放源代码的PDF档案浏览器,Xpdf 可解码LZW压缩格式并阅读加密的PDF文件。 3.PDF生成工具 Poppler  Poppler 是一个用来生成 PDF 的C++类库,从xpdf 继承而来。它使用了很多先进的类库例如 freetype 和 cairois 来达到更好的输出效果,同时也提供了一组命令行工具包。 4.JagPDF:JagPDF 提供给 C/C++ 和 Python 编程语言用来生成 PDF 文档的库。 5.libHaru:开源的PDF库 6.CLibPDF:ClibPDF是C函数库,可以直接生成PDF文件, 不需要Adobe Acrobat等工具支持.

JAVA库

1.PDF操作类库 iText:iText是一个能够快速产生PDF文件的java类库。iText的java类对于那些要产生包含文本,表格,图形的只读文档是很有用的。它的类库尤其与java Servlet有很好的给合。使用iText与PDF能够使你正确的控制Servlet的输出。 2.PDFBox :非常强悍的PDF生成和解析Java类库 3.jpedal:jpedal是开源纯Java的PDF文档解析库,可以用来读取PDF文档中的文字、图形。 4.JasperReports:JasperReports是一个基于Java的开源报表工具,它可以在Java环境下像其它IDE报表工具一样来制作报表。JasperReports 支持PDF、HTML、XLS、CSV和XML文件输出格式。JasperReports是当前Java开发者最常用的报表工具。 5.Fourfive :Fourfive是一个领先的开源Web报表解决方案,使用XML作为它的配置文件。支持集群、负载平衡、动态发布、PDF, Excel, LDAP,图表、过滤器、排序、布局定制、门户、JasperReports、Velocity模板、兼容Internet Explorer, Netscape, Mozilla, Opera。 6.FOP:FOP是由James Tauber发起的一个开源项目,原先的版本是利用xsl-fo将xml文件转换成pdf文件。但最新的版本它可以将xml文件转换成pdf,mif,pcl,txt等多种格式以及直接输出到打印机,并且支持使用SVG描述图形。 7.JFreeReport :JFreeReport是一个用来生成报表的Java类库。它为Java应用程序提供一个灵活的打印功能并支持输出到打印机和PDF, Excel, HTML和XHTML, PlainText, XML和CSV文件中。 8.YaHP:YaHP是一个能够把html文档转换成pdf文档的Java开源包。 9.PDFjet PDFjet是一个用于动态生成PDF文档的Java类库。支持绘制点、线、方框、圆、贝塞尔曲线(Bezier Curves) 、多边形、星形、复杂路径和形状。支持unicode,文本间距调整,嵌入超链接等。它同时有Java和.NET两个版本。 10.vPDF:一个将RTF文档转成PDF文档的工具

PHP

1.Php Pdf Factory :一个PHP的PDF操作库。 2.TCPDF:TCPDF是一个用于快速生成PDF文件的PHP5函数包。TCPDF基于FPDF进行扩展和改进。支持UTF-8,Unicode,HTML和XHTML。 3.HTML2PDF:HTML2PDF能够把一个HTML文本转换成一个打印机友好的PDF文件。这个PHP脚本构建在FPDFPHP脚本之上。 4.cPdfWriter:cPdfWriter是一个能够输出PDF文档的PHP5 class。基于TCPDF,FPDF和其它相关脚本。 5.FPDF: FPDF这个PHP Class允许你采用纯PHP(更确切地说就是不需要使用PDFlib)来生成PDF文件。它所具有的特点包括:可选择的unit大小,页面格式和页边 距;页眉和页脚管理;自动分页;自动换行与文本自动对齐;支持JPEG与PNG图片格式;支持着色和文件超链接;支持TrueType,Type1与 encoding;支持页面压缩。

Python和Ruby

1.Prawn:用Ruby生成PDF更简捷 2.ReportLab:Reportlab是用python开发的生成pdf的工具包,它是一个开源软件。

关键词:开发C++全攻略

抱歉!评论已关闭.