Penukaran PDF di Java

1. Pengenalan

Dalam artikel ringkas ini, kami akan menumpukan pada melakukan penukaran program antara fail PDF dan format lain di Java .

Lebih khusus lagi, kami akan menerangkan cara menyimpan PDF sebagai fail gambar, seperti PNG atau JPEG, menukar PDF ke dokumen Microsoft Word, mengeksport sebagai HTML, dan mengekstrak teks, dengan menggunakan banyak perpustakaan sumber terbuka Java.

2. Pergantungan Maven

Perpustakaan pertama yang akan kita lihat ialah Pdf2Dom . Mari kita mulakan dengan kebergantungan Maven yang perlu kita tambah pada projek kita:

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

Kami akan menggunakan kebergantungan pertama untuk memuatkan fail PDF yang dipilih. Ketergantungan kedua bertanggungjawab untuk penukaran itu sendiri. Versi terkini boleh didapati di sini: pdfbox-tools dan pdf2dom.

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

Mari lihat kebergantungan Maven yang perlu kita sertakan dalam projek 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 dari iText boleh didapati di sini dan anda boleh mencari Apache POI di sini.

3. Penukaran PDF dan HTML

Untuk bekerja dengan fail HTML, kami akan menggunakan Pdf2Dom - penghurai PDF yang menukar dokumen menjadi representasi DOM HTML. Pokok DOM yang diperoleh kemudiannya dapat diselaraskan ke fail HTML atau diproses lebih lanjut.

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

3.1. PDF ke HTML

Mari kita lihat penukaran mudah 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 coretan kod di atas, kami memuatkan fail PDF, menggunakan API beban dari PDFBox. Dengan PDF dimuat, kami menggunakan parser untuk menguraikan fail dan menulis ke output yang ditentukan oleh java.io.Writer.

Perhatikan bahawa menukar PDF ke HTML tidak pernah menjadi hasil piksel ke piksel 100%. Hasilnya bergantung pada kerumitan dan struktur fail PDF tertentu.

3.2. HTML ke PDF

Sekarang, mari kita lihat penukaran 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 bahawa menukar HTML ke PDF, anda harus memastikan bahawa HTML mempunyai semua tag yang dimulakan dan ditutup dengan betul, jika tidak, PDF tidak akan dibuat. Aspek positif dari pendekatan ini ialah PDF akan dibuat sama persis seperti yang terdapat dalam fail HTML.

4. Penukaran PDF ke Imej

Terdapat banyak cara untuk menukar fail PDF ke gambar. Salah satu penyelesaian yang paling popular adalah Apache PDFBox . Perpustakaan ini adalah alat Java sumber terbuka untuk bekerja dengan dokumen PDF. Untuk penukaran gambar ke PDF, kami akan menggunakan iText lagi.

4.1. PDF ke Gambar

Untuk mula menukar PDF ke gambar, kita perlu menggunakan kebergantungan yang disebutkan di bahagian sebelumnya - alat pdfbox .

Mari lihat contoh kod:

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

Terdapat beberapa bahagian penting dalam kod yang disebutkan di atas. Kita perlu menggunakan PDFRenderer , untuk menjadikan PDF sebagai BufferedImage . Juga, setiap halaman fail PDF perlu diberikan secara berasingan.

Akhirnya, kami menggunakan ImageIOUtil , dari Apache PDFBox Tools, untuk menulis gambar, dengan peluasan yang kami tentukan. Format fail yang mungkin adalah jpeg, jpg, gif, tiff atau png.

Perhatikan bahawa Apache PDFBox adalah alat canggih - kita dapat membuat fail PDF kita sendiri dari awal, mengisi borang di dalam fail PDF, menandatangani dan / atau menyulitkan fail PDF.

4.2. Imej ke PDF

Mari lihat contoh kod:

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 diperhatikan, bahawa kami dapat memberikan gambar sebagai file, atau memuatkannya dari URL, seperti yang ditunjukkan dalam contoh di atas. Lebih-lebih lagi, sambungan fail output yang boleh kita gunakan adalah jpeg, jpg, gif, tiff atau png.

5. Penukaran PDF ke Teks

Untuk mengekstrak teks mentah dari fail PDF, kami juga akan menggunakan Apache PDFBox lagi. Untuk penukaran teks ke PDF, kita akan menggunakan iText .

5.1. PDF ke Teks

Kami membuat kaedah bernama generatextFromPDF (…) dan membahagikannyamenjadi tiga bahagian utama: memuatkan fail PDF, pengekstrakan teks, dan pembuatan fail akhir.

Mari mulakan dengan memuatkan bahagian:

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

Untuk membaca fail PDF, kami menggunakan PDFParser , dengan pilihan "r" (baca). Lebih-lebih lagi, kita perlu menggunakan kaedah parser.parse () yang akan menyebabkan PDF diurai sebagai aliran dan dihuni ke objek COSDocument .

Mari lihat bahagian teks pengekstrakan:

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

Pada bahagian sebelumnya, kami menerangkan perpustakaan sumber terbuka. Terdapat beberapa lagi perpustakaan yang perlu diberi perhatian, tetapi ia dibayar:

  • jPDFImages - jPDFImages dapat membuat gambar dari halaman dalam dokumen PDF dan mengeksportnya sebagai gambar JPEG, TIFF, atau PNG.
  • JPEDAL - JPedal adalah SDK perpustakaan Java asli yang dikembangkan secara aktif dan sangat mampu digunakan untuk mencetak, melihat dan menukar fail
  • pdfcrowd - ini adalah perpustakaan penukaran Web / HTML ke PDF dan PDF ke Web / HTML lain, dengan GUI yang maju

8. Kesimpulannya

Dalam artikel ini, kami membincangkan cara untuk menukar fail PDF ke dalam pelbagai format .

Pelaksanaan penuh tutorial ini boleh didapati di projek GitHub - ini adalah projek berasaskan Maven. Untuk menguji, jalankan hanya contoh dan lihat hasilnya di folder output .