apache pdfbox_Apache PDFBox 2
apache pdfbox
Apache PDFBox 2已于今年早些時候發布 , Apache PDFBox 2.0.1和Apache PDFBox 2.0.2已發布。 Apache PDFBox是開源的( Apache許可證版本2 )并且基于Java(因此易于使用,包括Java , Groovy , Scala , Clojure , Kotlin和Ceylon在內的多種編程語言都易于使用)。 這些或其他基于JVM的任何語言都可以使用Apache PDFBox來讀取,編寫和使用PDF文檔 。
Apache PDFBox 2除了完成的任務和一些新功能以外,還引入了許多錯誤修復。 Apache PDFBox 2現在需要Java SE 6 ( Apache PDFBox 1.x最低為J2SE 5 )。 有一個遷移指南,“ 遷移到PDFBox 2.0.0” ,其中詳細介紹了PDFBox 1.8和PDFBox 2.0之間的許多差異,包括更新的依賴項( Bouncy Castle 1.53和Apache Commons Logging 1.2 )以及PDFBox 2中的“對庫的重大更改”。
PDFBox可用于創建PDF。 下一個代碼清單改編自文檔創建 “ Cookbook”示例中的Apache PDFBox 1.8示例“創建空白PDF”。 引用的示例顯式關閉了實例化的PDDocument ,可能這樣做是為了使那些在JDK 7之前使用Java版本的用戶受益。但是,對于Java 7的用戶, try-with-resources是確保PDDocument實例關閉的更好選擇。并且它受支持,因為PDDocument實現了AutoCloseable 。
創建(空)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);} }下一個代碼清單改編自文檔創建 “ 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) 。
用字體創建簡單的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);} }下一個代碼清單演示了使用Apache PDFBox從PDF解析文本的方法。 這個極其簡單的實現使用PDFTextStripper.getText(PDDocument)將所有文本解析為單個String 。 在最現實的情況下,我不希望PDF中的所有文本都在單個String中,并且可能會使用PDFTextStripper的功能來更狹窄地指定要解析的文本 。 還要注意的是,盡管此代碼清單是從網上獲取PDF的( Scala示例 PDF, 網址為http://www.scala-lang.org/docu/files/ScalaByExample.pdf ),但PDDocument的構造函數很多 ,它允許一個訪問文件系統上的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中的一個問題,該問題是在Bug JDK-8041125下提出的(“與JDK7相比,JDK 8中的ColorConvertOp過濾器要慢得多”)。 Apache PDFBox“ 入門 ”文檔描述了以下問題:“由于將Java顏色管理模塊更改為“ LittleCMS ”,因此用戶在進行顏色操作時會遇到性能下降的問題。” 相同的“入門”部分提供了變通方法:“禁用LittleCMS以便使用舊的KCMS(柯達色彩管理系統)。”
該錯誤似乎已由IDR Solutions及其商業Java PDF庫JPedal識別并提交。 他們的博客文章Java新版本中的Color性能的重大變化提供了與此問題相關的更多詳細信息。
剛剛提到的文章和文檔(包括Apache PDFBox 2的“入門”部分)通過明確指定使用KCMS( 可以隨時刪除 )而不是默認值來明確展示Java系統屬性的使用,以解決該問題。 LittleCMS。 如這些來源所述,可以使用-D選項[ -Dsun.java2d.cmm=sun.java2d.cmm.kcms.KcmsServiceProvider ]向Java啟動器[ java ]提供系統屬性 ,也可以在可執行代碼中指定該屬性。本身[ System.setProperty("sun.java2d.cmm", "sun.java2d.cmm.kcms.KcmsServiceProvider"); ]。
聽起來這個問題并不是Apache PDFBox版本2獨有,但在Apache PDFBox 2中更常見,因為版本2更頻繁地使用依賴結構,并且使用Java 8的人也有可能使用較新的PDFBox。
JDK 8中與屬性sun.java2d.cmm相關聯的默認實現的sun.java2d.cmm說明了我試圖在我最近的博客文章《 Java向后不兼容的歷史觀察》中提出的觀點。 在那篇文章中,我總結道:“謹防并謹慎使用廣告或實驗性宣傳的API,類和工具,這些Java,類和工具在將來的Java發行版中將被刪除。” 事實證明Java 2D系統屬性在此類中。 Java 2D Technology的系統屬性頁面提供了有關使用這些屬性的背景信息和警告信息:
本文檔介紹了一些不受支持的屬性,可用于自定義2D繪畫系統的運行方式。 您可能會使用這些屬性來提高性能,修復錯誤的呈現或避免某些配置下的系統崩潰。 …
警告:使用這些屬性時要小心。 由于非常實際的原因,其中一些不受支持。 …由于這些屬性的唯一目的是啟用或禁用特定于實現的行為,因此它們可能會更改或刪除,恕不另行通知。 某些屬性可能僅適用于所記錄的確切產品版本。
結論
Apache PDFBox 2是在Java中操作PDF文檔的相對簡單的方法。 它具有開放的Apache 2許可證,非常適合大量讀者,其開放源代碼性質使開發人員可以了解如何使用其在幕后使用的庫并根據需要對其進行調整。
其他資源
- Apache PDFBox – Java PDF庫 (主項目頁面)
- Apache PDFBox 2.0發布 (軟件開發時間,2016年3月21日)
- 用于處理PDF文檔的Apache PDFBox庫 (2016年4月3日)
- 以編程方式用Java填寫PDF (2013年1月11日– PDFBox 1.x)
翻譯自: https://www.javacodegeeks.com/2016/07/apache-pdfbox-2.html
apache pdfbox
總結
以上是生活随笔為你收集整理的apache pdfbox_Apache PDFBox 2的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 购买手机有哪些小技巧
- 下一篇: antlr 语言 库_关于ANTLR的通