Python 使用 OCR 转换 PDF 时 Mac 上的 Wand Eating all available Disk Space

Python Wand Eating all available Disk Space on Mac when converting PDFs using OCR

我相信这是我的第一个 Whosebug 问题,所以请多多关照。

我正在对一个 PDF 存储库(总共约 1GB)进行 OCR,每个 50-200 页不等,突然发现我的 Macbook Pro 上所有可用的 100GB 剩余硬盘 space 都不见了。根据之前的 post,ImageMagick 似乎是罪魁祸首 here

我发现这些文件名为 'magick-*' 并存储在 /private/var/tmp 中。它仅针对 23 个 PDF 创建了 3576 个文件,总计 181GB。

如何在不再需要这些文件后立即在代码中删除它们?预先感谢您提出解决此问题的任何建议。

代码如下:

import io, os
import json
import unicodedata
from PIL import Image as PI
import pyocr
import pyocr.builders
from wand.image import Image
from tqdm import tqdm

# Where you want to save the PDFs
destination_folder = 'contract_data/Contracts_Backlog/'


pdfs = [unicodedata.normalize('NFKC',f.decode('utf8')) for f in os.listdir(destination_folder) if f.lower().endswith('.pdf')]
txt_files = [unicodedata.normalize('NFKC',f.decode('utf8')) for f in os.listdir(destination_folder) if f.lower().endswith('.txt')]


### Perform OCR on PDFs
def ocr_pdf_to_text(filename):
    tool = pyocr.get_available_tools()[0]
    lang = 'spa'
    req_image = []
    final_text = []
    image_pdf = Image(filename=filename, resolution=300)
    image_jpeg = image_pdf.convert('jpeg')
    for img in image_jpeg.sequence:
        img_page = Image(image=img)
        req_image.append(img_page.make_blob('jpeg'))

    for img in req_image: 
        txt = tool.image_to_string(
            PI.open(io.BytesIO(img)),
            lang=lang,
            builder=pyocr.builders.TextBuilder()
        )
        final_text.append(txt)
    return final_text

for filename in tqdm(pdfs):
    txt_file = filename[:-3] +'txt'
    txt_filename = destination_folder + txt_file
    if not txt_file in txt_files: 
        print 'Converting ' + filename 
        try:
            ocr_txt = ocr_pdf_to_text(destination_folder + filename)
            with open(txt_filename,'w') as f:
                for i in range(len(ocr_txt)):
                    f.write(json.dumps({i:ocr_txt[i].encode('utf8')}))
                    f.write('\n')
            f.close()
        except:
            print "Could not OCR " + filename

处理此问题的一种 hacky 方法是在主循环中添加 os.remove() 语句以在创建后删除 tmp 文件。

tempdir = '/private/var/tmp/'
files = os.listdir(tempdir)
    for file in files:
        if "magick" in file:
            os.remove(os.path.join(tempdir,file))

Image 应该用作上下文管理器,因为 Wand 确定处理资源(包括临时文件、内存缓冲区等)的时间。 with block help Wand 知道何时仍然需要这些 Image 对象以及何时不需要它们。

另见 official docs