使用 PyPDF2 裁剪 pdf
crop a pdf with PyPDF2
我一直在从事一个项目,在该项目中我使用神经网络从 pdf 中提取 table 数据,
我成功检测到 tables 并获得它们的坐标 (x,y,width,height) ,我一直在尝试使用 pypdf2 裁剪 pdf 以隔离 table 但由于某种原因裁剪与期望的结果。
运行 推断后我得到这些坐标
[[5.0948269e+01, 1.5970685e+02, 1.1579385e+03, 2.7092386e+02
9.9353129e-01]]
第 5 个数字是我的神经网络精度,我们可以放心地忽略它
在 pyplot 中尝试它们有效,所以它们没有问题:
但是在 pypdf2 中使用相同的坐标总是关闭的
from PyPDF2 import PdfFileWriter, PdfFileReader
with open("mypdf.pdf", "rb") as in_f:
input1 = PdfFileReader(in_f)
output = PdfFileWriter()
numPages = input1.getNumPages()
for i in range(numPages):
page = input1.getPage(i)
page.cropBox.upperLeft = (5.0948269e+01,1.5970685e+02)
page.cropBox.upperLeft = (1.1579385e+03, 2.7092386e+02)
output.addPage(page)
with open("out.pdf", "wb") as out_f:
output.write(out_f)
这是我得到的输出:
我错过了什么吗?
谢谢!
给你:
from PyPDF2 import PdfFileWriter, PdfFileReader
with open("mypdf.pdf", "rb") as in_f:
input1 = PdfFileReader(in_f)
output = PdfFileWriter()
numPages = input1.getNumPages()
x, y, w, h = (5.0948269e+01, 1.5970685e+02, 1.1579385e+03, 2.7092386e+02)
page_x, page_y = input1.getPage(0).cropBox.getUpperLeft()
upperLeft = [page_x.as_numeric(), page_y.as_numeric()] # convert PyPDF2.FloatObjects into floats
new_upperLeft = (upperLeft[0] + x, upperLeft[1] - y)
new_lowerRight = (new_upperLeft[0] + w, new_upperLeft[1] - h)
for i in range(numPages):
page = input1.getPage(i)
page.cropBox.upperLeft = new_upperLeft
page.cropBox.lowerRight = new_lowerRight
output.addPage(page)
with open("out.pdf", "wb") as out_f:
output.write(out_f)
注意:在PyPDF2中,坐标原点位于页面的左下角。并且 Y 轴是从下往上指向的。不像在屏幕上。因此,如果您想获得裁剪区域顶部边缘的 PDF 坐标,您需要从页面高度中减去裁剪区域顶部边缘的 y 坐标。
我一直在从事一个项目,在该项目中我使用神经网络从 pdf 中提取 table 数据, 我成功检测到 tables 并获得它们的坐标 (x,y,width,height) ,我一直在尝试使用 pypdf2 裁剪 pdf 以隔离 table 但由于某种原因裁剪与期望的结果。 运行 推断后我得到这些坐标
[[5.0948269e+01, 1.5970685e+02, 1.1579385e+03, 2.7092386e+02 9.9353129e-01]]
第 5 个数字是我的神经网络精度,我们可以放心地忽略它
在 pyplot 中尝试它们有效,所以它们没有问题:
但是在 pypdf2 中使用相同的坐标总是关闭的
from PyPDF2 import PdfFileWriter, PdfFileReader
with open("mypdf.pdf", "rb") as in_f:
input1 = PdfFileReader(in_f)
output = PdfFileWriter()
numPages = input1.getNumPages()
for i in range(numPages):
page = input1.getPage(i)
page.cropBox.upperLeft = (5.0948269e+01,1.5970685e+02)
page.cropBox.upperLeft = (1.1579385e+03, 2.7092386e+02)
output.addPage(page)
with open("out.pdf", "wb") as out_f:
output.write(out_f)
这是我得到的输出:
谢谢!
给你:
from PyPDF2 import PdfFileWriter, PdfFileReader
with open("mypdf.pdf", "rb") as in_f:
input1 = PdfFileReader(in_f)
output = PdfFileWriter()
numPages = input1.getNumPages()
x, y, w, h = (5.0948269e+01, 1.5970685e+02, 1.1579385e+03, 2.7092386e+02)
page_x, page_y = input1.getPage(0).cropBox.getUpperLeft()
upperLeft = [page_x.as_numeric(), page_y.as_numeric()] # convert PyPDF2.FloatObjects into floats
new_upperLeft = (upperLeft[0] + x, upperLeft[1] - y)
new_lowerRight = (new_upperLeft[0] + w, new_upperLeft[1] - h)
for i in range(numPages):
page = input1.getPage(i)
page.cropBox.upperLeft = new_upperLeft
page.cropBox.lowerRight = new_lowerRight
output.addPage(page)
with open("out.pdf", "wb") as out_f:
output.write(out_f)
注意:在PyPDF2中,坐标原点位于页面的左下角。并且 Y 轴是从下往上指向的。不像在屏幕上。因此,如果您想获得裁剪区域顶部边缘的 PDF 坐标,您需要从页面高度中减去裁剪区域顶部边缘的 y 坐标。