Python+RSVG+Cario: масштабирование SVG до размера печати
Я пытаюсь напечатать динамически созданный SVG в Python с использованием Cairo и RSVG со следующим кодом (это приложение Gtk).
Это особый тип бумаги, размером 147х205 мм. Если я открою SVG в EOG, я могу напечатать его без проблем, но, используя следующий код, он делает SVG слишком большим, поэтому на бумаге помещается только его часть.
Я ищу способ сказать RSVG/Cairo масштабировать SVG в контексте печати.
#in the initializer:
self.PrintSettings = Gtk.PrintSettings()
self.PrintSettings.set_paper_width(147, Gtk.Unit.MM)
self.PrintSettings.set_paper_height(204, Gtk.Unit.MM)
self.PageSetup = Gtk.PageSetup()
pageSize = Gtk.PaperSize.new_custom("bill", "Papel de factura", 147, 205, Gtk.Unit.MM)
self.PageSetup.set_paper_size(pageSize)
self.PageSetup.set_top_margin(0, Gtk.Unit.MM)
self.PageSetup.set_bottom_margin(0, Gtk.Unit.MM)
self.PageSetup.set_left_margin(0, Gtk.Unit.MM)
self.PageSetup.set_right_margin(0, Gtk.Unit.MM)
def on_PrintButton_clicked(self, widget):
self.make_bill() #generates the SVG as "./temp.svg"
printOperation = Gtk.PrintOperation()
printOperation.set_n_pages(1)
printOperation.set_print_settings(self.PrintSettings)
printOperation.set_default_page_setup(self.PageSetup)
printOperation.connect("draw_page", self.print_bill)
print printOperation.run(Gtk.PrintOperationAction.PRINT_DIALOG, self)
def print_bill(self, printOperation, printContext, pageNr):
pageSetup = printContext.get_page_setup()
cairoContext = printContext.get_cairo_context()
svg = rsvg.Handle(file = os.getcwd() + "/temp.svg")
svg.render_cairo(cairoContext)
return
В случае, если это полезно, начало моего SVG (всегда одинаковое):
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.1"
width="513.77954"
height="726.37793"
id="svg2">
<defs
id="defs4" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
transform="translate(0,-325.9842)"
id="layer1">
Обновить
Я добавил следующие строки в print_bill
print printContext.get_width() # returns 416.692913386
print printContext.get_height() # returns 581.102362205
Это в точности равно размеру SVG. Я перепроверил в Inkscape, который говорит мне, что это размер и PX, но если я посмотрю значения в MM, он покажет правильные.
Может быть, есть тег SVG, чтобы это исправить?
1 ответ
Я много играл с transform
параметр <g>
элемент все мои элементы обернуты.
Уменьшение первого и четвертого параметра matrix
в transform
тег позволяет вам масштабировать его в нужной области бумаги / рисования.
Также возможно переместить весь чертеж, используя пятый и шестой параметры.
Пример-код:
<g
transform="matrix(0.70,0,0,0.70,20,-190)"
id="layer1">
Я все еще предполагаю (надеюсь), что есть Каир /Python способ решить эту проблему лучше, но это должно помочь.