我正在使用pdf挖掘器将数据提取到xml文件,当我注意到对象'坐标系以下列方式表示:
<textline bbox="187.098,693.242,288.642,709.202">
如何使用Python将此坐标转换为像素系统(x,y),并已将bbox数据解析为Python中的变量?
答案 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))