Как избежать PDF файлов с ошибкой неверного пароля с помощью PDFminer - PullRequest
0 голосов
/ 04 мая 2019

Я хочу собрать все файлы PDF со своего компьютера и извлечь текст из каждого. Обе функции, которые у меня есть в настоящее время, делают это, однако некоторые PDF-файлы выдают мне эту ошибку:

raise PDFPasswordIncorrect 
pdfminer.pdfdocument.PDFPasswordIncorrect

Я поднял ошибку в функции, которая открывает и читает файлы PDF, и это, казалось, работало с точки зрения игнорирования ошибки, но теперь она игнорирует все файлы PDF, включая хорошие, которые раньше не были проблемой.

Как я могу сделать так, чтобы он игнорировал только те файлы PDF, которые дают мне эту ошибку, а не каждый отдельный PDF?

def pdfparser(x):
    try:
        raise PDFPasswordIncorrect(pdfminer.pdfdocument.PDFPasswordIncorrect)
        fp = open(x, 'rb')
        rsrcmgr = PDFResourceManager()
        retstr = io.StringIO()
        codec = 'utf-8'
        laparams = LAParams()
        device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)
        # Create a PDF interpreter object.
        interpreter = PDFPageInterpreter(rsrcmgr, device)
        # Process each page contained in the document.
    except (RuntimeError, TypeError, NameError,ValueError,IOError,IndexError,PermissionError):
         print("Error processing {}".format(name))

    for page in PDFPage.get_pages(fp):
        interpreter.process_page(page)
        data =  retstr.getvalue()

    return(data)

    def pdfs(files):
            for name in files:
                    try:
                        IP_list = (pdfparser(name))
                        keyword = re.findall(inp,IP_list)
                        file_dict['keyword'].append(keyword)
                        file_dict['name'].append(name.name[0:])
                        file_dict['created'].append(time.ctime(name.stat().st_ctime))
                        file_dict['modified'].append(time.ctime(name.stat().st_mtime))
                        file_dict['path'].append(name)
                        file_dict["content"].append(IP_list)
                    except (RuntimeError, TypeError, NameError,ValueError,IOError,IndexError,PermissionError):
                        print("Error processing {}".format(name))
                    #print(file_dict)
            return(file_dict)
    pdfs(files)

1 Ответ

0 голосов
/ 04 мая 2019

Почему вы вручную выводите ошибку, которая может произойти, если вы откроете PDF-файл, защищенный паролем, если вы не введете правильный пароль?

Эта ошибка выдается вашим кодом каждый раз!

Вместо этого вам нужно перехватить ошибку, если она произойдет, и пропустить этот файл. Смотрите исправленный код:

def pdfparser(x):
    try: 
        # try to open your pdf here - do not raise the error yourself!
        # if it happens, catch and handle it as well

     except PDFPasswordIncorrect as e:      # catch PDFPasswordIncorrect
         print("Error processing {}: {}".format(name,e)) # with all other errors
         # no sense in doing anything if you got an error until here
         return None 


    # do something with your pdf and collect data
    data = []

    return(data)


    def pdfs(files):
        for name in files: 
            try:
                IP_list = pdfparser(name)

                if IP_list is None:             # unable to read for whatever reasons
                    continue                    # process next file

                # do stuff with your data if you got some                

            # most of these errors are already handled inside pdfparser
            except (RuntimeError, TypeError, NameError,ValueError,
                    IOError,IndexError,PermissionError):
                print("Error processing {}".format(name))

    return(file_dict)

    pdfs(files)

Второй try/catch: в def pdfs(files): может быть сокращен, все ошибки, связанные с файлами, происходят внутри def pdfparser(x): и обрабатываются там. Остальная часть вашего кода неполная и содержит ссылки на вещи, о которых я не знаю:

file_dict
inp
name # used as filehandle for .stat() but is a string etc
...