首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Python3.7 pdf2image库解决pdf2image问题?

如何使用Python3.7 pdf2image库解决pdf2image问题?
EN

Stack Overflow用户
提问于 2019-06-06 06:08:22
回答 5查看 9.6K关注 0票数 12

我正在使用Python库运行一个简单的PDF到图像转换。我当然可以理解,这个库正在跨越最大内存阈值来达到这个错误。但是,PDF是6.6MB(大约),那么它为什么要占用内存GBs来抛出内存错误呢?

代码语言:javascript
复制
Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:06:47) [MSC v.1914 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from pdf2image import convert_from_path
>>> pages = convert_from_path(r'C:\Users\aakashba598\Documents\pwc-annual-report-2017-2018.pdf', 200)
Exception in thread Thread-3:
Traceback (most recent call last):
  File "C:\Users\aakashba598\AppData\Local\Programs\Python\Python37-32\lib\threading.py", line 917, in _bootstrap_inner
    self.run()
  File "C:\Users\aakashba598\AppData\Local\Programs\Python\Python37-32\lib\threading.py", line 865, in run
    self._target(*self._args, **self._kwargs)
  File "C:\Users\aakashba598\AppData\Local\Programs\Python\Python37-32\lib\subprocess.py", line 1215, in _readerthread
    buffer.append(fh.read())
MemoryError

另外,解决这一问题的可能办法是什么?

更新:当我从convert_from_path函数中减少dpi参数时,它的工作方式就像一种魅力。但是制作的图片质量很低(原因很明显)。有办法解决这个问题吗?喜欢一批一批地创建图像,每次清理内存。如果有办法,怎么做呢?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2019-06-06 06:23:04

每次将PDF转换为10页(1-10页、11-20页等)

代码语言:javascript
复制
from pdf2image import pdfinfo_from_path,convert_from_path
info = pdfinfo_from_path(pdf_file, userpw=None, poppler_path=None)

maxPages = info["Pages"]
for page in range(1, maxPages+1, 10) : 
   convert_from_path(pdf_file, dpi=200, first_page=page, last_page = min(page+10-1,maxPages))
票数 28
EN

Stack Overflow用户

发布于 2019-06-06 18:57:17

我有点晚了,但问题确实与136页的记忆有关。你可以做三件事。

  1. 指定转换图像的格式。

默认情况下,pdf2image使用PPM作为其图像格式,它速度更快,但占用的内存也更多(每幅图像超过30 is!)。要解决这个问题,您可以使用一种更方便内存的格式,如jpeg或png。

代码语言:javascript
复制
convert_from_path('C:\path\to\your\pdf', fmt='jpeg')

这可能会解决问题,但主要是因为压缩,并且在某个时候(比如+500页PDF),这个问题会再次出现。

  1. 使用输出目录

这是我推荐的,因为它允许您处理任何PDF。README页面上的示例很好地解释了这一点:

代码语言:javascript
复制
import tempfile

with tempfile.TemporaryDirectory() as path:
    images_from_path = convert_from_path('C:\path\to\your\pdf', output_folder=path)

这会将图像临时写入计算机存储,这样您就不必手动删除它。但是,在退出with上下文之前,一定要做任何您需要做的处理!

  1. 以块方式处理PDF文件

pdf2image允许您定义第一个页面,这是您要处理的最后一个页面。这意味着,在您的情况下,使用136页的PDF,您可以:

代码语言:javascript
复制
for i in range(0, 136 // 10 + 1):
    convert_from_path('C:\path\to\your\pdf', first_page=i*10, last_page=(i+1)*10)
票数 13
EN

Stack Overflow用户

发布于 2019-09-16 23:19:57

接受的答案有一个小问题。

maxPages = pdf2image._page_count(pdf_file)

不能再使用了,因为不推荐使用_page_count。我找到了同样的解决方案。

代码语言:javascript
复制
from PyPDF2 import PdfFileWriter, PdfFileReader    
inputpdf = PdfFileReader(open(pdf, "rb"))
maxPages = inputpdf.numPages
for page in range(1, maxPages, 100):
    pil_images = pdf2image.convert_from_path(pdf, dpi=200, first_page=page,
                                                     last_page=min(page + 100 - 1, maxPages), fmt= 'jpg',
                                                     thread_count=1, userpw=None,
                                                     use_cropbox=False, strict=False)

这种方式,无论文件多么大,它将同时处理100,并且内存的使用总是最小的。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56471728

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档