Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python+;RSVG+;Cario:将SVG缩放到打印大小_Python_Printing_Svg_Gtk_Rsvg - Fatal编程技术网

Python+;RSVG+;Cario:将SVG缩放到打印大小

Python+;RSVG+;Cario:将SVG缩放到打印大小,python,printing,svg,gtk,rsvg,Python,Printing,Svg,Gtk,Rsvg,我正在尝试使用Cairo和RSVG以及以下代码在Python中打印一个动态创建的SVG(这是一个Gtk应用程序)。 这是一种特殊类型的纸张,精确到147x205mm。如果我在EOG中打开SVG,我可以毫无问题地打印它,但是使用以下代码,它会使SVG变得太大,因此只有一部分可以放在纸上。 我正在寻找一种方法,告诉RSVG/Cairo将SVG扩展到打印上下文 #in the initializer: self.PrintSettings = Gtk.PrintSettings() s

我正在尝试使用Cairo和RSVG以及以下代码在Python中打印一个动态创建的SVG(这是一个Gtk应用程序)。
这是一种特殊类型的纸张,精确到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的开头(始终相同):

这与SVG的大小完全相同。我在Inkscape中重新检查,它告诉我这是大小和PX,但如果我查找MM中的值,它会显示正确的值。
也许有一个SVG标签可以解决这个问题?

我经常使用
元素的
transform
参数,我所有的元素都被包装在里面。
减少
转换
标记中
矩阵
的第一个和第四个参数可以将其调整为所需的纸张/绘图区域。
也可以使用第五个和第六个参数移动整个图形

示例代码:


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

<?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 printContext.get_width() # returns 416.692913386
    print printContext.get_height() # returns 581.102362205
<g
    transform="matrix(0.70,0,0,0.70,20,-190)"
    id="layer1">