2012-01-13 33 views
9

Tôi đang tạo một số SVG theo lô và cần chuyển đổi các tệp SVG thành tài liệu PDF để in. Tôi đã cố gắng sử dụng svglib và phương pháp svg2rlg của tôi nhưng tôi vừa phát hiện ra rằng nó hoàn toàn kinh khủng khi bảo quản đồ họa véc tơ trong tài liệu của tôi. Nó chỉ có thể định vị văn bản một cách chính xác.Chuyển đổi SVG thành PDF (svglib + reportlab không đủ tốt)

SVG được tạo động của tôi được tạo đúng và tôi đã thử nghiệm svglib trên đầu vào thô để đảm bảo rằng đó không phải là vấn đề tôi đang giới thiệu.

Vì vậy, các tùy chọn của tôi qua svglib và ReportLab là gì? Nó có thể là miễn phí hoặc rất rẻ vì chúng tôi đã hết ngân sách cho dự án này. Chúng tôi không thể trả phí 1k/năm cho ReportLab Plus.

Tôi đang sử dụng Python nhưng ở giai đoạn này, tôi hài lòng miễn là nó chạy trên máy chủ Ubuntu của chúng tôi.

Chỉnh sửa: Hoàng tử đã thử nghiệm. Tốt hơn nhưng nó vẫn bỏ qua một nửa tài liệu.

+0

Bạn có thể sử dụng kết hợp các phương pháp sau đây http://stackoverflow.com/a/6599172/1104941 và http://www.blog.pythonlibrary.org/2012/01/07/reportlab-converting-hundreds- of-images-into-pdfs/Sau này sử dụng reportlab nhưng tôi tự hỏi nếu bạn có thể nhận được ngay mà không có phiên bản Plus cho bạn chỉ cần tạo ra pdf. Bạn có thể đi thẳng đến pdf với Cairo nhưng tôi không thể nói chắc chắn vì thế nhận xét thay vì câu trả lời. – sgallen

Trả lời

1

CairoSVG là một trong tôi đang sử dụng:

import cairosvg 
cairosvg.svg2pdf(url='image.svg', write_to='image.pdf') 
+0

Đã thử nghiệm nó ngay bây giờ, nhưng tiếc là nó chỉ là yếu ớt khi hiển thị SVG của tôi. – Oli

+0

Bạn có chắc chắn rằng SVG của bạn thực sự được định dạng đúng không? Việc render của Cairo khá chắc chắn .. Ngoài ra, tôi đang sử dụng WeasyPrint cho PDF, mặc dù nó vẫn còn một chút chưa hoàn chỉnh, nhưng hoạt động tốt dù có giới hạn ... – plaes

+2

Đối với bất cứ ai ở đây vào năm 2016, điều này không hoạt động nữa. – Lucas

6

tôi sử dụng inkscape cho việc này. Theo quan điểm của bạn django làm thích:

from subprocess import Popen 

x = Popen(['/usr/bin/inkscape', your_svg_input, \ 
    '--export-pdf=%s' % your_pdf_output]) 
try: 
    waitForResponse(x) 
except OSError, e: 
    return False 

def waitForResponse(x): 
    out, err = x.communicate() 
    if x.returncode < 0: 
     r = "Popen returncode: " + str(x.returncode) 
     raise OSError(r) 

Bạn có thể cần phải vượt qua như tham số cho Inkscape tất cả các file font bạn tham khảo trong .svg của bạn, vì vậy giữ cho rằng trong tâm trí nếu văn bản của bạn không xuất hiện một cách chính xác trên. đầu ra pdf.

1

rst2pdf sử dụng reportlab để tạo tệp PDF. Nó có thể sử dụng inkscape và pdfrw để đọc các tệp PDF.

pdfrw chính nó có một số ví dụ hiển thị tệp PDF đọc và sử dụng reportlab để xuất.

Phát biểu bình luận bởi Martin bên dưới (tôi có thể chỉnh sửa câu trả lời này, nhưng không có uy tín nhận xét về một lời nhận xét về nó ...):

ReportLab không biết gì về các tập tin SVG. Một số công cụ, như svg2rlg, cố gắng tạo lại hình ảnh SVG thành PDF bằng cách kéo chúng vào canvas reportlab. Nhưng bạn có thể làm điều này theo cách khác với pdfrw - nếu bạn có thể sử dụng công cụ khác để chuyển đổi tệp SVG thành hình ảnh PDF, sau đó pdfrw có thể chuyển đổi PDF đó và thêm nó dưới dạng XObject vào PDF mà bạn đang tạo với reportlab. Theo như reportlab có liên quan, nó thực sự không khác gì so với việc đặt một hình ảnh JPEG.

Một số công cụ sẽ làm những điều khủng khiếp đối với tệp SVG của bạn (ví dụ: rasterizing chúng). Theo kinh nghiệm của tôi, inkscape thường làm một công việc khá tốt, và để chúng ở định dạng vector. Bạn thậm chí có thể làm điều này không đầu, ví dụ "inkscape my.svg -A my.pdf".

Toàn bộ lý do tôi viết pdfrw ngay từ đầu là cho trường hợp sử dụng chính xác này - có thể sử dụng lại hình ảnh vector trong tệp PDF mới được tạo bởi reportlab.

+0

Làm thế nào để giải quyết vấn đề của OP? Tôi tin rằng anh ấy không * muốn * sử dụng reportlab vì chất lượng xử lý SVG của nó còn thiếu. –

0

Chỉ cần để cho bạn biết và cho các vấn đề trong tương lai, tôi tìm một giải pháp cho vấn đề này:

# I only install svg2rlg, not svglib (svg2rlg is inside svglib as well) 
import svg2rlg 

# Import of the canvas 
from reportlab.pdfgen import canvas 

# Import of the renderer (image part) 
from reportlab.graphics import renderPDF 

rlg = svg2rlg.svg2rlg("your_img.svg") 
c = canvas.Canvas("example.pdf") 
c.setTitle("my_title_we_dont_care") 

# Generation of the first page 
# You have a last option on this function, 
# about the boundary but you can leave it as default. 
renderPDF.draw(rlg, c, 80, 740 - rlg.height) 
renderPDF.draw(rlg, c, 60, 540 - rlg.height) 
c.showPage() 

# Generation of the second page 
renderPDF.draw(rlg, c, 50, 740 - rlg.height) 
c.showPage() 

# Save 
c.save() 

Thưởng thức một chút với vị trí (80, 740 - h), nó chỉ là vị trí.

Nếu mã không hoạt động, bạn có thể xem trong thư viện báo cáo của kết xuất. Bạn có chức năng trong bảng báo cáo để tạo trực tiếp bản pdf từ hình ảnh của mình:

renderPDF.drawToFile(rlg, "example.pdf", "title") 

Bạn có thể mở và đọc nó. Nó không phải là rất phức tạp. Mã này đến từ hàm này.

+0

svg2rlg dường như không hoạt động với python3 – IARI

Các vấn đề liên quan