2013-06-26 32 views
2

我試圖用下面的代碼(它是一個Gtk應用程序)使用Cairo和RSVG在Python中打印動態創建的SVG。
這是一種特殊類型的紙張,正好是147x205mm。如果我在EOG中打開SVG,我可以毫無問題地打印SVG,但使用下面的代碼會使SVG變得太大,所以只能將它的一部分放在紙上。
我正在尋找一種方法來告訴RSVG/Cairo將SVG縮放到打印上下文。Python + RSVG + Cario:將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標籤來解決這個問題?

回答

0

我打得四處(很多)與<g>元素我所有的元素都包裹在的transform參數。
減小matrix的第一和第四參數在transform標籤可以讓你的大小成所需的紙張/繪圖區。
也可以使用第五個參數和第六個參數移動整個圖形。

例碼:

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

我仍然認爲(希望)有一個開羅/ Python的方式以更好的方式來解決這個問題,但這應該幫助。