Apache PDFBox 2
Apache PDFBox 2已于今年早些時(shí)候發(fā)布 , Apache PDFBox 2.0.1和Apache PDFBox 2.0.2已發(fā)布。 Apache PDFBox是開源的( Apache許可證版本2 )并且基于Java(因此易于使用,包括Java , Groovy , Scala , Clojure , Kotlin和Ceylon )。 這些或其他基于JVM的任何語(yǔ)言都可以使用Apache PDFBox來讀取,編寫和使用PDF文檔 。
Apache PDFBox 2除了完成的任務(wù)和一些新功能以外,還引入了許多錯(cuò)誤修復(fù)。 Apache PDFBox 2現(xiàn)在需要Java SE 6 ( Apache PDFBox 1.x的 J2SE 5最低要求)。 有一個(gè)遷移指南,“ 遷移到PDFBox 2.0.0” ,詳細(xì)介紹了PDFBox 1.8和PDFBox 2.0之間的許多差異,包括更新后的依賴項(xiàng)( Bouncy Castle 1.53和Apache Commons Logging 1.2 )以及PDFBox 2中的“對(duì)庫(kù)的重大更改”。
PDFBox可用于創(chuàng)建PDF。 下一個(gè)代碼清單改編自文檔創(chuàng)建 “ Cookbook”示例中的Apache PDFBox 1.8示例“ Create a blank PDF”。 引用的示例顯式關(guān)閉了實(shí)例化的PDDocument ,可能這樣做是為了對(duì)那些在JDK 7之前使用Java版本的用戶有利。但是,對(duì)于Java 7的用戶, try-with-resources是確保PDDocument實(shí)例關(guān)閉的更好選擇。并且受支持,因?yàn)镻DDocument實(shí)現(xiàn)了AutoCloseable 。
創(chuàng)建(空)PDF
/*** Demonstrate creation of an empty PDF.*/ private void createEmptyDocument() {try (final PDDocument document = new PDDocument()){final PDPage emptyPage = new PDPage();document.addPage(emptyPage);document.save("EmptyPage.pdf");}catch (IOException ioEx){err.println("Exception while trying to create blank document - " + ioEx);} }下一個(gè)代碼清單改編自文檔創(chuàng)建 “ Cookbook”示例中的Apache PDFBox 1.8示例“ Hello World使用PDF基本字體”。 從1.8 Cookbook示例中此清單中最重大的變化是分別將不贊成使用的方法PDPageContentStream.moveTextPositionByAmount(float,float)和PDPageContentStream.drawString(String)替換為PDPageContentStream.newLineAtOffset(float,float)和PDPageContentStream.showText(String) 。
用字體創(chuàng)建簡(jiǎn)單的PDF
/*** Create simple, single-page PDF "Hello" document.*/ private void createHelloDocument() {final PDPage singlePage = new PDPage();final PDFont courierBoldFont = PDType1Font.COURIER_BOLD;final int fontSize = 12;try (final PDDocument document = new PDDocument()){document.addPage(singlePage);final PDPageContentStream contentStream = new PDPageContentStream(document, singlePage);contentStream.beginText();contentStream.setFont(courierBoldFont, fontSize);contentStream.newLineAtOffset(150, 750);contentStream.showText("Hello PDFBox");contentStream.endText();contentStream.close(); // Stream must be closed before saving document.document.save("HelloPDFBox.pdf");}catch (IOException ioEx){err.println("Exception while trying to create simple document - " + ioEx);} }下一個(gè)代碼清單演示了使用Apache PDFBox從PDF解析文本的方法。 這個(gè)極其簡(jiǎn)單的實(shí)現(xiàn)使用PDFTextStripper.getText(PDDocument)將所有文本解析為單個(gè)String 。 在最現(xiàn)實(shí)的情況下,我不希望PDF中的所有文本都在單個(gè)String中,并且可能會(huì)使用PDFTextStripper的功能來更狹窄地指定要分析的文本 。 還要注意的是,盡管此代碼清單是從網(wǎng)上獲取PDF的( Scala示例 PDF, 網(wǎng)址為http://www.scala-lang.org/docu/files/ScalaByExample.pdf ),但是PDDocument的構(gòu)造函數(shù)很多 ,允許使用一個(gè)在文件系統(tǒng)上以及通過其他類型的流訪問PDF。
從在線PDF解析文本
/*** Parse text from an online PDF.*/ private void parseOnlinePdfText() {final String address = "http://www.scala-lang.org/docu/files/ScalaByExample.pdf";try{final URL scalaByExampleUrl = new URL(address);final PDDocument documentToBeParsed = PDDocument.load(scalaByExampleUrl.openStream());final PDFTextStripper stripper = new PDFTextStripper();final String pdfText = stripper.getText(documentToBeParsed);out.println("Parsed text size is " + pdfText.length() + " characters:");out.println(pdfText);}catch (IOException ioEx){err.println("Exception while trying to parse text from PDF at " + address);} }JDK 8問題
PDFBox 2暴露了JDK 8中的一個(gè)問題,該問題是在Bug JDK-8041125下提出的(“與JDK7相比,JDK 8中的ColorConvertOp過濾器要慢得多”)。 Apache PDFBox“ 入門 ”文檔描述了以下問題:“由于將Java顏色管理模塊更改為“ LittleCMS ”,因此用戶在進(jìn)行顏色操作時(shí)會(huì)遇到性能下降的問題。” 相同的“入門”部分提供了變通方法:“禁用LittleCMS以便使用舊的KCMS(柯達(dá)色彩管理系統(tǒng))。”
該錯(cuò)誤似乎已由IDR Solutions及其商業(yè)Java PDF庫(kù)JPedal識(shí)別并提交。 他們的博客文章Java新版本中的Color性能的重大變化提供了與此問題相關(guān)的更多詳細(xì)信息。
剛剛提到的文章和文檔(包括Apache PDFBox 2的“入門”部分)通過明確指定使用KCMS( 可以隨時(shí)刪除 )而不是默認(rèn)值來明確展示Java系統(tǒng)屬性的使用,以解決該問題。 LittleCMS。 如這些來源所述,可以使用-D選項(xiàng)[ -Dsun.java2d.cmm=sun.java2d.cmm.kcms.KcmsServiceProvider ]向Java啟動(dòng)器[ java ]提供系統(tǒng)屬性 ,也可以在可執(zhí)行代碼中指定該屬性。本身[ System.setProperty("sun.java2d.cmm", "sun.java2d.cmm.kcms.KcmsServiceProvider"); ]。
聽起來這個(gè)問題并不是Apache PDFBox版本2獨(dú)有,但在Apache PDFBox 2中更常見,因?yàn)榘姹?更頻繁地使用依賴結(jié)構(gòu),并且使用Java 8的人也有可能使用較新的PDFBox。
JDK 8中與屬性sun.java2d.cmm關(guān)聯(lián)的默認(rèn)實(shí)現(xiàn)的sun.java2d.cmm說明了我在最近的博客文章《 Java向后不兼容的歷史觀察》中試圖sun.java2d.cmm的觀點(diǎn)。 在那篇文章中,我總結(jié)道,“請(qǐng)小心并謹(jǐn)慎使用廣告或?qū)嶒?yàn)性宣傳的Java API,類和工具,這些Java,Java和Java在將來的Java發(fā)行版中可能會(huì)刪除。” 事實(shí)證明Java 2D系統(tǒng)屬性在此類中。 Java 2D Technology的系統(tǒng)屬性頁(yè)面提供了有關(guān)使用這些屬性的背景信息和警告信息:
本文檔介紹了一些不受支持的屬性,可用于自定義2D繪畫系統(tǒng)的運(yùn)行方式。 您可能會(huì)使用這些屬性來提高性能,修復(fù)錯(cuò)誤的呈現(xiàn)或避免某些配置下的系統(tǒng)崩潰。 …
警告:使用這些屬性時(shí)要小心。 由于非常實(shí)際的原因,其中一些不受支持。 …由于這些屬性的唯一目的是啟用或禁用特定于實(shí)現(xiàn)的行為,因此它們可能會(huì)更改或刪除,恕不另行通知。 某些屬性可能僅適用于所記錄的確切產(chǎn)品版本。
結(jié)論
Apache PDFBox 2是在Java中操作PDF文檔的相對(duì)簡(jiǎn)單的方法。 它具有開放的Apache 2許可證,非常適合廣大讀者,其開放源代碼性質(zhì)使開發(fā)人員可以了解如何使用其在幕后使用的庫(kù)并根據(jù)需要進(jìn)行調(diào)整。
其他資源
- Apache PDFBox – Java PDF庫(kù) (主項(xiàng)目頁(yè)面)
- Apache PDFBox 2.0發(fā)布 (軟件開發(fā)時(shí)間,2016年3月21日)
- 用于處理PDF文檔的Apache PDFBox庫(kù) (2016年4月3日)
- 以編程方式用Java填寫PDF (2013年1月11日– PDFBox 1.x)
翻譯自: https://www.javacodegeeks.com/2016/07/apache-pdfbox-2.html
總結(jié)
以上是生活随笔為你收集整理的Apache PDFBox 2的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 美国内华达州发现数千万吨锂矿,预估为全球
- 下一篇: 使用Spring boot,Thymel