【问题标题】:Pycairo fails to produce PDF when drawing 100's of fillsPycairo 在绘制 100 个填充时无法生成 PDF
【发布时间】:2017-10-20 08:34:29
【问题描述】:

当 PDF 表面上出现大约一千个以上时,绘制一个普通的实心圆数组会失败,但相同上下文的 PNG 渲染没有问题。我已经尝试了一系列解决方案,但无法轻易获得错误消息或其他线索——请问有什么想法吗? (在 Mac OS X 10.12.6 下,安装了最新的库)

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

【问题讨论】:

  • fails 是什么意思?一些圆圈是不可见的还是所有的都是不可见的?还是有什么问题?
  • 有时会生成不可读的文件,但最常见的是零长度的 PDF 文件。
  • surface.finish 是一个函数

标签: python cairo pycairo


【解决方案1】:

问题原来是一个奇怪的 MS Code (Visual Studio) 问题:从命令行运行,上面的代码产生了很好的 PDF,但从内部代码运行它却没有。此外,只有最后一个处理的文件/上下文不起作用(并且足够大或需要足够长的时间来处理?)所以在最后添加一个虚拟/额外上下文“可以解决这个问题”。我怀疑存在同步问题,例如在子进程完成之前关闭文件、未正确刷新缓冲区等。

请注意,context.finish、context.flush 对行为没有影响。

【讨论】:

  • 您是否尝试实际致电surface.finish?您的示例中没有(),因此实际上并未调用该函数。
猜你喜欢
  • 1970-01-01
  • 2012-05-26
  • 2013-04-25
  • 1970-01-01
  • 2015-01-22
  • 1970-01-01
  • 2019-04-02
  • 1970-01-01
  • 2012-04-22
相关资源
最近更新 更多