Tôi biết đây là một câu hỏi cũ. Trong trường hợp của tôi, tôi sử dụng báo cáo.
Kích thước tấm được biểu thị bằng các điểm, không phải pixel, với một điểm bằng 1/72 inch. Một tờ A4 được tạo thành từ 595,2 điểm chiều rộng và chiều cao 841,8 điểm. Nguồn gốc của tọa độ vị trí [0, 0] nằm ở góc dưới bên trái. Khi tạo một thể hiện của canvas.canvas, bạn có thể chỉ định kích thước của các tấm bằng tham số Pagesize, vượt qua một phần tử có phần tử đầu tiên biểu thị chiều rộng tính theo điểm và chiều cao thứ hai. Phương thức c.ShowPage [] cho báo cáo rằng nó đã hoàn thành hoạt động trên bảng hiện tại và chuyển sang mẫu tiếp theo. Mặc dù một tờ thứ hai chưa được thực hiện [và sẽ không xuất hiện trong tài liệu miễn là không có gì được rút ra], thật tốt khi nhớ làm như vậy trước khi gọi c.save []. Để chèn hình ảnh vào tài liệu PDF, ReportLab sử dụng thư viện gối. Phương thức DrawImage [] lấy đối số của nó, đường dẫn của hình ảnh [hỗ trợ nhiều định dạng như PNG, JPEG và GIF] và vị trí [x, y] theo cách mà bạn muốn chèn. Hình ảnh có thể được giảm hoặc mở rộng cho thấy kích thước của nó thông qua các đối số chiều rộng và chiều cao.
Mã sau đây cung cấp tên tệp PDF, liệt kê các tệp PNG, tọa độ để chèn hình ảnh cũng như kích thước để phù hợp với các trang chữ cái chân dung.
def pntopd[file, figs, x, y, wi, he]:
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4, letter, landscape, portrait
w, h = letter
c = canvas.Canvas[str[file], pagesize=portrait[letter]]
for png in figs:
c.drawImage[png, x, h - y, width=wi, height=he]
c.showPage[]
c.save[]
from datetime import date
from pathlib import Path
ruta = "C:/SQLite"
today = date.today[]
dat_dir = Path[ruta]
tit = today.strftime["%y%m%d"] + '_ParameterAudit'
pdf_file = tit + ".pdf"
pdf_path = dat_dir / pdf_file
pnglist = ['C0.png', 'C4387.png', 'C9712.png', 'C9685.png', 'C4364.png']
pntopd[pdf_path, pnglist, 50, 550, 500, 500]
Nhiều lần, bạn bắt gặp nhu cầu kết hợp nhiều tệp hình ảnh [.jpg, .png, v.v.] thành một định dạng tài liệu di động duy nhất [.pdf]. Có lẽ, bạn có một loạt các ghi chú viết tay mà bạn muốn tổ chức thành một tệp. Làm điều đó là rất tầm thường nếu bạn biết Python. Để được với, bạn phải cài đặt thư viện fpdf
:
Điều đầu tiên bạn làm là tạo đối tượng FPDF[]
và đặt thư mục nguồn nơi bạn có hình ảnh được lưu trữ. sdir
là biến đó. Bạn cũng cần đặt hai biến để chụp chiều cao và chiều rộng của hình ảnh tương ứng.
import os from PIL import Image from fpdf import FPDF pdf = FPDF[] sdir = "imageFolder/" w,h = 0,0
Sau đó đến phần vòng lặp. Điều này giúp mọi thứ dễ dàng hơn nếu bạn có các tệp hình ảnh có tên serer theo thứ tự số [IMG001.png, IMG002.png, v.v.]. Mặt khác, bạn có thể điều chỉnh mã này để xử lý theo cách thủ công hoặc tuần tự chúng bằng cách đặt biến fname
:
for i in range[1, 100]: fname = sdir + "IMG%.3d.png" % i if os.path.exists[fname]: if i == 1: cover = Image.open[fname] w,h = cover.size pdf = FPDF[unit = "pt", format = [w,h]] image = fname pdf.add_page[] pdf.image[image,0,0,w,h] else: print["File not found:", fname] print["processed %d" % i] pdf.output["output.pdf", "F"] print["done"]
Đầu ra của quá trình trên sẽ được lưu trữ trong một tệp "đầu ra.pdf" duy nhất. Vì vậy, điều đó khá đẹp và dễ dàng, phải không? Đây là toàn bộ mã.
import os from PIL import Image from fpdf import FPDF pdf = FPDF[] sdir = "imageFolder/" w,h = 0,0 for i in range[1, 100]: fname = sdir + "IMG%.3d.png" % i if os.path.exists[fname]: if i == 1: cover = Image.open[fname] w,h = cover.size pdf = FPDF[unit = "pt", format = [w,h]] image = fname pdf.add_page[] pdf.image[image,0,0,w,h] else: print["File not found:", fname] print["processed %d" % i] pdf.output["output.pdf", "F"] print["done"]