Python魔杖在使用OCR转换PDF时,在Mac上占用所有可用的磁盘空间

时间:2017-07-27 03:57:48

标签: python pdf imagemagick ocr wand

我相信这是我的第一个StackOverflow问题,所以请你好。

我正在OCRing PDF的存储库(总共约1GB),每个50-200页,发现我的Macbook Pro上剩余的100GB剩余硬盘空间突然消失了。基于之前的帖子,似乎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

2 个答案:

答案 0 :(得分:1)

处理这个问题的一种黑客方法是在主循环中添加一个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))

答案 1 :(得分:0)

Image应该用作上下文管理器,因为Wand确定处理资源的时间,包括临时文件,内存缓冲区等。 with阻止帮助Wand在需要这些Image个对象时以及现在不需要这些对象时知道边界。

另请参阅official docs