在很多情况下需要把各种可视的文档如html,word等可打印的文件
转成PDF格式的文件进行保存。因为PDF的具有跨平台性,不可编辑(除用特殊的编辑器),方便加密,加水印,数字签名等特点。
目前的各种主流编程语言如java,.net等都提供了相关的api进行PDF的创建及导出,格式转换,就java语言来说有很多种如itext,yahp,pdfbox等,
但没有那一种技术或者组件能很好的针对不同原始格式的文档进行转换,同时由于在某些情况下,用户对转换后的格式有严格的要求,即转换后的PDF要与原始可视的一致,与
纸张打印的格式效果一致。同时对转换后PDF格式文件的大小方面也有一定的要求。
因此基于PDF虚拟打印机是最简单和广泛的格式转换方案
目前有很多虚拟打印机可以方便的把格式的文档转成pdf格式,如:adobe pdf printer smartprinter ccconverter等等,还包括许多在线的转换网址。
但虚拟打印机提供都是标准的打印机接口API,在转换过程中需要用户进行参与
如指定转换后pdf文件的保存路径(可以设置默认保存路径),手动输入文件名等,同时还有各种类似的虚拟打印专有的打印参数,这些虚拟打印机参数设置并没有提供编程API,smartprinter说可以提供api,但是收费的。
基于现在进行的项目"电子病历归档",下面针对java平台有如下解决方案:
通过PDFCreator(免费开源)虚拟打印机把任何可打印的文(html,dhtml,world,excel,自定义的格式等)转成PDF。
利用PDFCreator内置的保存后动作选项,执行vb script,在vb scripte中通过Microsoft Internet Transfer Control
上传文件至ftp服务器,ftp文件服务器采用apache ftpserver,在此源代码基础上进行二次开发,采用PDFBox对上传的PDF文档进行内容解析提取关键字,以此关键字对文档进行重命名,同时也可以基于lucene 建立基于内容的全文检索索引的创建。
就电子病历归档系统采用这种方案的优点:
1.数据采集不用其他厂商提供接口,做集成比较方便快捷。
2.保证采集上的PDF文档保持了原有的显示打印格式
3.在收集的同事即可建立全文检索的索引创建,不用在另外启用一个目录监视程序。
4.全部是免费开源软件,可控性强,灵活,且不花钱。
目前在电子病历归档系统中采集病历文档比较普遍的方式如下:
1.虚拟打印:
各个系统虚拟打印到某一目录,然后通过一监控程序监视此目录此情况下同步比较困难,目录监控程序的扫描间隔不好确定,由于无法获取打印机的状态,很多情况下虚拟打印机的PDF文档并未创建完成就被目录监控程序读取,造成读取的文档内容错误。
2.与其他系统做接口:
采用接口方式如(socket,或者webservice)要求其他厂商转换PDF文档并且序列此文档上传到归档系统。
缺点:此种方式要求其他厂商配合性比较高
目前医院系统中电子病历分散在不同的系统中如:PACS,LIS,CIS,EMR,AN)等系统中,各个系统架构(c/s,b/s)与开发语言具有多样性(pb,.net,java),同时文档的格式多样性(html,world,自定义模板文档格式),在各个系统内部转成PDF具有一定的困难性,同时转换后的PDF在压缩比率上也区别很大,经过对比采用虚拟打印机转换的PDF文档一般都是经过很好压缩的且显示效果无损。
综上所述在类似于电子病历归档系统这类的文档采集系统应用中,此种方式具有很大的可行性:
其最大的价值在于系统集成上面,系统集成过渡比较平坦,基本不需要修改任何系统,只要把文档打印到虚拟打印上即可(目前这些系统一般都有打印入口,以把这些文档以纸质的方式来查看保存),而不是要求其他厂商配合,利于系统的快速上线,由于全部采用开源的组件,在系统灵活性和费用方面有很大的优点。
======附注
1.PDFCreator下载地址:http://sourceforge.net/projects/pdfcreator/
2. 基于Microsoft Internet Transfer Control 的ftp vb脚本:
=============begin=========
' FTP upload script
' Part of PDFCreator
' License: GPL
' Homepage: http://www.sf.net/projects/pdfcreator
' Version: 1.1.0.0
' Date: September, 1. 2005
' Author: Frank Heind鰎fer
Option Explicit
Const AppTitle = "PDFCreator - FTPUpload"
Dim objArgs, fname, domain, user, pass, rdir
domain="127.0.0.1"
rdir="archive"
user="root"
pass="root"
Set objArgs = WScript.Arguments
If objArgs.Count = 0 Then
MsgBox "This script needs a parameter!", vbExclamation, AppTitle
WScript.Quit
End If
fname = objArgs(0)
Call FTPUpload(domain, rdir, user, pass, fname)
Private Sub FTPUpload(domain, rdir, user, pass, fname)
Dim fso, ftpo
Set fso = CreateObject("Scripting.FileSystemObject")
Set ftpo = CreateObject("InetCtls.Inet.1")
ftpo.URL = "ftp://" & domain
ftpo.UserName = user
ftpo.Password = pass
ftpo.Execute , "CD " & rdir
Do
WScript.Sleep 100
Loop while ftpo.StillExecuting
ftpo.Execute , "Put """ & fname & """ """ & fso.GetFilename(fname) & """"
Do
WScript.Sleep 100
Loop while ftpo.StillExecuting
ftpo.Execute , "Close"
End Sub
=============end=========
转成PDF格式的文件进行保存。因为PDF的具有跨平台性,不可编辑(除用特殊的编辑器),方便加密,加水印,数字签名等特点。
目前的各种主流编程语言如java,.net等都提供了相关的api进行PDF的创建及导出,格式转换,就java语言来说有很多种如itext,yahp,pdfbox等,
但没有那一种技术或者组件能很好的针对不同原始格式的文档进行转换,同时由于在某些情况下,用户对转换后的格式有严格的要求,即转换后的PDF要与原始可视的一致,与
纸张打印的格式效果一致。同时对转换后PDF格式文件的大小方面也有一定的要求。
因此基于PDF虚拟打印机是最简单和广泛的格式转换方案
目前有很多虚拟打印机可以方便的把格式的文档转成pdf格式,如:adobe pdf printer smartprinter ccconverter等等,还包括许多在线的转换网址。
但虚拟打印机提供都是标准的打印机接口API,在转换过程中需要用户进行参与
如指定转换后pdf文件的保存路径(可以设置默认保存路径),手动输入文件名等,同时还有各种类似的虚拟打印专有的打印参数,这些虚拟打印机参数设置并没有提供编程API,smartprinter说可以提供api,但是收费的。
基于现在进行的项目"电子病历归档",下面针对java平台有如下解决方案:
通过PDFCreator(免费开源)虚拟打印机把任何可打印的文(html,dhtml,world,excel,自定义的格式等)转成PDF。
利用PDFCreator内置的保存后动作选项,执行vb script,在vb scripte中通过Microsoft Internet Transfer Control
上传文件至ftp服务器,ftp文件服务器采用apache ftpserver,在此源代码基础上进行二次开发,采用PDFBox对上传的PDF文档进行内容解析提取关键字,以此关键字对文档进行重命名,同时也可以基于lucene 建立基于内容的全文检索索引的创建。
就电子病历归档系统采用这种方案的优点:
1.数据采集不用其他厂商提供接口,做集成比较方便快捷。
2.保证采集上的PDF文档保持了原有的显示打印格式
3.在收集的同事即可建立全文检索的索引创建,不用在另外启用一个目录监视程序。
4.全部是免费开源软件,可控性强,灵活,且不花钱。
目前在电子病历归档系统中采集病历文档比较普遍的方式如下:
1.虚拟打印:
各个系统虚拟打印到某一目录,然后通过一监控程序监视此目录此情况下同步比较困难,目录监控程序的扫描间隔不好确定,由于无法获取打印机的状态,很多情况下虚拟打印机的PDF文档并未创建完成就被目录监控程序读取,造成读取的文档内容错误。
2.与其他系统做接口:
采用接口方式如(socket,或者webservice)要求其他厂商转换PDF文档并且序列此文档上传到归档系统。
缺点:此种方式要求其他厂商配合性比较高
目前医院系统中电子病历分散在不同的系统中如:PACS,LIS,CIS,EMR,AN)等系统中,各个系统架构(c/s,b/s)与开发语言具有多样性(pb,.net,java),同时文档的格式多样性(html,world,自定义模板文档格式),在各个系统内部转成PDF具有一定的困难性,同时转换后的PDF在压缩比率上也区别很大,经过对比采用虚拟打印机转换的PDF文档一般都是经过很好压缩的且显示效果无损。
综上所述在类似于电子病历归档系统这类的文档采集系统应用中,此种方式具有很大的可行性:
其最大的价值在于系统集成上面,系统集成过渡比较平坦,基本不需要修改任何系统,只要把文档打印到虚拟打印上即可(目前这些系统一般都有打印入口,以把这些文档以纸质的方式来查看保存),而不是要求其他厂商配合,利于系统的快速上线,由于全部采用开源的组件,在系统灵活性和费用方面有很大的优点。
======附注
1.PDFCreator下载地址:http://sourceforge.net/projects/pdfcreator/
2. 基于Microsoft Internet Transfer Control 的ftp vb脚本:
=============begin=========
' FTP upload script
' Part of PDFCreator
' License: GPL
' Homepage: http://www.sf.net/projects/pdfcreator
' Version: 1.1.0.0
' Date: September, 1. 2005
' Author: Frank Heind鰎fer
Option Explicit
Const AppTitle = "PDFCreator - FTPUpload"
Dim objArgs, fname, domain, user, pass, rdir
domain="127.0.0.1"
rdir="archive"
user="root"
pass="root"
Set objArgs = WScript.Arguments
If objArgs.Count = 0 Then
MsgBox "This script needs a parameter!", vbExclamation, AppTitle
WScript.Quit
End If
fname = objArgs(0)
Call FTPUpload(domain, rdir, user, pass, fname)
Private Sub FTPUpload(domain, rdir, user, pass, fname)
Dim fso, ftpo
Set fso = CreateObject("Scripting.FileSystemObject")
Set ftpo = CreateObject("InetCtls.Inet.1")
ftpo.URL = "ftp://" & domain
ftpo.UserName = user
ftpo.Password = pass
ftpo.Execute , "CD " & rdir
Do
WScript.Sleep 100
Loop while ftpo.StillExecuting
ftpo.Execute , "Put """ & fname & """ """ & fso.GetFilename(fname) & """"
Do
WScript.Sleep 100
Loop while ftpo.StillExecuting
ftpo.Execute , "Close"
End Sub
=============end=========