JavaでのPDF変換
1. 前書き
この簡単な記事では、プログラムによるconversion between PDF files and other formats in Javaの実行に焦点を当てます。
具体的には、複数のJavaオープンソースライブラリを使用して、PDFをPNGやJPEGなどの画像ファイルとして保存する方法、PDFをMicrosoft Wordドキュメントに変換する方法、HTMLとしてエクスポートする方法、テキストを抽出する方法について説明します。
2. Mavenの依存関係
最初に確認するライブラリはPdf2Domです。 プロジェクトに追加する必要のあるMavenの依存関係から始めましょう。
org.apache.pdfbox
pdfbox-tools
2.0.3
net.sf.cssbox
pdf2dom
1.6
最初の依存関係を使用して、選択したPDFファイルをロードします。 2番目の依存関係は、変換自体に責任があります。 最新バージョンはここにあります:pdfbox-toolsおよびpdf2dom。
プロジェクトに含める必要のあるMavenの依存関係を見てみましょう。
com.itextpdf
itextpdf
5.5.10
com.itextpdf.tool
xmlworker
5.5.10
org.apache.poi
poi-ooxml
3.15
org.apache.poi
poi-scratchpad
3.15
3. PDFおよびHTML変換
HTMLファイルを操作するには、Pdf2Domを使用します。これはドキュメントをHTMLDOM表現に変換するPDFパーサーです。 次に、取得したDOMツリーをHTMLファイルにシリアル化するか、さらに処理できます。
PDFをHTMLに変換するには、iTextによって提供されるライブラリであるXMLWorkerを使用する必要があります。
3.1. PDFからHTMLへ
PDFからHTMLへの簡単な変換を見てみましょう。
private void generateHTMLFromPDF(String filename) {
PDDocument pdf = PDDocument.load(new File(filename));
Writer output = new PrintWriter("src/output/pdf.html", "utf-8");
new PDFDomTree().writeText(pdf, output);
output.close();
}
上記のコードスニペットでは、PDFBoxのロードAPIを使用してPDFファイルをロードします。 PDFがロードされたら、パーサーを使用してファイルを解析し、java.io.Writer.で指定された出力に書き込みます。
converting PDF to HTML is never a 100%, pixel-to-pixel result.の結果は、特定のPDFファイルの複雑さと構造によって異なることに注意してください。
3.2. HTMLからPDF
それでは、HTMLからPDFへの変換を見てみましょう。
private static void generatePDFFromHTML(String filename) {
Document document = new Document();
PdfWriter writer = PdfWriter.getInstance(document,
new FileOutputStream("src/output/html.pdf"));
document.open();
XMLWorkerHelper.getInstance().parseXHtml(writer, document,
new FileInputStream(filename));
document.close();
}
converting HTML to PDF, you need to ensure that HTML has all tags properly started and closed, otherwise the PDF will be not created.このアプローチの良い面は、PDFがHTMLファイルの場合とまったく同じように作成されることです。
4. PDF to Image Conversions
PDFファイルを画像に変換する方法は多数あります。 最も人気のあるソリューションの1つは、Apache PDFBoxという名前です。 このライブラリは、PDFドキュメントを操作するためのオープンソースのJavaツールです。 画像からPDFへの変換には、iTextを再度使用します。
4.1. PDFからイメージへ
PDFから画像への変換を開始するには、前のセクションで説明した依存関係–pdfbox-toolsを使用する必要があります。
コード例を見てみましょう。
private void generateImageFromPDF(String filename, String extension) {
PDDocument document = PDDocument.load(new File(filename));
PDFRenderer pdfRenderer = new PDFRenderer(document);
for (int page = 0; page < document.getNumberOfPages(); ++page) {
BufferedImage bim = pdfRenderer.renderImageWithDPI(
page, 300, ImageType.RGB);
ImageIOUtil.writeImage(
bim, String.format("src/output/pdf-%d.%s", page + 1, extension), 300);
}
document.close();
}
上記のコードには重要な部分はほとんどありません。 PDFをBufferedImageとしてレンダリングするには、PDFRendererを使用する必要があります。 また、PDFファイルの各ページは個別にレンダリングする必要があります。
最後に、Apache PDFBox ToolsのImageIOUtilを使用して、指定した拡張子で画像を書き込みます。 可能なファイル形式はjpeg, jpg, gif, tiffまたはpng.です
Note that Apache PDFBox is an advanced tool –独自のPDFファイルを最初から作成したり、PDFファイル内のフォームに入力したり、PDFファイルに署名したり暗号化したりできます。
4.2. PDFへの画像
コード例を見てみましょう。
private static void generatePDFFromImage(String filename, String extension) {
Document document = new Document();
String input = filename + "." + extension;
String output = "src/output/" + extension + ".pdf";
FileOutputStream fos = new FileOutputStream(output);
PdfWriter writer = PdfWriter.getInstance(document, fos);
writer.open();
document.open();
document.add(Image.getInstance((new URL(input))));
document.close();
writer.close();
}
Please note, that we can provide an image as a file, or load it from URL, as it is shown in the example above.さらに、使用できる出力ファイルの拡張子はjpeg, jpg, gif, tiffまたはpng.です。
5. PDF to Text Conversions
PDFファイルから生のテキストを抽出するために、Apache PDFBoxも再度使用します。 テキストからPDFへの変換には、iTextを使用します。
5.1. PDFからテキストへ
generateTxtFromPDF(…)という名前のメソッドを作成し、それを__でPDFファイルのロード、テキストの抽出、最終的なファイル作成の3つの主要部分に分割しました。
パーツのロードから始めましょう:
File f = new File(filename);
String parsedText;
PDFParser parser = new PDFParser(new RandomAccessFile(f, "r"));
parser.parse();
PDFファイルを読み取るために、「r」(読み取り)オプションを指定してPDFParserを使用します。 さらに、PDFをストリームとして解析してCOSDocumentオブジェクトに入力するparser.parse()メソッドを使用する必要があります。
テキストの抽出部分を見てみましょう。
COSDocument cosDoc = parser.getDocument();
PDFTextStripper pdfStripper = new PDFTextStripper();
PDDocument pdDoc = new PDDocument(cosDoc);
parsedText = pdfStripper.getText(pdDoc);
最初の行では、cosDoc変数内にCOSDocumentを保存します。 次に、PDFドキュメントのメモリ内表現であるPDocumentを作成するために使用されます。 最後に、PDFTextStripperを使用してドキュメントの生のテキストを返します。 これらの操作をすべて行った後、close()メソッドを使用して、使用されているすべてのストリームを閉じる必要があります.
最後の部分では、単純なJavaPrintWriterを使用して、新しく作成されたファイルにテキストを保存します。
PrintWriter pw = new PrintWriter("src/output/pdf.txt");
pw.print(parsedText);
pw.close();
プレーンテキストファイルにはテキストのみが含まれているため、フォーマットを保持できないことに注意してください。
5.2. PDFへのテキスト
テキストファイルをPDFに変換するのは少し面倒です。 In order to maintain the file formatting, you’ll need to apply additional rules.
次の例では、ファイルのフォーマットを考慮していません。
まず、PDFファイルのサイズ、バージョン、および出力ファイルを定義する必要があります。 コード例を見てみましょう。
Document pdfDoc = new Document(PageSize.A4);
PdfWriter.getInstance(pdfDoc, new FileOutputStream("src/output/txt.pdf"))
.setPdfVersion(PdfWriter.PDF_VERSION_1_7);
pdfDoc.open();
次のステップでは、フォントと、新しい段落を生成するために使用されるコマンドを定義します。
Font myfont = new Font();
myfont.setStyle(Font.NORMAL);
myfont.setSize(11);
pdfDoc.add(new Paragraph("\n"));
最後に、新しく作成したPDFファイルに段落を追加します。
BufferedReader br = new BufferedReader(new FileReader(filename));
String strLine;
while ((strLine = br.readLine()) != null) {
Paragraph para = new Paragraph(strLine + "\n", myfont);
para.setAlignment(Element.ALIGN_JUSTIFIED);
pdfDoc.add(para);
}
pdfDoc.close();
br.close();
6. PDF to Docx Conversions
Word文書からPDFファイルを作成するのは簡単ではないため、ここではこのトピックについては説明しません。 jWordConvertのように、サードパーティのライブラリで実行することをお勧めします。
PDFからMicrosoftWordファイルを作成するには、2つのライブラリが必要です。 両方のライブラリはオープンソースです。 1つ目はiTextで、PDFファイルからテキストを抽出するために使用されます。 2つ目はPOIで、。docxドキュメントを作成するために使用されます。
PDF読み込み部分のコードスニペットを見てみましょう。
XWPFDocument doc = new XWPFDocument();
String pdf = filename;
PdfReader reader = new PdfReader(pdf);
PdfReaderContentParser parser = new PdfReaderContentParser(reader);
PDFを読み込んだ後、各ページをループで個別に読み取り、レンダリングし、出力ファイルに書き込む必要があります。
for (int i = 1; i <= reader.getNumberOfPages(); i++) {
TextExtractionStrategy strategy =
parser.processContent(i, new SimpleTextExtractionStrategy());
String text = strategy.getResultantText();
XWPFParagraph p = doc.createParagraph();
XWPFRun run = p.createRun();
run.setText(text);
run.addBreak(BreakType.PAGE);
}
FileOutputStream out = new FileOutputStream("src/output/pdf.docx");
doc.write(out);
// Close all open files
SimpleTextExtractionStrategy()抽出戦略では、すべてのフォーマットルールが失われることに注意してください。 それを修正するには、hereで説明されている抽出戦略を試して、より複雑なソリューションを実現します。
7. PDF to X Commercial Libraries
前のセクションでは、オープンソースライブラリについて説明しました。 注目に値するライブラリは他にもいくつかありますが、有料です。
-
jPDFImages – jPDFImagesは、PDFドキュメントのページから画像を作成し、それらをJPEG、TIFF、またはPNG画像としてエクスポートできます。
-
JPEDAL – JPedalは、ファイルの印刷、表示、変換に使用される、活発に開発された非常に有能なネイティブJavaPDFライブラリSDKです。
-
pdfcrowd –高度なGUIを備えた別のWeb / HTMLからPDFおよびPDFからWeb / HTMLへの変換ライブラリ
8. Conclusion
この記事では、convert PDF file into various formatsへの方法について説明しました。
このチュートリアルの完全な実装はthe GitHub projectにあります–これはMavenベースのプロジェクトです。 テストするには、例を実行して、outputフォルダーで結果を確認するだけです。