【问题标题】:PDF coordinate system conversion using Python使用 Python 转换 PDF 坐标系
【发布时间】:2017-08-07 20:24:08
【问题描述】:

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

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

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

【问题讨论】:

  • “像素系统 (x,y)”是什么意思?
  • @mkl 抱歉没有明确说明,我指的是基于 x 和 y 轴的像素坐标系
  • 这里的“像素”是什么意思?水平和垂直单位 1/96" 宽?坐标系的原点在哪里,左下角?向右时 x 值增加,向前时 y 值增加起来了吗?
  • “96 是否代表 DPI?” - 如果单位为 1/96" 宽,则每英寸有 96 个单位,这意味着 96 DPI .
  • 我的 cmets 是为了澄清这个问题。由于我没有使用 python 或 pdf 矿工,我无法给出 python 答案。最后你需要得到PDF页面的裁剪框和默认的用户空间单元大小。后者最常见的是 1/72",但前者的差异更大。我不知道这些信息位是否是 pdf 矿工输出的一部分。如果不是,您必须从 PDF 页面单独检索它们。

标签: python pdf


【解决方案1】:

根据最后一个答案,我制作了自己的函数,因为它不起作用。最后一个答案是正确的,但无法纠正 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))

【讨论】:

    【解决方案2】:

    首先让我们了解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 矩形。表示 (x0, y0, x1, y1) 的 4 个浮点数的元组。边界框坐标。 srcSize:pdf页面的大小作为两个数字(宽度,高度)的元组,你可以通过我的回答https://stackoverflow.com/a/48886525/3022413得到(nvm它正在工作的downvotes,我测试了它) dstSize:目标坐标系的大小。 x 和 y 的元组(新坐标系的最大限制,可能是您尝试在其上绘制矩形的图像的大小?)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-10
      • 2021-05-10
      • 2012-09-06
      • 1970-01-01
      • 2011-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多