5

我正在尝试提取 PDF 中的图像。我正在使用的文件是 2 页以上。第 1 页是文本,第 2-n 页是图像(每页一个,或者它可能是跨多个页面的单个图像;我无法控制原点)。

我能够从第 1 页解析出文本,但是当我尝试获取图像时,每个图像页面都会获得 3 个图像。我无法确定难以保存的图像类型。此外,尝试将每页 3 张图片保存为单个 img 不会提供任何结果(因为无法通过 OSX 上的 finder 打开)

样本:

fp = open('the_file.pdf', 'rb')
parser = PDFParser(fp)
document = PDFDocument(parser)
rsrcmgr = PDFResourceManager()
laparams = LAParams()
device = PDFPageAggregator(rsrcmgr, laparams=laparams)
interpreter = PDFPageInterpreter(rsrcmgr, device)


for page in PDFPage.create_pages(document):
    interpreter.process_page(page)
    pdf_item = device.get_result()
    for thing in pdf_item:
        if isinstance(thing, LTImage):
            save_image(thing)
        if isinstance(thing, LTFigure):
            find_images_in_thing(thing)


def find_images_in_thing(outer_layout):
    for thing in outer_layout:
        if isinstance(thing, LTImage):
            save_image(thing)

save_imagepageNum_imgNum在模式中以格式为每个图像写入一个文件,'wb'或者在模式中为每页写入一个图像'a'。我尝试了许多文件扩展名,但都没有成功。

我研究过的资源:

http://denis.papathanasiou.org/posts/2010.08.04.post.html(过时的 pdfminer 版本) http://nedbatchelder.com/blog/200712/extracting_jpgs_from_pdfs.html

4

3 回答 3

4

自从提出这个问题以来已经有一段时间了,但我会为社区做出贡献,并可能为您带来好处:)

我一直在使用名为 pdfimages 的图像解析器,可通过 poppler PDF 处理框架获得。它还为每个图像输出多个文件;对于 PDF 生成器来说,将图像“平铺”或“剥离”成多个图像似乎是一种相对常见的行为,然后在抓取时需要将这些图像拼凑在一起,但在查看 PDF 时似乎完全完好无损。我通过 pdfimages 和其他地方看到的格式/文件扩展名是:png、tiff、jp2、jpg、ccitt。你试过所有这些吗?

于 2017-08-23T20:04:24.157 回答
1

你有没有尝试过这样的事情?

from binascii import b2a_hex
def determine_image_type (stream_first_4_bytes):
    """Find out the image file type based on the magic number comparison of the first 4 (or 2) bytes"""
       file_type = None
       bytes_as_hex = b2a_hex(stream_first_4_bytes).decode()
       if bytes_as_hex.startswith('ffd8'):
          file_type = '.jpeg'
       elif bytes_as_hex == '89504e47':
          file_type = '.png'
       elif bytes_as_hex == '47494638':
          file_type = '.gif'
       elif bytes_as_hex.startswith('424d'):
          file_type = '.bmp'
       return file_type
于 2020-01-20T14:10:03.140 回答
0

此处发布了图像平铺问题的(部分)解决方案:PDF:对提取的图像进行切片/平铺

我会在图像库中使用来查找图像类型:

import io
from PIL import Image

image = Image.open(io.BytesIO(thing.stream.get_data()))
print(image.format)
于 2021-07-09T17:32:07.753 回答