2012-01-13 3 views
9

Я создаю несколько SVG в партиях и должен преобразовать их в документ PDF для печати. Я пытался использовать svglib и его метод svg2rlg, но я только что обнаружил, что это абсолютно ужасно для сохранения векторной графики в моем документе. Он может неправильно размещать текст.Преобразование SVG в PDF (svglib + reportlab недостаточно)

Мой динамически сгенерированный SVG хорошо сформирован, и я проверил svglib на исходном входе, чтобы убедиться, что это не проблема, которую я представляю.

Итак, каковы мои варианты после svglib и ReportLab? Это либо должно быть бесплатным, либо очень дешевым, поскольку мы уже вне бюджета на проекте, в котором это входит. Мы не можем позволить себе оплатить 1K/год для ReportLab Plus.

Я использую Python, но на этом этапе я доволен, пока он работает на нашем сервере Ubuntu.

Редактировать: Протестировано принца. Лучше, но он все равно игнорирует половину документа.

+0

Не могли бы вы использовать комбо следующих подходов http://stackoverflow.com/a/6599172/1104941 и http://www.blog.pythonlibrary.org/2012/01/07/reportlab-converting-hundreds- of-images-in-pdfs/Последний использует reportlab, но мне интересно, можете ли вы уйти без версии Plus, учитывая, что вы просто создаете PDF-файлы. Вы можете перейти прямо к PDF с Каиром, но я не могу сказать наверняка, поэтому комментарий вместо ответа. – sgallen

ответ

1

CairoSVG это один я использую:

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

Протестировал его сейчас, но, к сожалению, он так же слабый при рендеринге моих SVG. – Oli

+0

Вы уверены, что ваши SVG на самом деле отформатированы правильно? Каирский рендеринг довольно прочный. Кроме того, я использую WeasyPrint для PDF, хотя он все еще немного неполный, но отлично работает, несмотря на ограничения ... – plaes

+2

Для всех здесь, в 2016 году, это больше не работает. – Lucas

6

Я использую inkscape для этого. По вашему мнению Джанго делать нравится:

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) 

Вам может понадобиться передать в качестве параметров Inkscape все файлы шрифтов вы ссылаетесь в вашем .SVG, так что имейте это в виду, если ваш текст не отображается правильно на. pdf-выход.

1

rst2pdf использует reportlab для создания PDF-файлов. Он может использовать inkscape и pdfrw для чтения PDF-файлов.

В файле pdfrw есть несколько примеров, показывающих чтение PDF-файлов и использование reportlab для вывода.

адресация комментарий Мартин ниже (я могу изменить этот ответ, но не имею репутации комментировать комментарий на нем ...):

ReportLab ничего не знает о SVG-файлах. Некоторые инструменты, такие как svg2rlg, пытаются воссоздать образ SVG в PDF, введя их в холст reportlab. Но вы можете сделать это по-другому с pdfrw - если вы можете использовать другой инструмент для преобразования SVG-файла в PDF-образ, тогда pdfrw может взять этот преобразованный PDF-файл и добавить его как форму XObject в PDF-файл, который вы генерируете с reportlab. Что касается reportlab, это действительно ничем не отличается от размещения изображения в формате JPEG.

Некоторые инструменты будут делать ужасные вещи в ваших файлах SVG (например, растрирование их). По моему опыту, inkscape обычно выполняет довольно хорошую работу и оставляет их в векторном формате. Вы даже можете сделать это без головы, например. «inkscape my.svg -A my.pdf».

Основная причина, по которой я написал pdfrw, в первую очередь, заключалась в том, что этот конкретный прецедент - возможность повторного использования векторных изображений в новых PDF-файлах, созданных reportlab.

+0

Как это относится к проблеме OP? Я считаю, что он не хочет использовать Reportlab, потому что качество обработки SVG отсутствует. –

0

Просто, чтобы вы знаете, и для будущего выпуска, я найти решение этой проблемы:

# 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() 

Enjoy немного с позиции (80, 740 - ч), то есть только положение.

Если код не работает, вы можете посмотреть его в библиотеке reportlab рендеринга. У вас есть функция в ReportLab для создания непосредственно в формате PDF из вашего изображения:

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

Вы можете открыть его и прочитать его. Это не очень сложно. Этот код исходит из этой функции.

+0

svg2rlg похоже не работает с python3 – IARI

Смежные вопросы