【发布时间】:2019-07-17 04:30:02
【问题描述】:
我有一个包含手写内容的多页 .pdf(扫描图像),我想裁剪并存储为新的单独图像。例如,在下面的视觉效果中,我想将 2 个框内的笔迹提取为单独的图像。如何使用 python 自动为大型多页 .pdf 执行此操作?
我尝试使用 PyPDF2 包根据 (x,y) 坐标裁剪其中一个手写框,但是这种方法对我不起作用,因为手写框的边界/坐标并不总是相同对于pdf中的每一页。我相信检测盒子将是自动裁剪的更好方法。不确定它是否有用,但下面是我用于 (x,y) 坐标方法的代码:
from PyPDF2 import PdfFileReader, PdfFileWriter
reader = PdfFileReader('data/samples.pdf', 'r')
# getting the first page
page = reader.getPage(0)
writer = PdfFileWriter()
# Loop through all pages in pdf object to crop based on (x,y) coordinates
for i in range(reader.getNumPages()):
page = reader.getPage(i)
page.cropBox.setLowerLeft((42,115))
page.cropBox.setUpperRight((500, 245))
writer.addPage(page)
outstream = open('samples_cropped.pdf','wb')
writer.write(outstream)
outstream.close()
提前感谢您的帮助
【问题讨论】:
-
PDF 是一种矢量格式。它没有以像素为单位的大小,直到通过在读取时提供密度来进行光栅化。因此,您需要先对其进行光栅化,或者如果它具有嵌入的图像,然后使用 pdfimages 之类的东西提取它。完成后,您可以使用 OpenCV 或 Imagemagick 查找轮廓或斑点,然后使用连接组件查找矩形的边界框。然后你可以裁剪这些区域。
-
@fmw42 感谢分享。我不是这方面的专家,所以请原谅我的新手问题。所以第1步只是将pdf中的所有页面转换为图像格式,比如jpeg?补充一下这个 pdf 文档是从扫描仪进纸器生成的可能会有所帮助,所以我不确定“嵌入式图像[s]”
-
如果它被扫描,那么它很可能是嵌入在矢量 PDF 外壳中的光栅图像。所以最好的方法是使用 pdfimages 来提取光栅图像,最好是 PNG 或 TIFF 而不是 JPG。 JPG 是一种有损压缩格式。见linux.die.net/man/1/pdfimages 和cyberciti.biz/faq/easily-extract-images-from-pdf-file
-
@fmw42 我正在尝试按照您分享的 pdfimages linux 说明进行操作:cyberciti.biz/faq/easily-extract-images-from-pdf-file。我研究了一下,了解到我需要使用 subprocess 包在我的 python 代码中执行 linux 命令。但是如何正确安装
apt-get install poppler-utils?我需要使用自制软件吗?如果相关,我在 macOS 上,使用 conda 虚拟环境,在 jupyter lab 上用 python 编码。 -
最好检查 Homebrew 的那个包。我在 Mac 上,是从 MacPorts 完成的。
标签: python opencv image-processing computer-vision pypdf2