So sánh thư viện python pdf

Phụ đề cho bài viết này có thể dễ dàng là "Cách tạo tệp PDF bằng Python", nhưng WordPress không hỗ trợ điều đó. Dù sao đi nữa, thư viện PDF hàng đầu trong Python là Reportlab. Nó không được phân phối cùng với thư viện tiêu chuẩn, vì vậy bạn sẽ cần tải xuống nếu muốn chạy các ví dụ trong hướng dẫn này. Cũng sẽ có ít nhất một ví dụ về cách đưa hình ảnh vào PDF, điều đó có nghĩa là bạn cũng sẽ cần gói Gối [PIL]

Cài đặt

Reportlab hỗ trợ hầu hết các phương pháp cài đặt Python thông thường. Đối với Reportlab 2 cũ. x, bạn có tùy chọn tải xuống nguồn và chạy "thiết lập python. py install" hoặc chạy trình cài đặt nhị phân [trên Windows]

Đối với Reportlab 3 mới hơn. x, bây giờ bạn có thể sử dụng pip trên tất cả các nền tảng

________số 8

Lưu ý rằng Reportlab 3. x chỉ hỗ trợ Python 2. 7 và Trăn 3. 3+. Nếu bạn đang sử dụng phiên bản Python 2 cũ hơn, thì bạn phải sử dụng Reportlab 2. x

Tạo một tệp PDF đơn giản

Reportlab có tài liệu đàng hoàng. Điều tôi muốn nói là tài liệu cung cấp cho bạn vừa đủ để bắt đầu, nhưng khi bạn tìm thấy thứ gì đó hơi phức tạp để làm, bạn có thể tự mình tìm ra nó. Gần đây, họ đã thêm phần Đoạn mã vào trang web của mình, hy vọng sẽ trở thành một cuốn sách công thức gồm các mẹo và thủ thuật hay, đồng thời cũng giúp cải thiện vấn đề này. Nhưng đủ về điều đó. Hãy xem làm thế nào để thực sự tạo ra một cái gì đó

Trong Reportlab, thành phần cấp thấp nhất được sử dụng thường xuyên là đối tượng canvas từ gói pdfgen. Các chức năng trong gói này cho phép bạn "vẽ" tài liệu bằng văn bản, hình ảnh, dòng hoặc bất kỳ thứ gì. Tôi đã nghe một số người mô tả điều này giống như viết bằng PostScript. Tôi nghi ngờ nó thực sự là xấu. Theo kinh nghiệm của tôi, nó thực sự giống như sử dụng bộ công cụ GUI để bố trí các widget ở những vị trí cụ thể. Hãy xem cách hoạt động của đối tượng canvas

from reportlab.pdfgen import canvas

c = canvas.Canvas["hello.pdf"]
c.drawString[100,750,"Welcome to Reportlab!"]
c.save[]

Bạn sẽ kết thúc với một tệp PDF trông giống như thế này

Điều đầu tiên cần lưu ý về mã này là nếu chúng tôi muốn lưu tệp PDF, chúng tôi cần cung cấp tên tệp cho đối tượng Canvas. Đây có thể là đường dẫn tuyệt đối hoặc đường dẫn tương đối. Trong ví dụ này, nó sẽ tạo tệp PDF ở cùng vị trí mà bạn chạy tập lệnh từ đó. Phần tiếp theo của câu đố là phương thức drawString. Điều này sẽ vẽ văn bản bất cứ nơi nào bạn nói với nó. Khi sử dụng đối tượng canvas, nó bắt đầu ở dưới cùng bên trái của trang, vì vậy, trong ví dụ này, chúng tôi yêu cầu nó vẽ chuỗi 100 điểm từ lề trái và 750 điểm từ cuối trang [1 điểm = 1/72 . Bạn có thể thay đổi mặc định này trong hàm tạo Canvas bằng cách chuyển số 0 vào đối số từ khóa dưới cùng. Tuy nhiên, tôi không chắc chính xác điều gì sẽ xảy ra nếu bạn làm điều đó vì hướng dẫn sử dụng Reportlab không rõ ràng về chủ đề này. Tôi nghĩ nó sẽ thay đổi điểm bắt đầu ở trên cùng bên trái. Phần cuối cùng trong đoạn mã trên là lưu tệp PDF của bạn

Điều đó thật dễ dàng. Bạn vừa tạo một tệp PDF thực sự đơn giản. Lưu ý rằng kích thước Canvas mặc định là A4, vì vậy nếu bạn là người Mỹ, có thể bạn sẽ muốn thay đổi kích thước đó thành kích thước chữ. Điều này rất dễ thực hiện trong Reportlab. Tất cả những gì bạn cần làm là như sau

from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas

canvas = canvas.Canvas['myfile.pdf', pagesize=letter]
width, height = letter

Lý do chính để lấy chiều rộng và chiều cao là bạn có thể sử dụng chúng để tính toán quyết định khi nào thêm ngắt trang hoặc giúp xác định lề. Hãy xem nhanh hàm tạo cho đối tượng Canvas để xem chúng ta có những tùy chọn nào khác

def __init__[self,filename,
    pagesize=letter,
    bottomup = 1,
    pageCompression=0,
    encoding=rl_config.defaultEncoding,
    verbosity=0
    encrypt=None]:

Phần trên được lấy trực tiếp từ Hướng dẫn sử dụng Reportlab, trang 11. Bạn có thể đọc về các tùy chọn khác trong hướng dẫn của họ nếu bạn muốn biết đầy đủ chi tiết

Bây giờ hãy làm điều gì đó phức tạp và hữu ích hơn một chút

Một hình thức nhỏ, chức năng nhỏ

Trong ví dụ này, chúng tôi sẽ tạo một biểu mẫu có thể in được một phần. Theo những gì tôi có thể nói, Reportlab không hỗ trợ các biểu mẫu có thể điền được thêm vào các sản phẩm của Adobe cách đây vài năm. Dù sao, chúng ta hãy xem một số mã

from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas

canvas = canvas.Canvas["form.pdf", pagesize=letter]
canvas.setLineWidth[.3]
canvas.setFont['Helvetica', 12]

canvas.drawString[30,750,'OFFICIAL COMMUNIQUE']
canvas.drawString[30,735,'OF ACME INDUSTRIES']
canvas.drawString[500,750,"12/12/2010"]
canvas.line[480,747,580,747]

canvas.drawString[275,725,'AMOUNT OWED:']
canvas.drawString[500,725,"$1,000.00"]
canvas.line[378,723,580,723]

canvas.drawString[30,703,'RECEIVED BY:']
canvas.line[120,700,580,700]
canvas.drawString[120,703,"JOHN DOE"]

canvas.save[]

Điều này dựa trên biên lai thực tế tôi đã tạo tại nơi làm việc. Sự khác biệt chính giữa ví dụ này và ví dụ trước là canvas. mã dòng. Bạn có thể sử dụng nó để vẽ các đường trên tài liệu của mình bằng cách chuyển hai cặp X/Y. Tôi đã sử dụng chức năng này để tạo lưới, mặc dù nó khá tẻ nhạt. Các điểm quan tâm khác trong mã này bao gồm setLineWidth[. 3] lệnh cho Reportlab biết độ dày hoặc mỏng của đường kẻ;

Ví dụ tiếp theo của chúng tôi sẽ xây dựng dựa trên những gì chúng tôi đã học được cho đến nay, nhưng cũng giới thiệu cho chúng tôi khái niệm "lưu chuyển"

Trôi theo dòng chảy

Nếu bạn đang làm quảng cáo hoặc thực hiện bất kỳ loại công việc nào với các mẫu thư, thì Reportlab sẽ là một bổ sung tuyệt vời cho kho vũ khí của bạn. Chúng tôi sử dụng nó để tạo mẫu thư cho những người có vé đậu xe quá hạn. Ví dụ sau đây dựa trên một số mã tôi đã viết cho ứng dụng đó, mặc dù chữ cái hơi khác một chút. [Lưu ý rằng mã bên dưới sẽ không chạy nếu không có Thư viện hình ảnh Python]

import time
from reportlab.lib.enums import TA_JUSTIFY
from reportlab.lib.pagesizes import letter
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Image
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import inch

doc = SimpleDocTemplate["form_letter.pdf",pagesize=letter,
                        rightMargin=72,leftMargin=72,
                        topMargin=72,bottomMargin=18]
Story=[]
logo = "python_logo.png"
magName = "Pythonista"
issueNum = 12
subPrice = "99.00"
limitedDate = "03/05/2010"
freeGift = "tin foil hat"

formatted_time = time.ctime[]
full_name = "Mike Driscoll"
address_parts = ["411 State St.", "Marshalltown, IA 50158"]

im = Image[logo, 2*inch, 2*inch]
Story.append[im]

styles=getSampleStyleSheet[]
styles.add[ParagraphStyle[name='Justify', alignment=TA_JUSTIFY]]
ptext = '%s' % formatted_time

Story.append[Paragraph[ptext, styles["Normal"]]]
Story.append[Spacer[1, 12]]

# Create return address
ptext = '%s' % full_name
Story.append[Paragraph[ptext, styles["Normal"]]]       
for part in address_parts:
    ptext = '%s' % part.strip[]
    Story.append[Paragraph[ptext, styles["Normal"]]]   

Story.append[Spacer[1, 12]]
ptext = 'Dear %s:' % full_name.split[][0].strip[]
Story.append[Paragraph[ptext, styles["Normal"]]]
Story.append[Spacer[1, 12]]

ptext = 'We would like to welcome you to our subscriber base for %s Magazine! \
        You will receive %s issues at the excellent introductory price of $%s. Please respond by\
        %s to start receiving your subscription and get the following free gift: %s.' % [magName, 
                                                                                                issueNum,
                                                                                                subPrice,
                                                                                                limitedDate,
                                                                                                freeGift]
Story.append[Paragraph[ptext, styles["Justify"]]]
Story.append[Spacer[1, 12]]


ptext = 'Thank you very much and we look forward to serving you.'
Story.append[Paragraph[ptext, styles["Justify"]]]
Story.append[Spacer[1, 12]]
ptext = 'Sincerely,'
Story.append[Paragraph[ptext, styles["Normal"]]]
Story.append[Spacer[1, 48]]
ptext = 'Ima Sucker'
Story.append[Paragraph[ptext, styles["Normal"]]]
Story.append[Spacer[1, 12]]
doc.build[Story]

Chà, đó là nhiều mã hơn so với các ví dụ trước đây của chúng tôi. Chúng ta sẽ cần xem qua nó từ từ để hiểu mọi thứ đang diễn ra. Khi bạn đã sẵn sàng, chỉ cần tiếp tục đọc

Phần đầu tiên mà chúng ta cần xem xét là hàng nhập khẩu mới

from reportlab.lib.enums import TA_JUSTIFY
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Image
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import inch

Từ enums, chúng tôi nhập "TA_JUSTIFY", cho phép các chuỗi của chúng tôi có định dạng hợp lý. Có một số hằng số khác mà chúng ta có thể nhập để cho phép chúng ta canh lề phải hoặc trái cho văn bản của mình và làm những điều thú vị khác. Tiếp theo là mô-đun thú mỏ vịt [viết tắt của Page Layout and Typography Using Scripts]. Nó chứa rất nhiều mô-đun, nhưng có lẽ quan trọng nhất trong số đó là các lưu lượng, chẳng hạn như Đoạn văn. Một lưu lượng thường có các khả năng sau. quấn, vẽ và đôi khi tách. Chúng được sử dụng để làm cho việc viết các đoạn văn, bảng và các cấu trúc khác trên nhiều trang trở nên dễ dàng hơn

Lớp SimpleDocTemplate cho phép chúng tôi thiết lập lề, kích thước trang, tên tệp và một loạt các cài đặt khác cho tài liệu của chúng tôi, tất cả ở một nơi. Dấu cách rất tốt để thêm một dòng trống, chẳng hạn như ngắt đoạn. Lớp Hình ảnh sử dụng Thư viện Hình ảnh Python để cho phép dễ dàng chèn và thao tác hình ảnh trong PDF của bạn

getSampleStyleSheet nhận một tập hợp các kiểu mặc định mà chúng ta có thể sử dụng trong tệp PDF của mình. ParagraphStyle được sử dụng để đặt căn chỉnh văn bản của đoạn văn trong ví dụ này, nhưng nó có thể làm được nhiều hơn thế [xem trang 67 của hướng dẫn sử dụng]. Cuối cùng, inch là đơn vị đo lường giúp định vị các mục trên tệp PDF của bạn. Bạn có thể thấy điều này trong hành động khi chúng tôi đặt logo. Hình ảnh [logo, 2*inch, 2*inch]. Điều này có nghĩa là logo sẽ cách trên cùng hai inch và cách bên trái hai inch

Tôi không nhớ lý do tại sao các ví dụ của Reportlab lại sử dụng danh sách Câu chuyện, nhưng đó cũng là cách chúng tôi sẽ thực hiện ở đây. Về cơ bản, bạn tạo một dòng văn bản, bảng và hình ảnh hoặc bất cứ thứ gì và nối nó vào danh sách Câu chuyện. Bạn sẽ thấy điều đó xuyên suốt toàn bộ ví dụ. Lần đầu tiên chúng tôi sử dụng nó là khi chúng tôi thêm hình ảnh. Trước khi xem ví dụ tiếp theo, chúng ta sẽ cần xem cách chúng ta thêm một kiểu vào đối tượng kiểu của mình

styles.add[ParagraphStyle[name='Justify', alignment=TA_JUSTIFY]]

Lý do điều này quan trọng là vì bạn có thể sử dụng danh sách kiểu để áp dụng các cài đặt căn chỉnh đoạn khác nhau [và hơn thế nữa] cho văn bản trong tài liệu của mình. Trong đoạn mã trên, chúng ta tạo một ParagraphStyle gọi là "Justify". Tất cả những gì nó làm là biện minh cho văn bản của chúng tôi. Bạn sẽ thấy một ví dụ về điều này sau trong văn bản. Bây giờ, hãy xem một ví dụ nhanh

ptext = '%s' % formatted_time
Story.append[Paragraph[ptext, styles["Normal"]]]

Đối với dòng văn bản đầu tiên của chúng tôi, chúng tôi sử dụng lớp Đoạn văn. Như bạn có thể thấy, lớp Đoạn văn chấp nhận một số thẻ giống như HTML. Trong trường hợp này, chúng tôi đặt kích thước điểm của phông chữ thành 12 và sử dụng kiểu thông thường [được căn trái, trong số những thứ khác]. Phần còn lại của ví dụ gần như giống nhau, chỉ với các miếng đệm được ném vào đây và đó. Cuối cùng, chúng tôi gọi doc. xây dựng để tạo tài liệu

kết thúc

Bây giờ bạn đã biết những điều cơ bản để tạo tệp PDF bằng Python bằng Reportlab. Mặc dù vậy, chúng tôi thậm chí còn chưa tìm hiểu sơ bộ về tất cả những gì bạn có thể làm với Reportlab. Một số ví dụ bao gồm bảng, biểu đồ, phân trang, in đè màu, siêu liên kết, đồ họa và nhiều hơn nữa. Tôi thực sự khuyên bạn nên tải xuống mô-đun cùng với hướng dẫn sử dụng của nó và dùng thử

Chủ Đề