2017-10-20 59 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'?你的例子中没有'()',所以实际上并没有调用这个函数。 –