【问题标题】:Python pdfminer extract image produces multiple images per page (should be single image)Python pdfminer extract image 每页生成多张图片(应该是单张图片)
【发布时间】:2016-07-11 22:41:58
【问题描述】:

我正在尝试提取 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_image'wb' 模式下以pageNum_imgNum 格式为每个图像写入一个文件,或者在'a' 模式下每页写入一个图像。我尝试了许多文件扩展名,但都没有成功。

我研究过的资源:

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

【问题讨论】:

    标签: python-2.7 pdfminer


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      你尝试过这样的事情吗?

      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
      

      【讨论】:

        【解决方案3】:

        图像平铺问题的(部分)解决方案发布在此处:PDF: extracted images are sliced / tiled

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

        import io
        from PIL import Image
        
        image = Image.open(io.BytesIO(thing.stream.get_data()))
        print(image.format)
        

        【讨论】:

          猜你喜欢
          • 2013-02-24
          • 1970-01-01
          • 2016-09-07
          • 2011-10-31
          • 1970-01-01
          • 2017-03-21
          • 2019-10-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多