使用Python进行PDF坐标系转换

时间:2017-03-16 15:07:55

标签: python pdf

我正在使用pdf挖掘器将数据提取到xml文件,当我注意到对象'坐标系以下列方式表示:

<textline bbox="187.098,693.242,288.642,709.202">

如何使用Python将此坐标转换为像素系统(x,y),并已将bbox数据解析为Python中的变量?

2 个答案:

答案 0 :(得分:0)

首先让我们了解pdfminer为边界框生成的数字是什么意思。边界框是4个数字的列表,组织如下(x0,x1,y0,y1),其中x0,y0是左上角的坐标,y0,y1是右下角的坐标。基本上,我们可以使用这两个点在LT对象周围绘制一个矩形。另外一个非常重要的信息是pdf页面的原点位于左下角而不是左上角作为图像(参见:https://github.com/euske/pdfminer/issues/19)。 pdf页面的标准dpi是72(参见:https://github.com/euske/pdfminer/issues/74)所以基本上它是在像素系统中(这是因为png图像的默认值也是72 dpi)。了解这些信息后,您可以实现一个将点或矩形转换为新坐标系统的函数(通过提供新的dpi编号生成),如下所示

def TranslatePoints(src, srcSize, dstSize):
    sx0, sy0, sx1, sy1 = src
    ssx, ssy = srcSize
    dsx, dsy = dstSize

    dx0 = sx0 / ssx * dsx
    dx1 = sx1 / ssx * dsx
    dy0 = sy0 / ssy * dsy
    dy1 = sy1 / ssy * dsy
    return dx0, dy0, dx1, dy1

src:src矩形。一个由4个浮点数组成的元组(x0,y0,x1,y1)。边界框协调。 srcSize:pdf页面的大小为两个数字(宽度,高度)的元组,你可以通过我的答案https://stackoverflow.com/a/48886525/3022413得到它(nvm它正在工作的downvotes并且我测试了它) dstSize:目标坐标系的大小。 x和y的元组(新坐标系的最大限制,也许是你试图绘制矩形的图像的大小?)

答案 1 :(得分:0)

基于最后一个答案,我做了自己的功能,因为它不起作用。最后一个答案是正确的,但无法更正y坐标。因此,您必须获取PDF的大小并减去pdf坐标,然后进行转换。我的函数接受三个参数,其中src是4个浮点数的元组,分别表示(x0,y0,x1,y1)。边界框坐标,pdf是库读取的对象 pdfrw:

    from pdfrw import PdfReader
    pdf = PdfReader(<path>)

并且im是从图像获得的PIL对象:

    from PIL import Image
    im = Image.open(<path>)

功能

    def TranslatePoints(src, pdf, im):

        sx0, sy0, sx1, sy1 = src
        ssx, ssy = (int(pdf.pages[1].MediaBox[2]),int(pdf.pages[1].MediaBox[3]))
        dsx, dsy = im.size
        sy01 = ssy-sy1
        sy11 = ssy-sy0
        x0 = sx0/int(pdf.pages[1].MediaBox[2])*im.size[0]
        x1 = sx1/int(pdf.pages[1].MediaBox[2])*im.size[0]
        y0 = sy01/int(pdf.pages[1].MediaBox[3])*im.size[1]
        y1 = sy11/int(pdf.pages[1].MediaBox[3])*im.size[1]
        return (x0, y0, x1, y1)

检查我是否裁剪了图像,效果很好

    im.crop(TranslatePoints(src, pdf, im))