Apache PDFBoxã©ã¤ãã©ãªã使ã£ã¦PDFææ¸ã®è¡¨ç¤ºï¼çæç·¨ï¼
ã¨ããããPDFææ¸ããä»»æã®ãã¼ã¸ãåãåºãããã¨ãããã¨ãããã¾ããPDFææ¸ãæ±ãã®ã¯Acrobatï¼â Acrobat Readerï¼ãè³¼å ¥ããã®ãä¸çªã§ãããããããªã¼ã®ãã¼ã«ãå¤ã åå¨ãã¾ãããããã¯Javaã§ãã¼ã«ãä½æãã¦ã¿ããã¨æãã¾ãã
ã¾ãã第ä¸æ©ã¨ãã¦PDFææ¸ããã¼ã¸åä½ã§Javaã§è¡¨ç¤ºããPDFã®ãã¥ã¼ã¢ã¼ãä½æãã次ã«ãã¼ã¸ãæå®ãã¦åãåºãæ©è½ãä»ããã¨ãã段éã§é²ãã¦ãããã¨èãã¾ããã
JavaããPDFãæ±ããªã¼ãã³ã½ã¼ã¹ã©ã¤ãã©ãªã¨ãã¦ã¯ãæããã®å®çªã®iTextã¨ãApacheã®PDFBoxãèåã§ãããããããã£ã¦ããã¨æ¬¡ã®ã¾ã¨ããã¼ã¸ãããã¾ããããã®ãã¼ã¸ã¯åãããããã§ãã
iTextã¯åç¨ã©ã¤ã»ã³ã¹ã¨Affero GPLã®ãã¥ã¢ã«ã©ã¤ã»ã³ã¹ã§ããAGPLã§å©ç¨ããã¨GPLv2ã¨äºææ§ããªãã®ã§ä»ã®ã©ã¤ãã©ãªã使ãã¨ãã«ã¡ãã£ã¨æ³¨æãå¿
è¦ã§ãã
PDFBoxã¯Apacheã©ã¤ã»ã³ã¹2.0ã§ãããç¹ã«åé¡ã¯ãªãããã§ããä¸è¿°ãã¼ã¸ã§ç´¹ä»ãã¦ããJasperReportsã¯PDFåºåã ããããä»åã®ç¨éã«ã¯åããªããã¨æãã¾ãã
ããã§ãApache PDFBoxãã¤ãã£ã¦å®è£
ãã¦ã¿ã¾ãã
Apache PDFBoxã«ã¤ãã¦ã¯ãæ¥æ¬èªãæ±ããªãã¨ãã£ãè¨è¿°ãããã¾ãã
MS932ã§åºåããã¨æ¥æ¬èªãæ±ããã¨ããè¨äºãããã¾ãã
éçºä¸ã®ãã¼ã¸ã§ã³2ã§ã¯å¯¾å¿ãã¦ããã¨ã®è¨è¿°ããããã
Apache PDFBoxで日本語の出力とフォントの埋め込み - Symfoware
ä»åã¯ãPDFBox 2.0ã®éçºçã使ã£ã¦ã¿ããã¨ã«ãã¾ãã
Apache PDFBox 2.0.0-SNAPSHOTã¨ãã®ä¾åã©ã¤ãã©ãªãå ¥æãã
PDFBox 2.0ã®ä¾åé¢ä¿ã«ã¤ãã¦ã¯æ¬¡ã®ãã¼ã¸ã«èª¬æãããã¾ãã
https://pdfbox.apache.org/2.0/dependencies.html
ä»åã®ããã°ã©ãã³ã°ã§ã¯ããã¼ãã«ãªéçºç°å¢ï¼Antï¼ã使ãã®ã§ãå¿ è¦ãªã©ã¤ãã©ãªãä¾åé¢ä¿ãå«ãã¦ãã¹ã¦ãã¦ã³ãã¼ããã¾ãã
ã¾ããApache PDFBoxå
¬å¼ãµã¤ãã«ã¢ã¯ã»ã¹ãã¾ãã
https://pdfbox.apache.org/
å·¦å´ã¡ãã¥ã¼ã®Downloadsã®ãªã³ã¯ã辿ããLatest development snapshot buildã®ãªã³ã¯ã辿ããDownloads a snapshot buildã®ãªã³ã¯ã辿ãã¾ãã
http://repository.apache.org/content/groups/snapshots/org/apache/pdfbox/
pdfboxã®ãªã³ã¯ã辿ãã2.0.0-SNAPSHOTã®ãªã³ã¯ã辿ãã¾ãã
ææ°ã®æ¥ä»ã®jarãã¡ã¤ã«ããã¦ã³ãã¼ããã¾ããæ¬æ¥æç¹ã§ã¯æ¬¡ã®ãã¡ã¤ã«ãææ°ã§ããã
- pdfbox-2.0.0-20151002.190058-1737.jar
- pdfbox-2.0.0-20151002.190058-1737-sources.jar
ã¾ãããã®å ´æã«ããpomãã¡ã¤ã«ãéãã¦ä¾åé¢ä¿ããã§ãã¯ãã¾ããããã¨æ¬¡ã®ã©ã¤ãã©ãªã¸ã®ä¾åãè¨è¿°ããã¦ãã¾ããã
<dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>fontbox</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </dependency> <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcmail-jdk15on</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15on</artifactId> <optional>true</optional> </dependency>
fontboxã¯åãPDFBoxã®ä¸é¨ãªã®ã§ãåæ§ã«ãfontboxã®ãªã³ã¯ã辿ãã2.0.0-SNAPSHOTã®ãªã³ã¯ã辿ã£ã¦ææ°ã®æ¥ä»ã®jarãã¡ã¤ã«ããã¦ã³ãã¼ããã¾ãã
- fontbox-2.0.0-20151002.185929-1790.jar
- fontbox-2.0.0-20151002.185929-1790-sources.jar
次ã«ãcommons-loggingã¯Apacheããã¸ã§ã¯ãã®ã©ã¤ãã©ãªãªã®ã§æ¬¡ãããã¦ã³ãã¼ããã¾ãã
https://repository.apache.org/content/groups/public/commons-logging/commons-logging/1.2/
- commons-logging-1.2.jar
org.bouncycastleã®2ã¤ã®ã©ã¤ãã©ãªã¯ãJavaã®æå·ã©ã¤ãã©ãªã§ãPDFãã¡ã¤ã«ã®ç½²åãæå·åã«ä½¿ç¨ããã¾ããç½²åã®ãªãPDFãã¡ã¤ã«ãæ±ãã¨ãã¯ä¸è¦ã§ãã
http://www.bouncycastle.org/java.html
ä¸è¿°URLã®å·¦å´ã¡ãã¥ã¼latest releasesã®ãªã³ã¯ã辿ã£ã¦ãjarãã¡ã¤ã«ãå ¥æãã¾ãã
- bcmail-jdk15on-152.jar
- bcprov-jdk15on-152.jar
ãããPDFææ¸ã§256bit AESæå·ã使ãå ´åã¯ãOracleã®JDKãã¦ã³ãã¼ããµã¤ãããå¥éJava Cryptography Extensionï¼JCEï¼ããã¦ã³ãã¼ããã
NetBeans IDEã¸ã®ã©ã¤ãã©ãªã®å®ç¾©
以ä¸ã«è¨è¿°ããéçºç°å¢ã¯ã次ã§ãã
OS | Windows 7 64bitç |
---|---|
JDK | Java SE Development Kit 8u60 |
IDE | NetBeans IDE 8.1 開発版 |
GUIãã¶ã¤ã³ãã¼ã« | Scene Builder 8.0.0(from Gluon) |
ä»åã®ããã°ã©ã ä½æç°å¢ã§ã¯NetBeans IDEã使ç¨ãã¾ãã
å
¥æããjarãã¡ã¤ã«ç¾¤ããä¸ä¾ã¨ãã¦C:\Program Files\Java\pdfbox\ã®ä¸ã«ç½®ããNetBeans IDEä¸ã§æ°è¦ã©ã¤ãã©ãªã®å®ç¾©ãä½æãã¾ãã[ãã¼ã«]ã¡ãã¥ã¼ > [ã©ã¤ãã©ãª] ã§ãAntã©ã¤ãã©ãªã»ããã¼ã¸ã£ããã¤ã¢ãã°ãéãã[æ°è¦ã©ã¤ãã©ãª]ãã¿ã³ãæ¼ããã©ã¤ãã©ãªåã«ãPDFBoxãã¨å
¥åãã¯ã©ã¹ãã¹ã«ã[JAR/ãã©ã«ãã®è¿½å ]ãã¿ã³ãæ¼ãã¦å
¥æããjarãã¡ã¤ã«ãç»é²ãã¾ããã½ã¼ã¹ã«ã¤ãã¦ãåæ§ã«å
¥æããsources.jarãç»é²ãã¾ãã
PDFBox 2.0ã§PDFææ¸ã表示ããJavaããã°ã©ã
ã¾ãã¯ããã¼ã¸åä½ã«è¡¨ç¤ºããJavaããã°ã©ã ãä½æãã¾ããGUIã¯JDK 8æ¨æºæè¼ã®JavaFXã使ç¨ãããã¼ã¸ãããã®GUIã³ã³ããã¼ã«Paginationã使ã£ã¦å®è£ ãã¾ãã
- NetBeans IDEã§[ãã¡ã¤ã«]ã¡ãã¥ã¼ > [æ°è¦ããã¸ã§ã¯ã]ã§ãæ°è¦ããã¸ã§ã¯ãããã¤ã¢ãã°ãéããã«ãã´ãªæ¬ã§[JavaFX]ãé¸æãããã¸ã§ã¯ãæ¬ã§[JavaFX FXMLã¢ããªã±ã¼ã·ã§ã³]ãé¸æã[次ã¸]ãã¿ã³ãæ¼ãã¾ãã
- ããã¸ã§ã¯ãåã«ãPdfViewerãã¨å ¥åãããã¸ã§ã¯ãã®å ´æã«éçºä½æ¥ãã£ã¬ã¯ããªãæå®ãã¾ãã
- FXMLåã«ãPdfViewãã¨å ¥åã[çµäº]ãã¿ã³ãæ¼ãã¾ãã
ãã®æç¹ã§æ¬¡ã®ã½ã¼ã¹ãã¡ã¤ã«ãã½ã¼ã¹ããã±ã¼ã¸pdfviewerã®ä¸ã«çæããã¾ãã
JavaFXã¢ããªã±ã¼ã·ã§ã³ã®ã¡ã¤ã³ã¯ã©ã¹ï¼Applicationãç¶æ¿ããã¯ã©ã¹ï¼ã¨ãªãPdfViewerãGUIã¬ã¤ã¢ã¦ããå®ç¾©ããPdfViwe FXMLãã¡ã¤ã«ããã¥ã¼ã³ã³ããã¼ã©ã¨ãªãPdfViewControllerã§ãã
ããã«ã¯ã¢ãã«ç¸å½ã®ã¯ã©ã¹ããªãã®ã§ãJavaã¯ã©ã¹ãæ°è¦ä½æãã¾ãã
- NetBeans IDEã®ããã¸ã§ã¯ããã¥ã¼ã§ã½ã¼ã¹ããã±ã¼ã¸pdfviewerãå³ã¯ãªãã¯ãã[æ°è¦] > [Javaã¯ã©ã¹]ãã¯ãªãã¯ãã¾ãããNew Javaã¯ã©ã¹ããã¤ã¢ãã°ãéããã¾ãã
- ã¯ã©ã¹åã«ãPdfModelãã¨å ¥åãããã±ã¼ã¸ãpdfviewerã§ãããã¨ã確èªã[çµäº]ãã¿ã³ãæ¼ãã¾ãã
GUIã¬ã¤ã¢ã¦ãã®ä½æ
PdfView.fxmlãããã«ã¯ãªãã¯ããã¨ãScene Builderãéãã¾ãã
NetBeans IDEãçæããããã©ã«ãã®fxmlã¯ãAnchorPaneã«Labelã¨Buttonãè²¼ã£ã¦ããéå½¢ã§ãã
ã¡ãã£ã¨ããGUIã¢ããªã±ã¼ã·ã§ã³ç»é¢ã¯ãAnchorPaneãããBorderPaneã®æ¹ãããããããï¼å¾ã æ©è½ãä»ã足ãã®ã容æï¼ã®ã§ãä»åã¯BorderPaneã使ãã¾ãã
- Scene Builderã§AnchorPaneãå³ã¯ãªãã¯ãã[Delete]ãã¯ãªãã¯ããã¹ã¦ã®GUIè¦ç´ ãåé¤ããã¾ãã
- Containersã®ã¢ã³ã¼ãã£ãªã³ãéããBorderPaneãä¸å¤®ã®ç»é¢ã«ãã©ãã°ï¼ãããããã¾ãã
- Controlsã®ã¢ã³ã¼ãã£ãªã³ãéããPaginationãä¸å¤®ã®ç»é¢ã«ãã©ãã°ï¼ãããããã¾ãã
- Paginationã³ã³ããã¼ã«ãç»é¢ãã£ã±ãã«è¡¨ç¤ºããããããPaginationãé¸æããå³å´ã®ã¬ã¤ã¢ã¦ãã®ã¢ã³ã¼ãã£ãªã³ãéããAnchor Pane Constraintsã®å³ã®ä¸ä¸å·¦å³ã®æ£ãã¯ãªãã¯ããããããã®æ°å¤ã«0ãæå®ãã¾ãã
- å·¦ä¸ã®Controllerã¢ã³ã¼ãã£ãªã³ãéããController classæ¬ã«pdfviewer.PdfViewControllerãæå®ãã¾ãã
- Paginationãé¸æããCodeã¢ã³ã¼ãã£ãªã³ãéããfx:idæ¬ã«pagination ã¨å ¥åãã¾ããããã¯å¾ã»ã©PdfViewControllerã¯ã©ã¹ã®ãã£ã¼ã«ãpaginationãå®ç¾©ãã¤ã³ã¸ã§ã¯ã·ã§ã³ããéã®ç´ä»ãã¨ãªãã¾ãã
PdfModelã®ä½æ
PDFBoxã©ã¤ãã©ãªã使ç¨ããã®ã§ãNetBeansã®ããã¸ã§ã¯ãã§ä½¿ç¨ããã©ã¤ãã©ãªã追å ãã¾ããPdfViewrããã¸ã§ã¯ããå³ã¯ãªãã¯ã[ããããã£]ãã¯ãªãã¯ããå·¦å´ãã¤ã³ã§[ã©ã¤ãã©ãª]ãé¸æãå³å´ãã¤ã³ã®[ã³ã³ãã¤ã«]ã¿ããé¸æã[ã©ã¤ãã©ãªã®è¿½å ]ãã¿ã³ãæ¼ããå ã«å®ç¾©ããPDFBoxã追å ãã¾ãã
ä»åã¯ã次ã®ã¡ã½ãããæã¤ã¢ãã«ã¯ã©ã¹ãä½æãã¾ãã
- PDFææ¸ã¸ã®ãã¹ãå¼æ°ã«åãã³ã³ã¹ãã©ã¯ã¿
- ãã¼ã¸æ°ãè¿å´ããã¡ã½ãã
- å¼æ°ã§æå®ããããã¼ã¸ã®Imageãä½æãã¦è¿å´ããã¡ã½ãã
package pdfviewer; import java.awt.image.BufferedImage; import java.io.IOException; import java.io.UncheckedIOException; import java.nio.file.Path; import javafx.embed.swing.SwingFXUtils; import javafx.scene.image.Image; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.rendering.PDFRenderer; /** * PDFææ¸ã®ã¢ãã«ã¯ã©ã¹ã */ class PdfModel { private PDDocument document; private PDFRenderer renderer; PdfModel(Path path) { try { document = PDDocument.load(path.toFile()); renderer = new PDFRenderer(document); } catch (IOException ex) { throw new UncheckedIOException("PDDocument thorws IOException file=" + path, ex); } } int getPageCount() { return document.getPages().getCount(); } Image getImage(int pageNumber) { BufferedImage pageImage; try { pageImage = renderer.renderImage(pageNumber); } catch (IOException ex) { throw new UncheckedIOException("PDFRenderer throws IOException", ex); } return SwingFXUtils.toFXImage(pageImage, null); } }
PDFææ¸ãèªã¿è¾¼ãã«ã¯ãPDDocumentã¯ã©ã¹ã®staticã¡ã½ããloadã使ç¨ãã¾ãã
ãã¼ã¸ã®ç»åãçæããã«ã¯ãPDFRendererã¯ã©ã¹ã®renderImageã¡ã½ããã使ç¨ãã¾ããrenderImageã¯BufferedImageåãè¿å´ããã®ã§ãJavaFXã®Imageã«å¤æããããSwingFXUtilsã¯ã©ã¹ã®toFXImageã¡ã½ããã使ç¨ãã¾ãã
PdfViewControllerã®ä½æ
çæç·¨ãªã®ã§ã¨ããããPDFææ¸ãèªã¿è¾¼ã¿ãã¼ã¸ãããã¨è¡¨ç¤ºãã§ããã¨ããã¾ã§ãã©ãçãããã®ã§ãPDFææ¸ã®ãã¹ããã¼ãã³ã¼ãã£ã³ã°ãã¦ãã¾ãã次ã®ãã¼ã¸ã§ã³ä»¥éã§ãã¡ã¤ã«é¸æãã¤ã¢ãã°ã«ããPDFææ¸ã®è¡¨ç¤ºããã©ãã°ï¼ãããã対å¿ããã¦ããã¾ãã
package pdfviewer; import java.net.URL; import java.nio.file.Paths; import java.util.ResourceBundle; import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.scene.control.Pagination; import javafx.scene.image.ImageView; /** * PdfView.fxmlã¨å¯¾ã«ãªãã³ã³ããã¼ã©ã¯ã©ã¹ã */ public class PdfViewController implements Initializable { @FXML private Pagination pagination; private PdfModel model; @Override public void initialize(URL url, ResourceBundle rb) { model = new PdfModel(Paths.get("sample.pdf")); pagination.setPageCount(model.numPages()); pagination.setPageFactory(index -> new ImageView(model.getImage(index))); } }
paginationãã£ã¼ã«ãã¯ãFXMLã§å®ç¾©ããPaginationã®ã¤ã³ã¹ã¿ã³ã¹ãã¤ã³ã¸ã§ã¯ã·ã§ã³ãããã@FXMLã¢ããã¼ã·ã§ã³ãä»ããFXMLã®fx:idã«æå®ããååããã£ã¼ã«ãåã«ãã¦ãã¾ãã
PdfModelã¯ãã«ã¬ã³ããã£ã¬ã¯ããªã®sample.pdfãèªã¿è¾¼ãä»®å®è£ ã§ã¤ã³ã¹ã¿ã³ã¹ãçæãã¦ãã¾ããã¨ã©ã¼å¦çãææããã¦ããã®ã§ãã«ã¬ã³ããã£ã¬ã¯ããªã«sample.pdfãåå¨ããªãã¨ã©ã³ã¿ã¤ã ä¾å¤ï¼UncheckedIOExceptionï¼ãåãã¦è½ã¡ã¾ãã
Paginationã¤ã³ã¹ã¿ã³ã¹ã«ã¯ãå ¨ä½ã®ãã¼ã¸æ°ã¨ãåãã¼ã¸ãé¸æãããã¨ãã«è¡¨ç¤ºããã³ã³ãã³ãï¼Nodeï¼ãçæãããã¡ã¯ããªã¯ã©ã¹ã®ã¤ã³ã¹ã¿ã³ã¹ãè¨å®ãã¾ãã
ããã¾ã§ã§ããããä»»æã®PDFãã¡ã¤ã«ãsample.pdfã®ååã§ã«ã¬ã³ããã£ã¬ã¯ããªï¼NetBeansã®PdfViewerããã¸ã§ã¯ãã®ãã£ã¬ã¯ããªï¼ã«ç½®ãã¾ãã
å®è¡ããã¨ãç»é¢ã«PDFææ¸ã®ãã¼ã¸ç»åã¨ãã¼ã¸ãããã®å¶å¾¡ã表示ããã¾ãã
PdfViewerï¼ã¡ã¤ã³ã¯ã©ã¹ï¼ã®ä½æ
NetBeansã®çæããéå½¢ã®ã¾ã¾ã§ãå®è¡å¯è½ã§ãããã¦ã£ã³ãã¦ã®ã¿ã¤ãã«æååè¨å®ã ã追è¨ãã¾ããã
mainã¡ã½ããã¯ãªãã¦ãå®è¡å¯è½ãªã®ã§åé¤ãã¦ãã¾ãã
package pdfviewer; import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.stage.Stage; public class PdfViewer extends Application { @Override public void start(Stage stage) throws Exception { Parent root = FXMLLoader.load(getClass().getResource("PdfView.fxml")); Scene scene = new Scene(root); stage.setScene(scene); stage.setTitle("PDF simple viewer by PDFBox"); stage.show(); } }
å®è¡
å®è¡ããã¨æ¬¡ã®ããã«è¡¨ç¤ºããã¾ãï¼PDFã³ã³ãã³ãã大ããã¨ãã¼ã¸å¶å¾¡ãé ãã¦ãã¾ãã®ã§ã¦ã£ã³ãã¦ãé©å®åºãã¦ãã ããï¼ã
ææ³ã®ãããªãã®
PDFBoxã®2.0ã¯å¤§åAPIãå¤æ´ã«ãªã£ã¦ãã¾ãã
ãã¼ã¸æ°ã®åãæ¹ãç»åï¼ãã¼ã¸ã¤ã¡ã¼ã¸ï¼ã®ä½æã®ä»æ¹ãªã©ãPDFBox 1.xã®è¨è¿°ã¨ã¯éã£ã¦ããã®ã§ãAPIããã¥ã¡ã³ãããé©å½ã«ï¼Imageãæ¤ç´¢ãã¦ï¼æ¢ãã¦è©¦ãã¦ã¿ããåºã¾ããã¨ããã¬ãã«ã§ãã
åºæ¥ã¦ãã¾ãã°ããã¶ãã·ã³ãã«ã«ãªã£ã¦ããã¨æãã¾ãããããã¾ã§ä¸æ¥ãããã§ããã
JavaFXã®Paginationã¯ãæå使ãæ¹ãåãããæ©ãã§ãã¾ããããæ¦å¿µãåãã£ã¦ãã¾ãã°ç°¡åã§ããã
GitHubã«ãã®ããã¸ã§ã¯ããã¢ãããã¾ããã
https://github.com/torutk/pdfviewer