JavaでのPDF変換

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

さらに、iTextを使用してPDFファイルからテキストを抽出し、POIを使用して。docxドキュメントを作成します。

プロジェクトに含める必要のある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

iTextの最新バージョンはhereにあり、Apache POIhereを探すことができます。

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フォルダーで結果を確認するだけです。