|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
net程序员的大部门代码都靠控件拖拽完成的,虽然java也有,但是无论从美观和速度上都没发和.net比。java程序员都是代码完成的,所以java程序员常戏称.net程序员是操作员,呵呵。择要 自从Adobe公司1993年第一次公布大众PDF参考以来,撑持各类言语战争台的PDF工具和类库就如雨后春笋般出现。但是,Java使用开辟中Adobe手艺的撑持绝对滞后了。 自从Adobe公司1993年第一次公布大众PDF参考以来,撑持各类言语战争台的PDF工具和类库就如雨后春笋般出现。但是,Java使用开辟中Adobe手艺的撑持绝对滞后了。这是个奇异的征象,由于PDF文档是企业信息体系存储和互换信息的局势所趋,而Java手艺出格合适这类使用。但是,Java开辟职员仿佛直到比来才取得成熟可用的PDF撑持。 PDFBox(一个BSD允许下的源码开放项目)是一个为开辟职员读取和创立PDF文档而筹办的纯Java类库。它供应以下特征:提取文本,包含Unicode字符。和JakartaLucene等文本搜刮引擎的整合历程非常复杂。加密/解密PDF文档。从PDF和XFDF格局中导进或导出表双数据。向已有PDF文档中追加内容。将一个PDF文档切分为多个文档。掩盖PDF文档。 PDFBoxAPI PDFBox计划时接纳面向对象的体例来形貌PDF文档。PDF文档的数据是一系列基础对象的汇合:数组,布尔型,字典,数字,字符串和二进制流。PDFBox在org.pdfbox.cos包(COS模子)中界说这些基础对象范例。你可使用这些对象与PDF文档举行任何交互,但你应当先对PDF文档外部布局和高层观点作一些深切的懂得。比方,页面和字体都是带有特别属性的字典对象;PDF参考手册供应这些特别属性的寄义和范例的申明,但这是一个单调的文档查阅历程。 因而,org.pdfbox.pdfmodel包(PD模子)应运而生,它的基本是COS模子,但供应了以一种熟习的体例会见PDF文档对象的高层API。对底层COS模子举行了封装的PDPage和PDFont等类就在这个包中。 注重,固然PD模子供应了一些优异的功效,但它仍然是一个开辟中的模子。在有些实例中,你大概必要借助于COS模子才干会见PDF的特定功效性。一切的PD模子对象都供应前往响应的COS模子对象的办法。以是,在一样平常情形下,你城市利用PD模子,但PD模子力所不及时你能够间接操纵底层的COS模子。 上文对PDFBox作了大致上的先容,如今是举一些例子的时分了。我们从怎样读已存在的PDF文档入手下手:PDDocumentdocument=PDDocument.load("./test.pdf"); 下面的语句剖析指定的PDF文件并在内存中创立其文档对象。思索各处理年夜文档时的效力成绩,PDFBox只在内存中存储文档布局,图象、内嵌字体和页面内容等对象将被缓存在一个一时文件中。 注重:PDDocument对象利用终了时必要挪用其close()办法来开释创立时利用的资本。 文本提取和Lucene整合 这是一个信息展示时期(aninformationretrievalage),不论信息寄存在哪一种媒体中,使用程序都应当撑持检索和索引。对信息举行构造和分类从而构成可检索的格局是很关头的。这关于文本文档和HTML文档来讲是很复杂的,但PDF文档包括大批的布局和元信息,提取文档内容决不是一件复杂的事变。PDF言语和Postscript类似,两者中的对象都是作为矢量绘制在页面的某些地位。比方:/Helv12Tf013.0847Td(HelloWorld)Tj 下面的指令将字体设为12号的Helvetica,移到下一行然后打印“HelloWorld”。这些命令流畅常是经由紧缩的,笔墨在屏幕上的显现按次其实不必定是文件中的字符呈现按次。因而,你偶然没法间接从原始PDF文档中提取字符串。但是,PDFBox成熟的文本提取算法使得开辟职员能够提取文档内容,就像在浏览器中出现的那样。 Lucene是ApacheJakarta项目标子项目,它是一个盛行的源代码开放的搜刮引擎库。开辟职员可使用Lucene来创立索引,并基于该索引对大批的文本内容举行庞大的检索。Lucene只撑持文本内容的检索,以是开辟职员必要将其他情势的数据转换为文本情势才干利用Lucene。比方,MicrosoftWord和StarOffice文档都必需先转换为文本情势才干增加到Lucene索引中。 PDF文件也不破例,但PDFBox供应一个特别的整合对象,这让在Lucene索引中包括PDF文档变得十分简单。将一个基础PDF文档转换为Lucene文档只必要一条语句:Documentdoc=LucenePDFDocument.getDocument(file); 这条语句剖析指定的PDF文档,提取其内容并创立一个Lucene文档对象。然后你就能够将该对象增加到Lucene索引中了。如上文所述,PDF文档中也包括作者信息和关头词等元数据,在索引PDF文档时对这些元数据举行跟踪时很主要的。表1列出了创立Lucene文档时PDFBox将填写(populate)的字段。 这类整合使得开辟职员能够轻松地利用Lucene来撑持PDF文档的检索和索引。固然,有些使用程序请求更成熟的文本提取办法。此时能够间接利用PDFTextStripper类,或承继该类来满意这类庞大的需求。 经由过程承继PDFTextStripper并掩盖showCharacter()办法,你能够从很多方面临文本提取举行把持。比方,利用x、y地位信息举行限定以提取特定文本块。你能够无效地疏忽一切的y坐标年夜于某个值的文本,如许文档头部内容就会被扫除。 另外一个例子。经常有这类情形:从表单创立了一组PDF文档,但这些原始数据被丧失了。也就是说,这些文档都包括一些你感乐趣的文本,并且这些文本都在类似的地位上,但添补文档的表双数据丧失了。比方,你有一些信封,在不异的地位上都着名字和地点信息。这时候,你就能够利用PDFTextStripper的派生类来提取希冀的字段,这个类就像一种截取屏幕地区的设备。 加密/解密 PDF的一个盛行特征是同意对文档内容举行加密、对会见举行把持,限定只能浏览未加密文档。PDF文档加密时接纳一个主暗码和一个可选的用户暗码。假如设定了用户暗码,那末PDF浏览器(如Acrobat)将在显现文档之条件示输出暗码。而主暗码则用于受权修正文档内容。 PDF标准同意PDF文档的创立者对用户利用Acrobat浏览器检察文档时的某些操纵举行限定。这些限定包含:打印修正内容提取内容 PDF文档平安的会商不在本文范围以内,有乐趣的读者能够参考PDF标准的相干部分。PDF文档的平安模子是可插拔式的(pluggable),你能够在加密文档时利用分歧的平安处置器(securityhandler)。对本文而言,PDFBox撑持尺度的平安处置器,它是年夜多半PDF文档所利用的。 加密文档时必需先指定一个平安处置器,然后利用一个主暗码和用户暗码举行加密。鄙人面的代码中,文档被加密,用户不必要敲进就能够在Acrobat中翻开它(没有设置用户暗码),可是该文档不成被打印。//loadthedocumentPDDocumentpdf=PDDocument.load("test.pdf");//createtheencryptionoptionsPDStandardEncryptionencryptionOptions=newPDStandardEncryption();encryptionOptions.setCanPrint(false);pdf.setEncryptionDictionary(encryptionOptions);//encryptthedocumentpdf.encrypt("master",null);//savetheencrypteddocument//tothefilesystempdf.save("test-output.pdf"); 更具体的示例拜见PDFBox公布版中包括的加密工具类源代码:org.pdfbox.Encrypt。 很多使用程序能够天生PDF文档,但不撑持把持文档的平安选项。这时候PDFBox就能够用来在发送给用户之前截获并加密PDF文档。 表单整合 当使用程序的输入是一系列表单域的值时,供应将表单保留成文件的功效是很需要的。这时候PDF手艺将是一个很好的选择。开辟职员能够手动编写PDF指令来绘制图形、表格和文本。大概将数据存成XML情势并利用XSL-FO模版来创立PDF文档。但是,这些举措都是对照耗时,简单堕落,并且天真性也对照差。关于复杂的表单而言,一个更好的举措是创立模版,然后将给定的输出数据填进该模版,从而天生文档。 EmploymentEligibilityVerification是一个年夜多半人都熟习的表单,它又叫做“I-9表单”,拜见:http://uscis.gov/graphics/formsfee/forms/files/i-9.pdf 你可使用PDFBox公布版中的一个示例程序列出表单域名单:javaorg.pdfbox.examples.fdf.PrintFieldsi-9.pdf 另有一个示例程序用于向指定的域中拔出文本情势的数据:javaorg.pdfbox.examples.fdf.SetFieldi-9.pdfNAME1Smith 在Acrobat中翻开这个PDF文档你就会看到"LastName"域已被填写了。你也能够利用以下代码来完成不异的操纵:PDDocumentpdf=PDDocument.load("i-9.pdf");PDDocumentCatalogdocCatalog=pdf.getDocumentCatalog();PDAcroFormacroForm=docCatalog.getAcroForm();PDFieldfield=acroForm.getField("NAME1");field.setValue("Smith");pdf.save("i-9-copy.pdf"); 上面的代码可用于提取方才填写的表单域的值:PDFieldfield=acroForm.getField("NAME1");System.out.println("FirstName="+field.getValue()); Acrobat撑持将表双数据导进或导出到一个特定的文件格局“表双数据格局”(FormsDataFormat)。这类文件有两类:FDF和XFDF。FDF文件寄存表双数据的格局与PDF不异,而XFDF则以XML格局寄存表双数据。PDFBox在一个类中处置FDF和XFDF:FDFDocument。上面的代码片段演示了怎样从下面的I-9表单导出FDF数据:PDDocumentpdf=PDDocument.load("i-9.pdf");PDDocumentCatalogdocCatalog=pdf.getDocumentCatalog();PDAcroFormacroForm=docCatalog.getAcroForm();FDFDocumentfdf=acroForm.exportFDF();fdf.save("exportedData.fdf"); PDFBox表单整合步骤:利用Acrobat或其他可视化工具创立PDF表单模版记下每一个必要的(desirable)表单域的称号将模版寄存在使用程序能够会见到的中央当PDF被哀求时,利用PDFBox剖析PDF模版添补指定的表单域将添补了局(PDF)前往给用户 工具 除上文先容的API以外,PDFBox还供应一系列命令行工具。表2列出了这些工具类并作冗长先容。 备注 PDF标准共有1172页之多,实在现切实其实是一浩荡工程。一样,PDFBox公布版中说它“正在举行中”,新的功效会渐渐地增加上往。它的次要缺点是从零入手下手创立PDF文档。但是,有一些源码开放的Java项目可用于弥补这个缺口。比方,ApacheFOP项目撑持从特别的XML文档天生PDF,这个XML文档形貌了要天生的PDF文档。别的,iText供应一个高层API用于创立表格和列表。 PDFBox的下一个版本将撑持新的PDF1.5对象流和交织援用流。然后将供应内嵌字体和图象的撑持。在PDFBox的勉力下,Java使用程序中的PDF手艺无望失掉充实的撑持。
大型的应用一般不会用这些框架(因为性能考虑);开发人员根据需要选择用一些框架,也可以不选用框架;不用框架并不代表要自己写框架;修改框架的可能性更小。 |
|