1. 序章

このクイック記事では、PDFファイルとJavaの他の形式との間でプログラムによる変換を行うことに焦点を当てます。

具体的には、複数のJavaオープンソースライブラリを使用して、PDFをPNGやJPEGなどの画像ファイルとして保存する方法、PDFをMicrosoft Wordドキュメントに変換する方法、HTMLとしてエクスポートする方法、テキストを抽出する方法について説明します。

2. Mavenの依存関係

最初に見るライブラリはPdf2Domです。 プロジェクトに追加する必要のあるMavenの依存関係から始めましょう。

<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>pdfbox-tools</artifactId>
    <version>2.0.25</version>
</dependency>
<dependency>
    <groupId>net.sf.cssbox</groupId>
    <artifactId>pdf2dom</artifactId>
    <version>2.0.1</version>
</dependency>

最初の依存関係を使用して、選択したPDFファイルをロードします。 2番目の依存関係は、変換自体を担当します。 最新バージョンは、pdfbox-toolsおよびpdf2domにあります。

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

プロジェクトに含める必要のあるMavenの依存関係を見てみましょう。

<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itextpdf</artifactId>
    <version>5.5.10</version>
</dependency>
<dependency>
    <groupId>com.itextpdf.tool</groupId>
    <artifactId>xmlworker</artifactId>
    <version>5.5.10</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.15</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-scratchpad</artifactId>
    <version>3.15</version>
</dependency>

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

3. PDFおよびHTML変換

HTMLファイルを操作するには、 Pdf2Dom –ドキュメントをHTML DOM表現に変換する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。で指定された出力に書き込みます。

ご了承ください PDFをHTMLに変換しても、100%のピクセル間結果になることはありません。 結果は、特定の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();
}

HTMLをPDFに変換するには、HTMLですべてのタグが正しく開始および終了されていることを確認する必要があります。そうしないと、PDFが作成されません。このアプローチの良い面は、PDFがまったく同じように作成されることです。 HTMLファイルのように。

4.PDFから画像への変換

PDFファイルを画像に変換する方法はたくさんあります。 最も人気のあるソリューションの1つは、 ApachePDFBoxという名前です。 このライブラリは、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ファイルの各ページを個別にレンダリングする必要があります。

最後に、ApachePDFBoxToolsのImageIOUtilを使用して、指定した拡張子で画像を書き込みます。 可能なファイル形式は、 jpeg、jpg、gif、tiffまたはpngです。

ApachePDFBoxは高度なツールであることに注意してください–独自の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();
}

上記の例のように、画像をファイルとして提供したり、URLから読み込んだりできることに注意してください。さらに、使用できる出力ファイルの拡張子はです。 jpeg、jpg、gif、tiffまたはpng。

5.PDFからテキストへの変換

PDFファイルから生のテキストを抽出するために、 ApachePDFBoxも再び使用します。 テキストから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ファイルを読み取るには、 PDFParser を使用し、「r」(読み取り)オプションを指定します。 さらに、 parser.parse()メソッドを使用する必要があります。これにより、PDFがストリームとして解析され、COSDocumentオブジェクトに入力されます。

テキストの抽出部分を見てみましょう。

COSDocument cosDoc = parser.getDocument();
PDFTextStripper pdfStripper = new PDFTextStripper();
PDDocument pdDoc = new PDDocument(cosDoc);
parsedText = pdfStripper.getText(pdDoc);

最初の行では、COSDocumentcosDoc変数内に保存します。 次に、PDFドキュメントのメモリ内表現であるPDocumentを作成するために使用されます。 最後に、 PDFTextStripper を使用して、ドキュメントの生のテキストを返します。 これらすべての操作の後、 close()メソッドを使用して、使用されているすべてのストリームを閉じる必要があります。

最後の部分では、単純なJava PrintWriter を使用して、新しく作成されたファイルにテキストを保存します。

PrintWriter pw = new PrintWriter("src/output/pdf.txt");
pw.print(parsedText);
pw.close();

プレーンテキストファイルにはテキストのみが含まれているため、フォーマットを保持できないことに注意してください。

5.2. PDFへのテキスト

テキストファイルをPDFに変換するのは少し注意が必要です。 ファイル形式を維持するには、追加のルールを適用する必要があります。

次の例では、ファイルのフォーマットは考慮されていません。

まず、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からDocxへの変換

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()抽出戦略では、すべてのフォーマットルールが失われることに注意してください。 これを修正するには、ここで説明されている抽出戦略を試して、より複雑なソリューションを実現してください。

7.PDFからXの商用ライブラリ

前のセクションでは、オープンソースライブラリについて説明しました。 注目に値するライブラリは他にもいくつかありますが、有料です。

  • jPDFImages – jPDFImagesは、PDFドキュメントのページから画像を作成し、それらをJPEG、TIFF、またはPNG画像としてエクスポートできます。
  • JPEDAL – JPedalは、ファイルの印刷、表示、変換に使用される、活発に開発された非常に有能なネイティブJavaPDFライブラリSDKです。
  • pdfcrowd –これは別のWeb/HTMLからPDFおよびPDFからWeb/HTMLへの変換ライブラリであり、高度なGUIを備えています。

8.結論

この記事では、PDFファイルをさまざまな形式に変換する方法について説明しました。

このチュートリアルの完全な実装は、GitHubプロジェクトにあります。これはMavenベースのプロジェクトです。 テストするには、例を実行して、outputフォルダーで結果を確認するだけです。