【发布时间】:2013-02-02 07:18:52
【问题描述】:
我正在尝试在 Python 中自动生成一些 pdf 格式的报告。我在报告中有我想要的数字,但这些数字目前保存为 pdf。将数字另存为其他内容是一种选择,但对于我正在尝试做的事情并不理想。我找到了使用 pdfrw 和 reportlab 将页面从一个 pdf 转换为新 pdf 页面的示例 (http://code.google.com/p/pdfrw/wiki/ExampleTools),但我不希望它们成为我的新 pdf 的整个页面,只是一个占一部分的数字这页纸。之前没用过pdfrw,所以对Canvas方法以及它完全能做什么不是很了解。
【问题讨论】:
-
这基本上是一个三步过程。由于 PDF 可以是多页的,首先要做的就是只提取您想要的页面——似乎有一些“子集”示例。接下来要做的就是调整它的大小以适应图形要出现的区域——同样有一个调整大小的例子。最后,必须将它移动或翻译到最后一页上该区域的位置——在 4up 示例中似乎有类似的情况。
-
除非我误解了 4up 的例子,看起来翻译和缩放是画布的,然后对
makerl(canvas, page)的调用将整个画布替换为 pdf。诚然,我不太了解该示例中该画布的缩放比例 -
是的,转换可能会令人困惑,因为总是有两种方式来考虑它们——从外向内,反之亦然。我对 PDF 成像模型的看法是,总有一个转换矩阵在起作用,它将正在绘制的坐标转换为某种设备坐标,因此
canvas.translate(dx, dy)调用将导致dx和dy到被添加到后面所有内容的 x & y 坐标中。同样,canvas.scale(sx, sy)调用将按sx和sy的数量缩放后续图形,然后通过dx和dy转换它们。 续 -
... 在 4up 示例中,
makerl()调用将每个 pdfrw 输入页面转换为 reportlab 对象并将其返回,然后将其添加到使用canvas.doForm()调用创建的画布输出对象中一个有效的全局平移 + 缩放转换 - 使其变为正常大小的 1/4 并将其移动到画布的正确象限中。这些转换和缩放操作包含在canvas.saveState()和canvas.restoreState()调用中,因此它们只会应用在它们之间发生的每个四分之一大小的输入页面处理的canvas.doForm()调用。希望这会有所帮助。
标签: python pdf reportlab pdfrw