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