Fillpdf Python

Các biểu mẫu có thể điền đã là một phần của định dạng PDF của Adobe trong nhiều năm. Một trong những ví dụ nổi tiếng nhất về các biểu mẫu có thể điền được ở Hoa Kỳ là các tài liệu từ Sở Thuế vụ. Có rất nhiều biểu mẫu của chính phủ sử dụng biểu mẫu có thể điền. Có nhiều cách tiếp cận khác nhau để điền vào các biểu mẫu này theo chương trình. Phương pháp tốn nhiều thời gian nhất mà tôi từng nghe là chỉ tạo lại biểu mẫu trong ReportLab bằng tay rồi điền vào. Thành thật mà nói, tôi nghĩ đây có lẽ là ý tưởng tồi tệ nhất, trừ khi công ty của bạn chịu trách nhiệm tạo các tệp PDF. Sau đó, đó có thể là một tùy chọn khả thi vì khi đó bạn có toàn quyền kiểm soát việc tạo PDF và các đầu vào cần đưa vào đó

Tạo một biểu mẫu đơn giản

Chúng tôi cần một biểu mẫu đơn giản để sử dụng cho ví dụ đầu tiên của chúng tôi. ReportLab có hỗ trợ tích hợp để tạo các biểu mẫu tương tác, vì vậy hãy sử dụng ReportLab để tạo một biểu mẫu đơn giản. Đây là mã

# simple_form.py

from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfform
from reportlab.lib.colors import magenta, pink, blue, green

def create_simple_form[]:
    c = canvas.Canvas['simple_form.pdf']
    
    c.setFont["Courier", 20]
    c.drawCentredString[300, 700, 'Employment Form']
    c.setFont["Courier", 14]
    form = c.acroForm
    
    c.drawString[10, 650, 'First Name:']
    form.textfield[name='fname', tooltip='First Name',
                   x=110, y=635, borderStyle='inset',
                   borderColor=magenta, fillColor=pink, 
                   width=300,
                   textColor=blue, forceBorder=True]
    
    c.drawString[10, 600, 'Last Name:']
    form.textfield[name='lname', tooltip='Last Name',
                   x=110, y=585, borderStyle='inset',
                   borderColor=green, fillColor=magenta, 
                   width=300,
                   textColor=blue, forceBorder=True]
    
    c.drawString[10, 550, 'Address:']
    form.textfield[name='address', tooltip='Address',
                   x=110, y=535, borderStyle='inset',
                   width=400, forceBorder=True]
    
    c.drawString[10, 500, 'City:']
    form.textfield[name='city', tooltip='City',
                   x=110, y=485, borderStyle='inset',
                   forceBorder=True]
    
    c.drawString[250, 500, 'State:']
    form.textfield[name='state', tooltip='State',
                   x=350, y=485, borderStyle='inset',
                   forceBorder=True]
    
    c.drawString[10, 450, 'Zip Code:']
    form.textfield[name='zip_code', tooltip='Zip Code',
                   x=110, y=435, borderStyle='inset',
                   forceBorder=True]
    
    c.save[]
    
if __name__ == '__main__':
    create_simple_form[]

Khi bạn chạy ví dụ này, biểu mẫu PDF tương tác trông như thế này

Bây giờ chúng ta đã sẵn sàng để tìm hiểu một trong những cách mà chúng ta có thể điền vào biểu mẫu này

Hợp nhất lớp phủ

Jan Chęć đã viết một bài báo trên Medium có một số cách tiếp cận khác nhau cho vấn đề điền biểu mẫu trong tệp PDF. Giải pháp đầu tiên được đề xuất là lấy một biểu mẫu chưa được điền trong PDF và tạo một tệp PDF riêng bằng ReportLab có dữ liệu mà chúng tôi muốn chúng tôi "điền" vào biểu mẫu này. Sau đó, tác giả đã sử dụng pdfrw để hợp nhất hai tệp PDF lại với nhau. Về mặt lý thuyết, bạn cũng có thể sử dụng PyPDF2 cho quá trình hợp nhất. Hãy tiếp tục và xem cách phương pháp này có thể hoạt động bằng cách sử dụng gói pdfrw

Hãy bắt đầu bằng cách cài đặt pdfrw

python -m pip install pdfrw

Bây giờ chúng ta đã cài đặt xong, hãy tạo một tệp có tên fill_by_overlay. py. Chúng tôi sẽ thêm hai chức năng vào tập tin này. Chức năng đầu tiên sẽ tạo lớp phủ của chúng tôi. Hãy kiểm tra xem

# fill_by_overlay.py

import pdfrw
from reportlab.pdfgen import canvas


def create_overlay[]:
    """
    Create the data that will be overlayed on top
    of the form that we want to fill
    """
    c = canvas.Canvas['simple_form_overlay.pdf']
    
    c.drawString[115, 650, 'Mike']
    c.drawString[115, 600, 'Driscoll']
    c.drawString[115, 550, '123 Greenway Road']
    c.drawString[115, 500, 'Everytown']
    c.drawString[355, 500, 'IA']
    c.drawString[115, 450, '55555']
    
    c.save[]

Ở đây chúng tôi nhập gói pdfrw và chúng tôi cũng nhập mô-đun phụ canvas từ ReportLab. Sau đó, chúng tôi tạo một hàm có tên là create_overlay để tạo một tệp PDF đơn giản bằng cách sử dụng lớp Canvas của ReportLab. Chúng tôi chỉ sử dụng phương thức canvas drawString. Điều này sẽ mất một số thử nghiệm và lỗi. May mắn thay, trên Linux và Mac, có những ứng dụng Trình xem trước PDF phù hợp mà bạn có thể sử dụng để giữ cho tệp PDF luôn mở và chúng sẽ tự động làm mới với mỗi thay đổi. Điều này rất hữu ích trong việc tìm ra tọa độ chính xác mà bạn cần để vẽ các chuỗi của mình tới. Vì chúng tôi đã tạo biểu mẫu ban đầu, nên việc tìm ra phần bù cho lớp phủ thực sự khá dễ dàng. Chúng tôi đã biết vị trí của các thành phần biểu mẫu trên trang, vì vậy chúng tôi có thể đoán chính xác vị trí để vẽ các chuỗi

Phần tiếp theo của câu đố thực sự là hợp nhất lớp phủ mà chúng tôi đã tạo ở trên với biểu mẫu mà chúng tôi đã tạo trong phần trước. Hãy viết chức năng đó tiếp theo

def merge_pdfs[form_pdf, overlay_pdf, output]:
    """
    Merge the specified fillable form PDF with the 
    overlay PDF and save the output
    """
    form = pdfrw.PdfReader[form_pdf]
    olay = pdfrw.PdfReader[overlay_pdf]
    
    for form_page, overlay_page in zip[form.pages, olay.pages]:
        merge_obj = pdfrw.PageMerge[]
        overlay = merge_obj.add[overlay_page][0]
        pdfrw.PageMerge[form_page].add[overlay].render[]
        
    writer = pdfrw.PdfWriter[]
    writer.write[output, form]
    
    
if __name__ == '__main__':
    create_overlay[]
    merge_pdfs['simple_form.pdf', 
               'simple_form_overlay.pdf', 
               'merged_form.pdf']

Ở đây, chúng tôi mở cả tệp PDF biểu mẫu và lớp phủ bằng cách sử dụng các lớp PdfReader của pdfrw. Sau đó, chúng tôi lặp lại các trang của cả hai tệp PDF và hợp nhất chúng lại với nhau bằng PageMerge. Ở cuối mã, chúng tôi tạo một phiên bản PdfWriter mà chúng tôi sử dụng để viết tệp PDF mới được hợp nhất ra. Kết quả cuối cùng sẽ giống như thế này

Ghi chú. Khi tôi chạy mã này, tôi đã nhận được một số lỗi trên thiết bị xuất chuẩn. Đây là một ví dụ

[ERROR] tokens.py:226 stream /Length attribute [171] appears to be too small [size 470] -- adjusting [line=192, col=1]

Như tôi đã đề cập, điều này không thực sự ngăn PDF được hợp nhất được tạo. Nhưng bạn có thể muốn để mắt đến những thứ này vì chúng có thể gợi ý về một vấn đề nếu bạn gặp bất kỳ vấn đề nào

Các cách khác để điền vào biểu mẫu

Tôi đã đọc về một số cách khác để "điền" các trường trong các loại tệp PDF này. Một trong số đó là lấy một tệp PDF và lưu các trang dưới dạng một loạt hình ảnh. Sau đó, vẽ hình chữ nhật tại các vị trí bạn muốn thêm văn bản và sau đó sử dụng hình ảnh mới của bạn làm tệp cấu hình để điền vào tệp PDF. Có vẻ hơi lập dị và thành thật mà nói, tôi không muốn đi làm tất cả những công việc đó

Một phương pháp tốt hơn là mở tệp PDF trong trình chỉnh sửa PDF nơi bạn có thể thêm các trường chỉ đọc vô hình. Bạn có thể gắn nhãn các trường bằng tên duy nhất và sau đó truy cập chúng qua siêu dữ liệu của PDF. Lặp lại siêu dữ liệu và sử dụng các phương thức canvas của ReportLab để tạo lại lớp phủ và sau đó hợp nhất nó theo cách tương tự như trước đây

Tôi cũng đã thấy nhiều người nói về việc sử dụng Định dạng dữ liệu biểu mẫu hoặc FDF. Đây là định dạng mà các tệp PDF phải sử dụng để chứa dữ liệu đó sẽ được điền vào một tệp PDF. Bạn có thể sử dụng PyPDFtk và PdfJinja để điền vào biểu mẫu. Thật thú vị, PyPDFtk không hoạt động với các trường hình ảnh, chẳng hạn như nơi bạn có thể muốn dán hình ảnh chữ ký. Bạn có thể sử dụng PdfJinja cho mục đích này. Tuy nhiên, PdfJinja dường như có một số hạn chế khi làm việc với hộp kiểm và hộp radio

Bạn có thể đọc thêm về các chủ đề này tại các liên kết sau

Sử dụng Gói pdfforms

Gói mà tôi nghĩ hứa hẹn nhất về tính đơn giản để sử dụng là gói pdfforms mới. Tuy nhiên, nó yêu cầu bạn phải cài đặt một ứng dụng đa nền tảng có tên là pdftk. May mắn thay, pdftk miễn phí nên đó không thực sự là vấn đề

Bạn có thể cài đặt pdfforms bằng cách sử dụng pip như thế này

python -m pip install pdfforms

Để sử dụng pdfforms, trước tiên bạn phải yêu cầu nó kiểm tra tệp PDF có chứa biểu mẫu để nó biết cách điền vào. Bạn có thể làm kiểm tra như thế này

pdfforms inspect simple_form.pdf

Nếu pdfforms hoạt động chính xác, nó sẽ tạo một tệp PDF "đã điền" trong thư mục con "kiểm tra" của nó. Thư mục con này xuất hiện bên cạnh vị trí của pdfforms chứ không phải nơi bạn chạy nó từ đó. Nó sẽ điền vào biểu mẫu với các số theo thứ tự tuần tự. Đây là những số trường

Điều tiếp theo bạn làm là tạo tệp CSV trong đó cột và hàng đầu tiên chứa tên của tệp PDF. Các hàng khác trong cột đầu tiên tương ứng với số trường. Bạn nhập số ô muốn điền vào đây. Sau đó, bạn nhập dữ liệu bạn muốn điền vào biểu mẫu trong cột thứ ba của tệp CSV của bạn. Cột thứ hai bị bỏ qua, vì vậy bạn có thể đặt mô tả tại đây. Tất cả các cột sau cột thứ ba cũng bị bỏ qua, vì vậy chúng có thể được sử dụng cho bất cứ điều gì bạn muốn

Đối với ví dụ này, tệp CSV của bạn có thể trông giống như thế này

simple_form.pdf,,,
1,first name,Mike
2,last name,Driscoll

Khi bạn đã điền vào CSV, bạn có thể chạy lệnh sau để thực sự điền vào biểu mẫu của mình bằng dữ liệu tùy chỉnh

________số 8

Tệp PDF đã điền sẽ xuất hiện trong thư mục con được gọi là đã điền theo mặc định

Bây giờ đến tin xấu. Tôi không thể làm cho ứng dụng này hoạt động chính xác trên Windows hoặc Mac. Tôi có bước kiểm tra để hoạt động trên Windows, nhưng trên Mac thì nó chỉ bị treo. Trên Windows, khi tôi chạy lệnh điền, nó chỉ bị lỗi với lỗi không tìm thấy tệp PDF để điền

Tôi nghĩ khi gói này trở nên ít bị lỗi hơn, nó sẽ thực sự tuyệt vời. Nhược điểm lớn duy nhất ngoài việc gặp sự cố khi chạy là bạn cần cài đặt công cụ của bên thứ 3 hoàn toàn không được viết bằng Python

kết thúc

Sau khi xem xét nhiều tùy chọn khác nhau có sẵn cho nhà phát triển Python để điền biểu mẫu PDF, tôi nghĩ phương pháp đơn giản nhất là tạo lớp phủ và sau đó hợp nhất nó với biểu mẫu PDF có thể điền bằng công cụ như pdfrw. Mặc dù điều này có vẻ giống như một vụ hack, nhưng các phương pháp khác mà tôi đã thấy dường như cũng khó và tốn thời gian không kém. Khi bạn có vị trí của một trong các ô trong biểu mẫu, bạn có thể tính toán hợp lý phần lớn các ô khác trên trang

Làm cách nào để làm việc với PDF trong python?

Trích xuất thông tin tài liệu từ PDF bằng Python. Xoay trang. Hợp nhất các tệp PDF. Tách các tệp PDF. .
đầu vào_pdf. đường dẫn tệp PDF được đánh dấu mờ
đầu ra. đường dẫn bạn muốn lưu phiên bản PDF có hình mờ
Chữ ký ảnh. một tệp PDF có chứa hình ảnh hoặc văn bản hình mờ của bạn

PyPDF3 là gì?

PyPDF3 là gì? . Nó được xây dựng để giúp với những điều sau đây. Trích xuất thông tin tài liệu [tiêu đề, tác giả, v.v. ]. Tách tài liệu theo từng trang. a pure-python library built as a PDF toolkit. It was built to help with the following: Extracting document information [title, author, etc.]. Splitting documents page by page.

Chủ Đề