如何防止cairo光栅化我的图案填充?

问题描述 投票:0回答:1

在2011年左右的某个时候,我写了一个Pycairo脚本来生成一个包含几个自定义矢量模式填充的PDF。今天我重新运行它(Python 3.5.2,Pycairo 1.10.0)并且惊讶地发现所有这些模式都被渲染为低分辨率光栅化位图。我将脚本缩小到这个最小的例子:

#!/usr/bin/python3

import cairo

def main():
    surface = cairo.PDFSurface("test.pdf", 100, 100)
    ctx = cairo.Context(surface)
    pattern = make_pattern()
    ctx.rectangle(10, 10, 80, 80)
    ctx.set_source(pattern)
    ctx.fill()
    surface.finish()

def make_pattern():
    pattern_surface = cairo.PDFSurface(None, 32, 8)
    ctx = cairo.Context(pattern_surface)
    ctx.set_line_width(.5)
    ctx.set_source_rgb(0,0,0)
    ctx.move_to(5, 6)
    ctx.line_to(27, 2)
    ctx.stroke()
    pattern = cairo.SurfacePattern(pattern_surface)
    pattern.set_extend(cairo.EXTEND_REPEAT)
    return pattern

if __name__ == "__main__":
    main()

生成的PDF大幅缩放,呈现如下模式:

script output

注视PDF文件的文本确认这是位图。使用SVGSurface会产生类似的结果。有没有办法恢复旧的行为,即PDF格式填充在最终PDF中呈现为矢量填充而不是像这样光栅化?我在网上找到的唯一一个问题是2012年1月的this unanswered question on the cairo mailing list

pdf-generation vector-graphics cairo rasterizing pycairo
1个回答
0
投票

我仍然没有找到一种方法来严格使用Pycairo,但我找到了一个使用cairocffi的解决方案,这是Pycairo的一个改进的替代品。 cairocffi提供课程RecordingSurface

一个表面,记录表面后端接口最高级别的所有绘制操作(即绘制,蒙版,笔触,填充和show_text_glyphs的级别)。然后,通过将记录表面用作源表面,可以将记录表面“重放”到任何目标表面。

我修改了脚本以使用cairocffi和RecordingSurface

#!/usr/bin/python3

import cairocffi as cairo

def main():
    surface = cairo.PDFSurface("test.pdf", 100, 100)
    ctx = cairo.Context(surface)
    pattern = make_pattern()
    ctx.rectangle(10, 10, 80, 80)
    ctx.set_source(pattern)
    ctx.fill()
    surface.finish()

def make_pattern():
    pattern_surface = \
        cairo.RecordingSurface(cairo.CONTENT_COLOR_ALPHA, (0, 0, 32, 8))
    ctx = cairo.Context(pattern_surface)
    ctx.set_line_width(.5)
    ctx.set_source_rgb(0,0,0)
    ctx.move_to(5, 6)
    ctx.line_to(27, 2)
    ctx.stroke()
    pattern = cairo.SurfacePattern(pattern_surface)
    pattern.set_extend(cairo.EXTEND_REPEAT)
    return pattern

if __name__ == "__main__":
    main()

这导致了非栅格化模式:

script output

© www.soinside.com 2019 - 2024. All rights reserved.