Bạn đang cần sắp xếp lại nội dung trong một tài liệu PDF, di chuyển các phần tử sang vị trí mới trên một trang có kích thước khác mà không muốn làm giảm chất lượng? Một mục tiêu quan trọng là tránh “raster hóa” tài liệu – tức là chữ phải giữ nguyên dạng ký tự (không phải ảnh chụp ký tự) và mọi hình ảnh trong PDF gốc cần được bảo toàn chất lượng, không bị lấy mẫu lại. Phương pháp “I Move PDF” được trình bày dưới đây sử dụng các công cụ dòng lệnh mạnh mẽ như pdftk, pdfcropimagemagick để đạt được điều này, đảm bảo chất lượng vector và hình ảnh gốc được duy trì.

Về cơ bản, quy trình “i move PDF” này bao gồm các bước chính:

  1. Tách từng phần nội dung cần di chuyển từ file PDF gốc thành các file PDF riêng biệt.
  2. Tạo một file PDF trắng với kích thước cuối cùng mong muốn.
  3. Sử dụng phiên bản pdftk đã được tùy chỉnh để “đặt” các phần đã tách lên tài liệu PDF trắng theo vị trí đã định.

Mặc dù có vẻ có thể bỏ qua bước 1 và thực hiện trực tiếp trong bước 3, việc tách riêng giúp quản lý dễ dàng hơn, đặc biệt khi cần cắt (crop) trang trước khi ghép vào tài liệu đích.

Các bước thực hiện chi tiết để “i move PDF”

Để thực hiện việc sắp xếp lại bố cục PDF hay “i move PDF”, bạn cần thực hiện tuần tự các bước sau đây trên môi trường dòng lệnh (terminal hoặc command prompt).

Chuẩn bị môi trường làm việc

Đầu tiên, hãy tạo một thư mục riêng để chứa các file tạm và file kết quả, giúp quá trình quản lý trở nên gọn gàng hơn.

  1. Tạo và truy cập thư mục làm việc:
    mkdir pdftk && cd pdftk;
  2. Sao chép file PDF gốc vào thư mục này (ví dụ: ticket.pdf từ thư mục Tải về):
    cp ~/Downloads/ticket.pdf .;

Tạo file PDF trống theo kích thước mong muốn

Bạn cần một file PDF trắng đóng vai trò như “khung nền” cho nội dung sẽ được di chuyển vào. Công cụ imagemagick có thể làm điều này.

  1. Tạo file PDF trắng kích thước Letter (thay Letter bằng kích thước khác nếu cần, ví dụ: A4):
    magick xc:none -page Letter blank.pdf;

    Lệnh này tạo ra một file blank.pdf trống, trong suốt với kích thước trang là Letter.

Tách và cắt các trang PDF cần thiết

Tiếp theo, tách các trang hoặc phần trang bạn muốn di chuyển từ file PDF gốc và cắt bỏ những phần không cần thiết.

  1. Tách trang 1 từ file gốc (làm tương tự cho các trang khác, ví dụ trang 2):
    pdftk ticket.pdf cat 1 output ticket-p1.pdf

    Lệnh này sử dụng pdftk gốc để trích xuất trang 1 từ ticket.pdf và lưu thành ticket-p1.pdf.

  2. Cắt bỏ lề không mong muốn khỏi trang đã tách. Ví dụ này cắt bỏ 440 điểm ảnh từ phía dưới trang:
    pdfcrop --margins '0 0 0 -440' ticket-p1.pdf ticket-p1-cropped.pdf

    Lệnh này dùng pdfcrop để tạo ticket-p1-cropped.pdf chỉ chứa phần nội dung bạn cần giữ lại. Lặp lại bước 4 và 5 cho các phần khác (ví dụ: ticket-p2.pdfticket-p2-cropped.pdf).

Chỉnh sửa và biên dịch pdftk-java

Đây là bước cốt lõi để thực hiện “i move PDF” bằng cách tùy chỉnh vị trí đặt nội dung. Chúng ta sẽ sử dụng phiên bản pdftk-java và sửa đổi mã nguồn của nó.

  1. Tải mã nguồn pdftk-java từ GitLab:

    git clone 'https://gitlab.com/pdftk-java/pdftk.git' source;
  2. Truy cập thư mục mã nguồn và chuyển sang nhánh chính:

    cd source && git checkout origin/master
  3. Biên dịch thử lần đầu để đảm bảo môi trường (JDK, Maven) đã sẵn sàng:

    mvn package -DskipTests=true

    Nếu có lỗi, hãy khắc phục (đảm bảo JDK đúng phiên bản, Maven đã cài đặt và nằm trong PATH).

  4. Áp dụng bản vá (patch) sau vào file java/com/gitlab/pdftk_java/filter.java. Bản vá này thay đổi cách pdftk tính toán vị trí đặt nội dung (tham số trans). Mở file filter.java và thực hiện thay đổi hoặc dùng lệnh patch:

    diff --git a/java/com/gitlab/pdftk_java/filter.java b/java/com/gitlab/pdftk_java/filter.java
    index c2b92d5..dea82e9 100644
    --- a/java/com/gitlab/pdftk_java/filter.java
    +++ b/java/com/gitlab/pdftk_java/filter.java
    @@ -415,7 +415,7 @@ class filter {
                float[] trans = null;
                if (mark_page_rotation == 0) {
                    // trans = new float[] {mark_scale, 0, 0, mark_scale, h_trans, v_trans};
    -               trans = new float[] {1, 0, 0, 1, (float)40, (float)450};
    +               trans = new float[] {1, 0, 0, 1, (float)40, (float)450}; // Ví dụ: giữ nguyên tỷ lệ, dịch 40 theo X, 450 theo Y
                } else if (mark_page_rotation == 90) {
                    trans = new float[] {
    

    Giải thích: Dòng có dấu - là dòng gốc, dòng có dấu + là dòng thay thế. Thay vì sử dụng mark_scale, h_trans, v_trans mặc định, chúng ta cố định ma trận biến đổi trans. Các giá trị (float)40(float)450 là tọa độ (x, y) để dịch chuyển nội dung trên trang đích. Bạn cần điều chỉnh các giá trị này cho phù hợp với vị trí mong muốn của phần PDF đầu tiên.

Sử dụng pdftk đã chỉnh sửa để ghép nội dung

Sau khi chỉnh sửa mã nguồn, hãy biên dịch lại và sử dụng pdftk-java đã tùy chỉnh để đặt các phần đã cắt lên file PDF trống.

  1. Biên dịch lại pdftk-java với mã nguồn đã vá:
    mvn package -DskipTests=true
  2. Chạy pdftk-java đã biên dịch để đặt phần đầu tiên (ticket-p1-cropped.pdf) lên nền (blank.pdf):
    cd target/
    java -jar pdftk-java-*.jar ../../blank.pdf background ../../ticket-p1-cropped.pdf output ../../phase1.pdf

    Lệnh này tạo ra phase1.pdf chứa nền trống và nội dung của ticket-p1-cropped.pdf tại vị trí được xác định trong filter.java.

  3. (Quan trọng) Nếu phần thứ hai (ticket-p2-cropped.pdf) cần đặt ở vị trí khác, bạn phải quay lại bước 9, sửa đổi lại các giá trị tọa độ trong filter.java (ví dụ: (float)40, (float)50), sau đó biên dịch lại (bước 10).
  4. Chạy pdftk-java lần nữa để đặt phần thứ hai lên kết quả của bước trước (phase1.pdf):
    java -jar pdftk-java-*.jar ../../phase1.pdf background ../../ticket-p2-cropped.pdf output ../../phase2.pdf

    Lệnh này tạo ra file phase2.pdf là kết quả cuối cùng, chứa cả hai phần nội dung đã được “i move PDF” vào các vị trí mong muốn trên trang Letter.

Đánh giá và Tổng kết

Phương pháp “i move PDF” sử dụng pdftk-java tùy chỉnh, pdfcropimagemagick cung cấp một giải pháp mạnh mẽ để sắp xếp lại bố cục tài liệu PDF mà không làm mất chất lượng gốc. Ưu điểm chính là khả năng giữ nguyên văn bản dưới dạng vector và bảo toàn hình ảnh gốc, đồng thời cho phép kiểm soát chính xác vị trí của từng phần tử thông qua việc sửa đổi mã nguồn pdftk-java.

Tuy nhiên, quy trình này đòi hỏi người dùng phải quen thuộc với dòng lệnh, cài đặt và sử dụng các công cụ như Git, Maven, Java Development Kit (JDK), Imagemagick và TeX Live (cho pdfcrop). Việc chỉnh sửa và biên dịch lại mã nguồn Java có thể là rào cản với người dùng không chuyên.

Đây là một kỹ thuật phù hợp cho các tác vụ cần độ chính xác cao trong việc bố trí lại nội dung PDF hoặc khi cần tự động hóa quy trình xử lý hàng loạt tài liệu.

Tải công cụ và thử nghiệm

Để thực hiện quy trình “i move PDF” này, bạn cần cài đặt các công cụ sau:

  • pdftk-java: Tải mã nguồn từ GitLab pdftk-java. Bạn cũng cần cài đặt Git, MavenJDK (Java Development Kit) để biên dịch.
  • pdfcrop: Thường đi kèm với các bản phân phối TeX như TeX Live hoặc MiKTeX.
  • Imagemagick: Tải về từ trang chủ Imagemagick.

Sau khi cài đặt đầy đủ công cụ, bạn có thể thực hiện lại các bước trên để tự mình trải nghiệm quy trình “i move PDF” và điều chỉnh tọa độ trong filter.java cho phù hợp với nhu cầu cụ thể của mình.

TẢI SÁCH PDF NGAY