知识管理系统Data Solution研发日记之十四 如何以编程方式处理PDF格式文档
这个系列的文章主要讲解如何处理本机文档和互联网数据。今天要讨论的主题是,如何把PDF文档格式转化为可以编辑的RTF格式。PDF格式本身是只读的,需要Acrobat Professional这样的软件来编辑它的内容,或者在WORD中编辑好后,转化为PDF格式。我要达到的目标是这样的
指定的格式选择项如果PDF被勾选,则Path路径中所有的的PDF格式的文档会被处理,之后再导入文档数据库中。
好了,为了达到这个目的,我尝试了以下几种方法
- Adobe Acrobat SDK 这是处理PDF文档的官方开发包,也应该是最权威的处理工具。好像授权费用不菲,而且也找不到免费的版本。
- PDF.NET 这个工具包相当不错,它包含了处理PDF格式的方方面面,而且提供托管代码的完整例子。试用版只能处理PDF文档的前几页,而且会加上试用的水印。
- Aspose PDF.NET , Aspone Recognition 这两个工具包也相当强大,好用。在转换PDF为DOC格式时,有些限制,毕竟不是专业的OCR工具包。当你的PDF格式中包含有中文时,它就无法处理了。官方的Known Limitations中有说明到,Predefined composite fonts encodings used for Chinese, Japanese and Korean languages are not implemented。亚洲语言文字,在安装操作系统时,这些语言包也是另外单独安装的。
- Solid Converter PDF 这个工具,在转换PDF到DOC格式方面,95%的内容都完整的保留和正确转换。可惜没有开发包,不能编程调用。
- 把PDF转化为TIFF,再运用OCR技术把TIFF格式转化为DOC格式。找到一些工具包,是OCX格式的控件,主要是不稳定,也没有提供纯.NET的包装。理论上.NET可以调用COM格式的组件包,实际上有些细节如何COM没有处理好,.NET调用也会有些问题。
- Solid PDF Tools 这个工具,也提供相当好的PDF格式转DOC格式工具。最重要的一点是,它可以接受命令行参数,这样可以被我的程序调用。
经历了层层选择的痛苦,最后选中以命令行参数方式,调用第三方工具包。这样转换后的格式效果好,也就是选择第5项的工具,Solid PDF Tools。所以,为了让你的Data Loader中的Doc Scanner能正确工作以处理PDF格式文档,请先安装这个工具,Data Loader就是以它来转换PDF格式的文件的。
请看上图,这就是它的界面效果。这个软件小巧,但是编辑PDF格式起来,丝毫不逊色于Adobe Professional。最重要的我喜欢的一点是,它支持命令行调用,可以被.NET或是任何的编程语言调用。
再来看一下,.NET的调用代码是如何写的,它的方法体如下
public static string ConvertPdfToDoc(string pdf) { string outputFolder = Path.GetDirectoryName(pdf); string outputFile = Path.Combine(Path.GetDirectoryName(pdf),
Path.GetFileNameWithoutExtension(pdf) + ".doc"); string pathWithFile = pdf.Replace(@"\", @"\\"); outputFolder = outputFolder.Replace(@"\", @"\\"); String sampleScript = @"<</FileName (" + pathWithFile + @")>> FileOpen <</WordDocumentType/Doc /OutputFolder (" + outputFolder + @") /ReconstructionMode/Flowing /LaunchViewer false>> ConvertToWord Exit"; SolidScript solidScript = new SolidScript("Solid PDF Tools");
// replace Solid PDF Tools with the product you're scripting solidScript.RunScript(sampleScript); return outputFile; }
是的,这就是Data Loader内部处理PDF文档格式的全部细节,再调用SolidScript来生成进程调用,把参数传递到Solid PDF Tools的进程中。您如果不明白上面.NET代码的含义,你可以参考下面的流程。
先打开记事本,输入如下的脚本代码,
<</FileName (G:\\TDDOWNLOAD\\solidwatcher\\bin\\Debug\\File.pdf)>> FileOpen
<</WordDocumentType/Doc /OutputFolder (G:\\Eclipse\\doc)
/ReconstructionMode/Flowing
/LaunchViewer false>> ConvertToWord
Exit
再启动运行,命令行cmd,输入如下命令
这样,你就可以到看Solid PDF Tools对传入参数的PDF格式的处理。把这个过程封装为.NET脚本代码,就是上面您看到的ConvertPdfToDoc方法。
如果你不是为了能用代码方式转化PDF为DOC,你可以尝试以下几个工具,它们都是绿色的的小软件,帮忙你把PDF格式转化为DOC。
- 4Media PDF to Word Converter
- AnyBizSoftPDFConverterPortable
- Nitro PDF
- PDF To Word RTF Converter
- SimpoPDFConverterPortable
这五个工具都非常不错。绿色,体积小。如果你需要command line调用,我推荐Solid PDF Tools。
在转换PDF为DOC格式过程中,接触到OCR技术,光学识别技术。它把PDF转化为TIFF格式,再把TIFF格式转化为DOC格式。对于OCR技术,业界最出名的莫过于ABBYY的SDK,它是目前最优秀的OCR技术的组件包之一。
来看一下,它的产品ABBYY FineReader 9,界面效果如下图
它可直接连接到硬件设备,把扫描到的内容转化为可以编辑的DOC格式。如果有精力也可以体验一下ABBYY 的SDK,提供C++和.NET平台,各种平台语言的开发包。写到这里,也开始喜欢上C++代码。在托管语言领域,有强大的Visual Studio,量身定制的C#语言和它的编译器,大量的第三方组件厂商。然而在非托管代码领域,百花齐放。没有微软的垄断性主导地位,各个软件公司才有它们的专长,籍以此生存的技术资源。所以如果你感觉你的开发工具不好用,你购买的SDK还不够友好,我觉得这就是你的机会,你以此改善和切入的机会。
请到epn.codeplex.com中下载最新版本的Data Loader程序和相关的开发文档。