2017-10-20 69 views
1

當在PDF表面上出現超過大約一千個時,繪製一個實心圓圈的小數組會失敗,但同一個上下文的PNG呈現沒有問題。我嘗試了一系列解決方案,不能輕易得到錯誤信息或其他線索 - 請提供任何想法? (在Mac OS X 10.12.6,安裝最新的庫)Pycairo在繪製100個填充圖形時未能生成PDF

import cairo 

Pi=3.14159265 

# this works, Python 2.7 
surface = cairo.PDFSurface("cairoTest.pdf", 595, 842) 
cntxt = cairo.Context(surface) 
cntxt.set_source_rgb(.3, .1, .6) 
for xstep in range(0,50,1): 
    for ystep in range(0,31,1): 
     cntxt.arc(xstep*10.+30, ystep*10.+30, 3., 0., 2.*Pi) 
     cntxt.fill() 

surface.write_to_png("example.png") # Output to PNG 
surface.finish 

# this produces zero-byte file 
surface = cairo.PDFSurface("cairoTestFkd.pdf", 595, 842) 
cntxt = cairo.Context(surface) 
cntxt.set_source_rgb(.3, .1, .6) 
for xstep in range(0,55,1): 
    for ystep in range(0,35,1): 
     cntxt.arc(xstep*10.+30, ystep*10.+30, 3., 0., 2.*Pi) 
     cntxt.fill() 

surface.write_to_png("exampleFkd.png") # Output to PNG 
surface.finish 
+0

'失敗'意味着什麼?有些圈子是隱形的,或者全部是隱形的?還是別的什麼問題? – Iron

+0

有時產生一個不可讀的文件,但通常是一個零長度的PDF文件。 – Raras

+1

surface.finish是一個函數 – lazka

回答

0

的問題原來是一個奇怪的MS代碼(Visual Studio中)問題:在命令行中運行,上面的代碼產生良好的PDF,但從代碼內部運行它不。此外,它只是處理的最後一個文件/上下文不起作用(足夠大或需要足夠長的時間來處理?),因此在末尾添加一個虛擬/額外的上下文「排序」。我懷疑同步問題正在發揮作用,例如文件在子過程完成前關閉,緩衝區未正確刷新等。

請注意,context.finish,context.flush對行爲沒有影響。

+0

您是否嘗試實際調用'surface.finish'?你的例子中沒有'()',所以實際上並沒有調用這個函數。 –