Konversi PDF di Java

1. Perkenalan

Di artikel singkat ini, kami akan fokus melakukan konversi programatik antara file PDF dan format lain di Java .

Lebih khusus lagi, kami akan menjelaskan cara menyimpan PDF sebagai file gambar, seperti PNG atau JPEG, mengonversi PDF ke dokumen Microsoft Word, mengekspor sebagai HTML, dan mengekstrak teks, dengan menggunakan beberapa pustaka sumber terbuka Java.

2. Ketergantungan Maven

Pustaka pertama yang akan kita lihat adalah Pdf2Dom . Mari kita mulai dengan dependensi Maven yang perlu kita tambahkan ke proyek kita:

 org.apache.pdfbox pdfbox-tools 2.0.3   net.sf.cssbox pdf2dom 1.6 

Kami akan menggunakan ketergantungan pertama untuk memuat file PDF yang dipilih. Ketergantungan kedua bertanggung jawab atas konversi itu sendiri. Versi terbaru dapat ditemukan di sini: pdfbox-tools dan pdf2dom.

Terlebih lagi, kami akan menggunakan iText untuk mengekstrak teks dari file PDF dan POI untuk membuat file. dokumen docx .

Mari kita lihat dependensi Maven yang perlu kita sertakan dalam proyek kita:

 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 

Versi terbaru iText dapat ditemukan di sini dan Anda dapat mencari Apache POI di sini.

3. Konversi PDF dan HTML

Untuk bekerja dengan file HTML kita akan menggunakan Pdf2Dom - parser PDF yang mengubah dokumen menjadi representasi HTML DOM. Pohon DOM yang diperoleh kemudian dapat diserialkan ke file HTML atau diproses lebih lanjut.

Untuk mengkonversi PDF ke HTML, kita perlu menggunakan XMLWorker, perpustakaan yang disediakan oleh iText .

3.1. PDF ke HTML

Mari kita lihat konversi sederhana dari PDF ke 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(); } 

Dalam potongan kode di atas kami memuat file PDF, menggunakan API beban dari PDFBox. Dengan PDF dimuat, kami menggunakan parser untuk mengurai file dan menulis ke output yang ditentukan oleh java.io.Writer.

Perhatikan bahwa mengonversi PDF ke HTML tidak pernah merupakan hasil 100% dari piksel ke piksel. Hasilnya bergantung pada kompleksitas dan struktur file PDF tertentu.

3.2. HTML ke PDF

Sekarang, mari kita lihat konversi dari HTML ke 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(); }

Perhatikan bahwa mengonversi HTML ke PDF, Anda perlu memastikan bahwa HTML memiliki semua tag yang dimulai dan ditutup dengan benar, jika tidak, PDF tidak akan dibuat. Aspek positif dari pendekatan ini adalah PDF akan dibuat persis sama seperti di file HTML.

4. Konversi PDF ke Gambar

Ada banyak cara untuk mengonversi file PDF menjadi gambar. Salah satu solusi paling populer bernama Apache PDFBox . Perpustakaan ini adalah alat Java open source untuk bekerja dengan dokumen PDF. Untuk konversi gambar ke PDF, kami akan menggunakan iText lagi.

4.1. PDF ke Gambar

Untuk mulai mengonversi PDF menjadi gambar, kita perlu menggunakan ketergantungan yang disebutkan di bagian sebelumnya - pdfbox-tools .

Mari kita lihat contoh kode:

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(); }

Ada beberapa bagian penting dalam kode yang disebutkan di atas. Kita perlu menggunakan PDFRenderer , untuk merender PDF sebagai BufferedImage . Selain itu, setiap halaman file PDF perlu dirender secara terpisah.

Terakhir, kami menggunakan ImageIOUtil , dari Apache PDFBox Tools, untuk menulis gambar, dengan ekstensi yang kami tentukan. Format file yang memungkinkan adalah jpeg, jpg, gif, tiff atau png.

Perhatikan bahwa Apache PDFBox adalah alat canggih - kita dapat membuat file PDF sendiri dari awal, mengisi formulir di dalam file PDF, menandatangani dan / atau mengenkripsi file PDF.

4.2. Gambar ke PDF

Mari kita lihat contoh kode:

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(); }

Harap dicatat, bahwa kami dapat memberikan gambar sebagai file, atau memuatnya dari URL, seperti yang ditunjukkan pada contoh di atas. Selain itu ekstensi dari file keluaran yang bisa kita gunakan adalah jpeg, jpg, gif, tiff atau png.

5. Konversi PDF ke Teks

Untuk mengekstrak teks mentah dari file PDF, kami juga akan menggunakan Apache PDFBox lagi. Untuk konversi teks ke PDF, kami akan menggunakan iText .

5.1. PDF ke Teks

Kami membuat metode bernama generateTxtFromPDF (…) dan membaginyamenjadi tiga bagian utama: memuat file PDF, ekstraksi teks, dan pembuatan file akhir.

Mari kita mulai dengan memuat bagian:

File f = new File(filename); String parsedText; PDFParser parser = new PDFParser(new RandomAccessFile(f, "r")); parser.parse();

Untuk membaca file PDF, kami menggunakan PDFParser , dengan opsi "r" (baca). Selain itu, kita perlu menggunakan metode parser.parse () yang akan menyebabkan PDF diurai sebagai aliran dan diisi ke dalam objek COSDocument .

Mari kita lihat bagian teks penggalian:

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

In the first line, we'll save COSDocument inside the cosDoc variable. It will be then used to construct PDocument, which is the in-memory representation of the PDF document. Finally, we will use PDFTextStripper to return the raw text of a document. After all of those operations, we'll need to use close() method to close all the used streams.

In the last part, we'll save text into the newly created file using the simple Java PrintWriter:

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

Please note that you cannot preserve formatting in a plain text file because it contains text only.

5.2. Text to PDF

Converting text files to PDF is bit tricky. In order to maintain the file formatting, you'll need to apply additional rules.

In the following example, we are not taking into consideration the formatting of the file.

First, we need to define the size of the PDF file, version and output file. Let's have a look at the code example:

Document pdfDoc = new Document(PageSize.A4); PdfWriter.getInstance(pdfDoc, new FileOutputStream("src/output/txt.pdf")) .setPdfVersion(PdfWriter.PDF_VERSION_1_7); pdfDoc.open();

In the next step, we'll define the font and also the command that is used to generate new paragraph:

Font myfont = new Font(); myfont.setStyle(Font.NORMAL); myfont.setSize(11); pdfDoc.add(new Paragraph("\n"));

Finally, we are going to add paragraphs into newly created PDF file:

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

Creating PDF file from Word document is not easy, and we'll not cover this topic here. We recommend 3rd party libraries to do it, like jWordConvert.

To create Microsoft Word file from a PDF, we'll need two libraries. Both libraries are open source. The first one is iText and it is used to extract the text from a PDF file. The second one is POI and is used to create the .docx document.

Let's take a look at the code snippet for the PDF loading part:

XWPFDocument doc = new XWPFDocument(); String pdf = filename; PdfReader reader = new PdfReader(pdf); PdfReaderContentParser parser = new PdfReaderContentParser(reader); 

After loading of the PDF, we need to read and render each page separately in the loop, and then write to the output file:

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

Please note, that with the SimpleTextExtractionStrategy() extraction strategy, we'll lose all formatting rules. In order to fix it, play with extraction strategies described here, to achieve a more complex solution.

7. PDF to X Commercial Libraries

Di bagian sebelumnya, kami menjelaskan pustaka sumber terbuka. Ada beberapa perpustakaan lain yang perlu diperhatikan, tetapi mereka dibayar:

  • jPDFImages - jPDFImages dapat membuat gambar dari halaman dalam dokumen PDF dan mengekspornya sebagai gambar JPEG, TIFF, atau PNG.
  • JPEDAL - JPedal adalah SDK perpustakaan PDF Java asli yang dikembangkan secara aktif dan sangat mumpuni yang digunakan untuk mencetak, melihat, dan mengonversi file
  • pdfcrowd - ini adalah pustaka konversi Web / HTML ke PDF dan PDF ke Web / HTML lain, dengan GUI tingkat lanjut

8. Kesimpulan

Pada artikel ini, kami membahas cara mengonversi file PDF ke dalam berbagai format .

Implementasi lengkap dari tutorial ini dapat ditemukan di proyek GitHub - ini adalah proyek berbasis Maven. Untuk mengujinya, jalankan saja contoh dan lihat hasilnya di folder keluaran .