SVG ReportLab: Giữ đường dẫn logo sắc nét trong PDF tạo tự động
Đặt logo SVG vào PDF ReportLab bằng svglib, giữ tỷ lệ và kiểm tra tệp hoàn thiện về đường dẫn vector, kích thước đúng cùng chi tiết bị mất.
Trên trang này
Dùng svglib.svg2rlg() để đọc SVG thành Drawing của ReportLab, rồi đặt hình vẽ bằng renderPDF.draw(). Cho nó hộp đã đo trên trang và dùng cùng một hệ số tỷ lệ cho hai trục. Điều này giữ hình học logo phù hợp thành chỉ dẫn vẽ PDF thay vì chèn ảnh chụp bitmap.
Với bản xuất độc lập không có bố cục tài liệu, quy trình kích thước CairoSVG đối chiếu pixel PNG, kích thước trang PDF và DPI.
Phép thử hữu ích là PDF hoàn thiện: biểu tượng có giữ tỷ lệ, màu và lỗ nhỏ ở kích thước tài liệu cần không? Lệnh gọi Python thành công không trả lời các câu hỏi đó. Ví dụ dưới đặt cùng biểu tượng tự tạo hai lần rồi kiểm tra tệp tạo ra.
Nếu logo đã là hình vector chỉnh sửa được, bắt đầu từ đó. Nếu chỉ còn PNG hoặc JPG, khôi phục bản gốc vector trước khi dựng tài liệu. Ảnh chụp và biểu đồ số liệu cần quyết định nguồn khác.
Nhập phần hình thành đối tượng vẽ
Quy trình được svglib mô tả chuyển SVG thành đối tượng vẽ ReportLab. Hướng dẫn đồ họa của ReportLab giải thích các hình vẽ này có thể kết xuất lên canvas hoặc dùng làm flowable Platypus. Với ví dụ này, canvas cho mỗi lần đặt vị trí và kích thước rõ ràng.
Chúng tôi chạy ví dụ với Python 3.12, svglib 2.2.0 và ReportLab 4.4.9. Cài hai gói cố định trong môi trường dự án:
python -m pip install "svglib==2.2.0" "reportlab==4.4.9"Lưu biểu tượng nhỏ này thành logo.svg. Nó chứa ba đường dẫn tô đặc, không có ảnh liên kết, phông chữ hay hiệu ứng. Đây là phần hình tạo bằng tay cho minh họa này, không phải kết quả chuyển đổi PerfectVector.
<svg xmlns="http://www.w3.org/2000/svg"
width="240" height="120" viewBox="0 0 240 120">
<path fill="#1c625e" d="M0 120 L60 0 L120 120 Z"/>
<path fill="#e5a340" d="M96 120 L156 24 L216 120 Z"/>
<path fill="#163451" d="M228 12 L240 12 L240 108 L228 108 Z"/>
</svg>viewBox của SVG mô tả hình chữ nhật tọa độ nội bộ. width và height của hình vẽ đã nhập cho biết kích thước bạn cần dùng để đặt trên PDF. Đọc chúng thay vì cho rằng pixel SVG bằng point PDF.
Với tệp này, svglib 2.2.0 trả về 180 × 90 point. Tài liệu đơn vị hiện tại ánh xạ một pixel CSS thành 0.75 point PDF. Ví dụ cũ có thể dùng giả định khác, nên kiểm tra kích thước khi nâng cấp quy trình sẵn có.
Làm logo vừa mà không kéo giãn
Lưu đoạn sau thành place_logo.py cạnh SVG và chạy python place_logo.py. Mọi vị trí trang và kích thước hộp ở đây tính bằng point PDF. Có 72 point trong một inch; gốc canvas mặc định ở dưới trái, như hướng dẫn canvas của ReportLab mô tả.
from reportlab.graphics import renderPDF
from reportlab.pdfgen import canvas
from svglib.svglib import svg2rlg
def draw_svg_in_box(pdf, drawing, x, y, box_w, box_h):
if drawing.width <= 0 or drawing.height <= 0:
raise ValueError("The SVG needs positive dimensions")
factor = min(box_w / drawing.width, box_h / drawing.height)
pdf.saveState()
pdf.translate(x, y)
pdf.scale(factor, factor)
renderPDF.draw(drawing, pdf, 0, 0)
pdf.restoreState()
drawing = svg2rlg("logo.svg")
if drawing is None:
raise ValueError("SVG could not be loaded")
pdf = canvas.Canvas("logo.pdf", pagesize=(640, 360))
draw_svg_in_box(pdf, drawing, 40, 154, 144, 72)
draw_svg_in_box(pdf, drawing, 302, 126, 288, 144)
pdf.save()min() chọn kích thước giới hạn để hình vẽ vừa trong hộp. Dùng cùng hệ số cho X và Y giữ tỷ lệ. Hàm này neo hình vẽ tại góc dưới trái của hộp; khoảng trống còn ở trên hoặc bên phải. Căn giữa riêng nếu bố cục yêu cầu.
Phép biến đổi canvas là tạm thời. restoreState() ngăn tỷ lệ logo ảnh hưởng văn bản hoặc phần tử trang sau đó, và hình vẽ gốc vẫn dùng được cho lần đặt thứ hai.
Trong thử nghiệm, hai hệ số là 0.8 và 1.6, tạo phần hình 144 × 72 pt và 288 × 144 pt. Bản xem trước thêm nhãn và nền vào cùng hai vị trí đó để dễ đối chiếu kích thước.

Với tài liệu Platypus, hình vẽ có thể thêm vào story dưới dạng flowable. Sau khi co giãn nội dung bằng drawing.scale(factor, factor), cập nhật drawing.width và drawing.height theo cùng hệ số để bố cục dùng kích thước chiếm chỗ mới. Dùng hình vẽ mới khi áp dụng các kích thước khác nhau. Ví dụ canvas trên tránh thay đổi chính hình vẽ.
Kiểm tra riêng hình học và diện mạo
Chúng tôi kiểm tra luồng nội dung của PDF thử bằng pypdf 6.10.0. Nó chứa sáu thao tác bắt đầu đường dẫn, tương ứng ba đường dẫn biểu tượng vẽ hai lần, và không có ảnh trên trang. Chúng tôi cũng kết xuất toàn trang bằng Poppler và kiểm tra hai biểu tượng. Hình dạng, phần chồng, thanh dọc và tỷ lệ khớp các vị trí dự định.
Những quan sát đó áp dụng cho mẫu thử đơn giản này. Chỉ đếm đường dẫn không chứng minh mọi tính năng của SVG khác được kết xuất đúng. Tương tự, phóng to PDF trên màn hình không thể kết luận chắc nó chứa chỉ dẫn vector hay bitmap lớn.
Với tài liệu của bạn:
- Đối chiếu PDF hoàn thiện với SVG trong trình duyệt hoặc trình chỉnh sửa. Tìm chi tiết thiếu, màu tô đổi, cắt vùng và vùng trắng bất ngờ.
- Kiểm tra biểu tượng ở kích thước tài liệu dự định, nơi khe hẹp và đường viền mảnh phải còn rõ.
- Kiểm tra đối tượng ảnh PDF nếu quy trình yêu cầu hình vector. Tính đến ảnh chụp có chủ đích ở nơi khác trên trang.
- Giữ bản gốc SVG cạnh mã tạo tài liệu. Kiểm tra lại PDF sau khi đổi phần hình hoặc thư viện phụ thuộc kết xuất.
Bản thân SVG có thể chứa ảnh raster. Đọc lớp bọc đó không khôi phục đường dẫn từ pixel. Chẩn đoán ảnh nhúng giúp phân biệt bản gốc vector với SVG vẫn mang bitmap.
Xử lý tính năng công cụ nhập không tái tạo được
Giới hạn svglib hiện tại gồm không hỗ trợ mask và phần tử foreignObject, bỏ qua quy tắc stylesheet @import và hạn chế CSS, cắt vùng. Vì vậy bản xem trước trình duyệt không thay thế việc thử công cụ nhập PDF.
Giữ bản sao gốc trước khi đơn giản hóa. Nếu logo phụ thuộc hiệu ứng không hỗ trợ, cân nhắc dựng lại phần đó thành hình học thông thường hoặc dùng cách xuất khác có thể xác minh. Giữ raster gốc khi diện mạo ảnh chụp quan trọng hơn sửa đường dẫn. Ảnh làm phẳng có thể giữ diện mạo, nhưng thay đổi yêu cầu vector.
Với phần chữ, chủ động chọn giữa văn bản tài liệu và hình dạng đường bao. Giữ từ thành văn bản cho phép sửa và tìm kiếm, nhưng cần phông dự định có sẵn trong quy trình tài liệu. Chuyển chữ logo đã duyệt thành đường bao giữ hình dạng nhưng mất chỉnh sửa văn bản thông thường. Biểu tượng chỉ có đường dẫn của chúng tôi không thử xử lý phông; hãy dùng mẫu thực tế của kiểu chữ trước khi dựa vào cùng quy trình.
Nếu ghép tài liệu trong hệ thống dàn chữ thay vì Python, quy trình SVG trong LaTeX giải thích cách riêng cho đồ họa và nhãn.
Khôi phục logo chỉ có raster trước khi đặt vào PDF
PNG cũ trên mẫu hóa đơn là ứng viên hợp lý để khôi phục vector khi tệp logo gốc bị thiếu. Với công cụ vector hóa logo của PerfectVector, xem trước hình raster dưới dạng SVG, kiểm tra đường bao và lỗ rồi tải bản ứng viên cho quy trình tài liệu.
Kiểm tra chữ nhỏ và đường viền trước khi nhập. Vẽ lại hoặc dàn lại chữ ở những phần cần kiểu chữ chính xác, và xóa hình học nền không mong muốn trong trình chỉnh sửa. Hướng dẫn vector hóa logo trình bày chi tiết hơn quyết định từ nguồn đến bản gốc đó.
Sau đó chạy nhập ReportLab thực tế và kiểm tra PDF phía trên. Bản dò nét tốt vẫn phải qua được công cụ nhập và vừa tài liệu. PerfectVector cung cấp đường dẫn phần hình; không chọn tọa độ ReportLab, đăng ký phông tài liệu hay xác minh PDF kết quả. Với biểu đồ, tạo lại từ dữ liệu và mã nguồn vẽ thay vì dò nét nhãn hoặc giá trị đã vẽ.
Câu hỏi thường gặp
Tôi có thể truyền SVG cho ReportLab như ảnh bitmap thông thường không? Dùng svglib để tạo Drawing rồi kết xuất bằng renderPDF cho quy trình vector này. Chuyển SVG thành PNG trước sẽ tạo thao tác chèn raster.
Vì sao SVG nhập nhỏ hơn trong ví dụ cũ? svglib 2.2.0 đã thử ánh xạ pixel CSS sang point PDF theo hệ số 0.75. Đọc kích thước hình vẽ trả về và làm vừa hộp có kích thước được chỉ định cụ thể thay vì dựa trên giả định pixel-point cũ.
Cách này có giữ mọi hiệu ứng SVG không? Không. Công cụ nhập có giới hạn tính năng được tài liệu mô tả, gồm mask và foreignObject. Đối chiếu PDF xuất với hình dự định dù tập lệnh hoàn tất không lỗi.
Tôi có nên vector hóa ảnh chụp màn hình biểu đồ không? Tạo lại biểu đồ từ dữ liệu và mã nguồn vẽ bất cứ khi nào có thể. Chỉ dò nét logo với phần hình trang trí phù hợp đã mất bản gốc chỉnh sửa được.
Nguồn tham khảo
- svglib — Gói và tài liệu đơn vị — Chuyển SVG thành Drawing, cài đặt và kích thước theo point PDF.
- ReportLab — Đồ họa — Đối tượng Drawing, kết xuất PDF và dùng làm flowable Platypus.
- ReportLab — Đồ họa và văn bản với pdfgen — Tọa độ canvas, point và phép biến đổi.
- svglib — Giới hạn đã biết — Hạn chế nhập đòi hỏi kiểm tra PDF hoàn thiện.
Giữ bản gốc chỉnh sửa được khi có. Nếu chỉ còn hình logo raster, hãy chuẩn bị bản logo SVG ứng viên, kiểm tra đường dẫn, rồi đặt ở kích thước yêu cầu và kiểm tra PDF hoàn thiện.
Thêm từ blog

Ảnh SVG trong fpdf2: Giữ đường dẫn trong PDF Python
Đặt logo SVG vào PDF Python bằng fpdf2, kiểm soát kích thước, kiểm tra đường dẫn đã lưu và tìm nguyên nhân mất chữ hoặc hình trước khi dùng ảnh raster dự phòng.

SVG PDFKit: Đặt logo vector mà không làm phẳng
Chèn logo SVG hoàn chỉnh vào tài liệu PDFKit, đặt kích thước theo point và kiểm tra PDF đã lưu về đường dẫn, hình có lỗ, tính năng bị mất và ảnh nhúng.