gpt4 book ai didi

Python+RSVG+Cario : Scale SVG to printing size

转载 作者:行者123 更新时间:2023-12-05 08:00:42 30 4
gpt4 key购买 nike

我正在尝试使用以下代码(它是一个 Gtk 应用程序)使用 Cairo 和 RSVG 在 Python 中打印动态创建的 SVG。
它是一种特殊类型的纸张,正好是 147x205mm。如果我在 EOG 中打开 SVG,我可以毫无问题地打印它,但是使用下面的代码它会使 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 标签可以解决这个问题?

最佳答案

我玩了(很多)transform <g> 的参数element 我的所有元素都包含在其中。
减少 matrix 的第一个和第四个参数在transform标签允许您将其调整到所需的纸张/绘图区域。
也可以使用第五个和第六个参数移动整个绘图。

示例代码:

<g
transform="matrix(0.70,0,0,0.70,20,-190)"
id="layer1">

我仍然假设(希望)有一种 Cairo/Python 方法可以更好地解决这个问题,但这应该有所帮助。

关于Python+RSVG+Cario : Scale SVG to printing size,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17327477/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com