思路初探:采用c#实现pdf转ofd

前言   版式文档格式是版面呈现效果固定的电子文档格式, pdf和ofd均为板式文档格式标准;pdf板式文件占有绝对的统治地位;ofd是我国自主研发的板式文档规范,属于后起之秀。同为板式文件, 理论上可以实现互转而又能达到呈现格式完全一致。

  ofd标准晚于pdf标准将近20年,ofd标准采用吸纳了软件行业近年来的一些先进技术和通用做法;ofd和pdf虽均为板式文件,但是两个标准对板式文件的描述差别还是非常大的。市面上的板式文件大部分为pdf,如果能实现pdf转ofd,就解决了ofd的来源问题,可以促进ofd更快的普及。

   作者研究ofd和pdf多年,采用c#实现了pdf转ofd,并将此功能集成到阅读器;阅读器打开pdf文件时,是将pdf转换为ofd后再显示的。完全实现pdf到ofd的转换需要大量的工作,作者会逐步完善。对于wps生成的pdf的文件,大部分是可以转换成功的。ofd阅读器下载(集成pdf与ofd互转)(百度网盘提取密码:jj9v)。

pdf转ofd初步思路

  板式文件描述的内基本分为三大类:文字、线、图,称之为图元。绘制图元时,还需要确定图元所处的“环境”,如:前景色、背景色、剪切区域、坐标系等;称之为状态。最终的呈现效果由图元和状态决定的。

 

   ofd与pdf描述这些元素的词是完全不同的,但是有相同的“意境”。将pdf转换为ofd的前提是充分理解pdf和ofd标准,找准两个标准相通的“意境”;转换就是意境的转换,而不是词汇的转换。下面逐步分析两个标准之间的差异。

pdf与ofd文档描述差异

  pdf属于单体文件,ofd属于容器文件;暨ofd是压缩包,压缩包包含多个文件。pdf文件分为很多块,每个块称之为object,有唯一id对应。每个块分为header和body,header描述格式为dictionary。pdf文件的结构需要通过专用软件才能查看,这一点不如ofd。pdf文件内容查看器。

 

   ofd容器内主要包括资源文件和格式描述文件。资源文件可以是任意文件,如:图片、字体、签章数据等;文件之间互不影响,可以方便的添加删除文件。格式文件是描述呈现格式的文件,为xml格式;采用xml格式的好处是:xml是标准格式、解析xml有现成的库;xml的描述能力也比pdf的文本描述能力更好。

  对于状态的描述,ofd和pdf采用了两种不同的方式。pdf对状态的描述是分散的,确定当前状态的属性需要追溯到文档开始。ofd对状态的描述是自包含的,仅仅通过当前xml节点就能确定状态属性。从上可以看出,分析pdf的状态难度更大,但是pdf这种描述方式更能节省空间,特别是描述非常复杂的状态时。

 文字描述差异

  pdf对文字的描述比ofd要复杂很多;pdf标准诞生时,还没有unicode概念,最初pdf只是用来显示拉丁文字。为了显示东亚文件,pdf标准只能另辟蹊径,采用了cid格式字体文件。ofd对字体描述统一采用unicode,达到了化繁为简的效果。

图片描述差异

  pdf图片处理部分比ofd复杂很多。pdf中的图片不是一个直接的“图”,它会描述图的压缩格式、像素颜色个数、调色板等信息,需要软件合成图片文件;而ofd文件是直接存入一个图片文件。

线描述差异

  这两部分差异不大,线处理是相对来说简单些。ofd有一个特殊的操作符A,用来表示圆弧。

c# 实现pdf转ofd步骤

1)pdf文件读取

  可以借助开源库处理pdf,比如:itext,apose,pdfbox等。pdf文件的结构还是比较复杂的,实现文件的读取逻辑也是非常复杂。

2)pdf指令的分割

每个pdf的指令包括操作数和操作符。这些数据是混合到一块的,需要快速高效的找到每个完整的指令。

下图恰好是每行一个指令。

 

 3)pdf指令的处理

  这里是pdf处理最复杂部分。pdf指令归为十几大类。从作用上来讲可以分为两类:状态指令、操作指令。状态指令是修改pdf状态属性的,操作指令是执行具体操作,如:显示文字、划线等。

4) pdf转ofd

  理解pdf的处理指令就是掌握了“语义”,这是将pdf翻译成ofd必要条件。将语义用xml语法表示出来就是水到渠成的事。

后记 要完成pdf转ofd的功能,需要同时理解pdf和ofd标准。只要准确把握了这两种标准的内涵,就能实现pdf转ofd而又能确保不失真。

  在板式文件领域,pdf仍然是主流;但是ofd具有后发优势。pdf标准文档达1300多页,还有大量的附加协议,完全掌握pdf标准需要假以时日。pdf标准出现的较早,所以背负了沉重的历史包袱;标准中的部分内容在今天看来是过时、冗余的。

  pdf已成为事实上的国际标准,流式文档软件(wps等)或其他编辑设计软件大都有转换pdf功能。ofd的普及需要各方面的共同努力, 让用户快捷方便的生成ofd文件是其中重要的一环。毕竟,无源之水无法汇集成浩瀚海洋。作者用c#尝试实现了pdf转ofd功能,达到了初步可用状况。实现pdf完美转换为ofd及ofd在国内普及是作者的梦想;前途漫漫,唯有奋斗。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Java PDFOFD是指使用Java编程语言将PDF文件换为OFD(Open Financial Data)文件的过程。OFD是一种开放的电子文档格式,用于存储和传输电子文档,具有高度的可扩展性和可靠性。 要实现Java PDFOFD,可以使用一些开源的Java库或框架,如Apache PDFBox、iText等。这些库提供了丰富的API和功能,可以读取和处理PDF文件,并将其换为OFD格式。 以下是一个简单的示例代码,演示如何使用Apache PDFBox将PDF文件换为OFD文件: ```java import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.rendering.PDFRenderer; import org.apache.ofbiz.pdfbox.util.PDFToOFDConverter; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; public class PdfToOfdConverter { public static void main(String[] args) { try { // 加载PDF文件 PDDocument document = PDDocument.load(new File("input.pdf")); // 创建OFD换器 PDFToOFDConverter converter = new PDFToOFDConverter(); // 遍历PDF页面并换为OFD页面 for (int i = 0; i < document.getNumberOfPages(); i++) { // 渲染PDF页面为图像 PDFRenderer renderer = new PDFRenderer(document); BufferedImage image = renderer.renderImageWithDPI(i, 300); // 将图像添加到OFD换器 converter.addImage(image); } // 保存OFD文件 converter.save(new File("output.ofd")); // 关闭PDF文档 document.close(); System.out.println("PDFOFD成功!"); } catch (IOException e) { e.printStackTrace(); } } } ``` 请注意,这只是一个简单的示例代码,实际的换过程可能需要更多的处理和配置。你可以根据自己的需求和具体的PDF文件结构进行适当的调整和扩展。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值