Python 3.x 将_source_surface从RecordingSurface设置为PDFSurface,并使用原点转换生成PNG但为空的PDF
在本例中,我在沿X坐标移动的同时,在远离原点的Y坐标中绘制了一些30px的线元素。这是在记录表面上绘制的,因为在我的真实代码中,我在开始之前不知道扩展。绘制完成后,我在PDFSurface上重复绘制,但由于我希望PDF和PNG与绘制的元素齐平,因此我将PDFSurface的边界设置为RecordingSurface墨迹范围的高度和宽度。下一步,因为我画的是30px,上面只有空的空间,所以我把我的画翻译成set_source_surface-30px。现在,当编写PNG时,所有工作都正常,但PDF是空的。如果我手动将高度扩展到100px,PDF将以正确的原点正确绘制。如果我从Y 0px开始画图,而不是Y 30px,它也可以工作。我错过了什么吗?还是一只虫子 谢谢你的帮助。下面是一个测试代码:Python 3.x 将_source_surface从RecordingSurface设置为PDFSurface,并使用原点转换生成PNG但为空的PDF,python-3.x,pdf,cairo,pycairo,python-cffi,Python 3.x,Pdf,Cairo,Pycairo,Python Cffi,在本例中,我在沿X坐标移动的同时,在远离原点的Y坐标中绘制了一些30px的线元素。这是在记录表面上绘制的,因为在我的真实代码中,我在开始之前不知道扩展。绘制完成后,我在PDFSurface上重复绘制,但由于我希望PDF和PNG与绘制的元素齐平,因此我将PDFSurface的边界设置为RecordingSurface墨迹范围的高度和宽度。下一步,因为我画的是30px,上面只有空的空间,所以我把我的画翻译成set_source_surface-30px。现在,当编写PNG时,所有工作都正常,但PDF
import cairocffi as cairo
rs = cairo.RecordingSurface(cairo.CONTENT_COLOR_ALPHA, None)
ctxRS = cairo.Context(rs)
items = ([0], [28, 29], [39], [42], [64], [67], [70, 71, 72], [76, 77], [79, 80], [86], [90], [104, 105],
[131], [134, 135, 136, 137, 138, 139], [145, 146, 147], [150, 151], [156], [174], [188], [191],
[199, 200], [203], [212], [216], [229, 230], [240, 241, 242, 243], [262])
for item in items:
initialPosition = item[0]
numberOfItems = len(item)
offset = initialPosition * 10
lineLength = 10 * numberOfItems
ctxRS.set_source_rgba(1.0, 0.0, 0.0, 1.0)
ctxRS.set_line_width(0)
ctxRS.move_to(offset, 30)
ctxRS.line_to(offset, 40)
ctxRS.line_to(offset + lineLength, 40)
ctxRS.line_to(offset + lineLength, 30)
ctxRS.close_path()
ctxRS.stroke_preserve()
ctxRS.set_source_rgba(1.0, 0.0, 0.0, 1.0)
ctxRS.fill()
x, y, width, height = rs.ink_extents()
ps = cairo.PDFSurface("cairoTest.pdf", width, height)
ctxPS = cairo.Context(ps)
ctxPS.set_source_surface(rs, -x, -y)
ctxPS.paint()
ps.write_to_png("cairoTest.png")
ps.finish()
为什么
设置线条宽度(0)
?因为我不希望我正在绘制的形状有边框。我追溯到开罗的一只虫子。从他们的网站上每晚构建一次,效果很好。与python实现无关。