作物开罗生成的PDF

时间:2014-07-31 18:34:12

标签: python cairo

我有以下脚本,它在一个更大的圆圈顶部的框中生成许多圆圈。输出是一个PDF,我希望它与墨水范围紧密相关。

#!/usr/bin/env python
import math
import cairocffi as cairo
import random

def DrawFilledCircle(x,y,radius,rgba):
  ctx.set_source_rgba(*rgba)
  ctx.arc(x,y,radius,0,2*math.pi)
  ctx.fill()

def DrawCircle(x,y,radius,rgba=(0,0,0,1)):
  ctx.set_source_rgba(*rgba)
  ctx.arc(x,y,radius,0,2*math.pi)
  ctx.stroke()

surface       = cairo.RecordingSurface(cairo.CONTENT_COLOR_ALPHA, None)
ctx           = cairo.Context (surface)

DrawCircle(200,200,150,(0,0,0,1))
for i in range(1000):
  DrawFilledCircle(200+(150-300*random.random()), 200+(150-300*random.random()), 4, (0,0,0,0.5))

#This part will change throughout the question
extents = surface.ink_extents()
pdfout  = cairo.PDFSurface ("circle.pdf", extents[2], extents[3])
pdfctx  = cairo.Context (pdfout)
pdfctx.set_source_surface(surface,0,0)

运行脚本会产生以下结果。

Circle cropped in bottom right

如您所见,宽度和高度是正确的,但原点需要移动。因此,我尝试了这个:

pdfout  = cairo.PDFSurface ("circle.pdf", extents[2], extents[3])
pdfctx  = cairo.Context (pdfout)
pdfctx.set_source_surface(surface,extents[0],extents[1])

这只是将事情进一步向右移。

Circle cropped even more in the bottom right

建议使用负坐标以另一种方式改变事物:

pdfout  = cairo.PDFSurface ("circle.pdf", extents[2], extents[3])
pdfctx  = cairo.Context (pdfout)
pdfctx.set_source_surface(surface,-extents[0],-extents[1])

但这也不起作用:

Negative coordinates didn't work

作为备份,我可以对pdfcrop进行shell调用,但这似乎是一个荒谬的解决方法。

我能做些什么来实现我想要做的事情?我哪里错了?如何在开罗实现持久和平?

0 个答案:

没有答案