+3

Read and write PDF files in Java using Apache PDFBox

eyecatch-pdfbox.png

Apache PDFBox - Một thư viện PDF Java

Thư viện Apache PDFBox là một công cụ mã nguồn mở Java làm việc với các văn bản PDF. Nó cung cấp cho người dùng khả năng tạo mới các văn bản PDF, thao tác trên các file PDF đã có và khả năng trích xuất nội dung từ các văn bản PDF. Hiện nay Apache PDFBox được phát hành mới nhất theo phiên bản v2.0 của Apache.

Cài đặt

  • Trước hết các bạn vào link PDFBox library, sau đó download về máy phiên bản mới nhất của pdfbox-app.jar, ở đây mình chọn pdfbox-app-2.0.0-RC2.jar.
  • Sau đó, các bạn tiến hành thêm thư viện này vào project Java của mình: Chuột phải chọn Build Path >> Add External Archives >> Select pdfbox-app-2.0.0-RC2.jar >> OK.
  • Như vậy bạn đã có thể làm việc được với thư viện này rồi đó (yeah)

Làm việc với PDFBox

Tạo một file PDF mới (chỉ có một trang trống)

Các bước cần phải làm để tạo một file Blank PDF:

  • Tạo một file PDF (sử dụng PDDocument)
  • Thêm một page ( sử dụng PDPage)
  • Save and close file PDF đó
import org.apache.pdfbox.pdmodel.*;
import java.io.*;

public class BlankPDF {
    public static void main(String[] args) {
        PDDocument doc = null;
        try{
            doc = new PDDocument();
            doc.addPage(new PDPage());
            doc.save("empty_doc.pdf");
            doc.close();
        } catch (Exception ex){
            System.out.println(ex);
        }
    }
}

Tạo một file PDF mới (với text)

Các bước tạo để tạo một file PDF with text:

  • Tạo file và thêm page (như trên)
  • Thêm nội dung cho trang sử dụng PDPageContentStream và một số hàm sau đây:
    • beginText()
    • Thiết lập kiểu chữ và màu chữ cho text sử dụng setFont()setNonStrokingColor()
    • Xác định vị trí của text sử dụng moveTextPositionByAmount()
    • Nhập text với drawString()
    • endText()close()
  • Save và close file PDF đó
import org.apache.pdfbox.pdmodel.*;
import org.apache.pdfbox.pdmodel.font.PDFont;
import org.apache.pdfbox.pdmodel.font.PDType1Font;

import java.awt.Color;
import java.io.*;

public class PDFWithText {
    public static void main(String[] args) {
    	PDDocument doc = null;
        PDPage page = null;

        try {
	    	doc = new PDDocument();
	        page = new PDPage();

	        doc.addPage(page);
	        PDFont font = PDType1Font.HELVETICA_BOLD;

	        PDPageContentStream content = new PDPageContentStream(doc, page);
	        content.beginText();
	        content.setFont( font, 20 );
	        content.setNonStrokingColor(Color.BLUE);
	        content.moveTextPositionByAmount( 100, 700 );
	        content.drawString("Hello It's me");

	        content.endText();
	        content.close();

	        doc.save("pdf_with_text.pdf");
	        doc.close();
		} catch (Exception ex) {
			System.out.println(ex);
		}
    }
}

Và đây là thành quả của chúng ta sau khi chạy code ở trên ^_^

Screenshot from 2015-12-31 11:07:46.png

Trích xuất nội dung của một file PDF

Để trích xuất nội dung của một file PDF ta sử dụng class PDFTextStripper. Các bước cần phải làm:

  • load file PDF đã có sử dụng hàm load của PDDocument
  • thiết lập trang đầu và trang cuối cần để trích xuất nội dung, sử dụng setStartPage()setEndPage() trong class PDFTextStripper
  • ghi nội dung đó ra một file txt, sử dụng hàm writeText()
import org.apache.pdfbox.pdmodel.*;
import org.apache.pdfbox.text.PDFTextStripper;

import java.awt.Color;
import java.io.*;

public class ExtractContentFromPDF {
    public static void main(String[] args) {
    	PDDocument doc;
    	BufferedWriter bw;
        try {
        	File input = new File("pdf_with_text.pdf");
        	File output = new File("pdf_with_text_copy.txt");
	    	doc = PDDocument.load(input);

	    	System.out.println(doc.getNumberOfPages());
	    	PDFTextStripper stripper = new PDFTextStripper();
	    	stripper.setStartPage(1);
	    	stripper.setEndPage(2);
            // nếu bạn muốn lấy tất cả text của cả file pdf thì sử dụng code sau
            // stripper.setEndPage(doc.getNumberOfPages())
	    	bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(output)));
	    	stripper.writeText(doc, bw);

	    	bw.close();
	        doc.close();
		} catch (Exception ex) {
			System.out.println(ex);
		}
    }
}

Screenshot from 2015-12-31 13:20:54.png

Convert một file ảnh thành một file PDF

Các bước để thực hiện convert một file ảnh thành một file PDF:

  • Tạo file và thêm page (như trên)
  • Sử dụng class JPEGFactory để tạo một PDImageXObject chứa ảnh JPEG đã được nén
  • Tạo một content stream từ PDPageContentStream liên quan đến văn bản và trang sẽ chứa ảnh
  • Sử dụng hàm drawImage trong PDPageContentStream để vẽ ảnh lên trang văn bản bao gồm vị trí và kích thước
import org.apache.pdfbox.pdmodel.*;
import org.apache.pdfbox.pdmodel.graphics.image.JPEGFactory;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import java.awt.Color;
import java.io.*;

public class ConvertImageToPDF {
    public static void main(String[] args) {
    	PDDocument doc;
        try {
        	doc = new PDDocument();
            PDPage page = new PDPage();
            doc.addPage(page);

            PDImageXObject image = JPEGFactory.createFromStream(doc, new FileInputStream("background.jpeg"));

            PDPageContentStream content = new PDPageContentStream(doc, page);
            content.drawImage(image, 100, 500, 480, 270);
            content.close();

            doc.save("image_pdf.pdf");
		} catch (Exception ex) {
			System.out.println(ex);
		}
    }
}

Và sau đây là thành quả khi chạy codes ở trên (yeah) : Screenshot from 2015-12-31 14:28:49.png

Trên đây, mình đã giới thiệu qua về việc đọc và ghi file PDF sử dụng thư viện Apache PDFBox, hi vọng nó sẽ giúp ích được cho bạn đọc (hehe).

Tài liệu tham khảo

  1. PDFBox-Tutorial
  2. Apache PDFBox API

All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí