Как получить pypdf для чтения содержимого страницы построчно?

У меня есть PDF, в котором каждая страница содержит адрес. Адреса в этом формате:

Location Name

Street Address

City, State Zip

например:

The Gift Store

620 Broadway Street

Van Buren, AR 72956

Каждый адрес только в этом формате, и каждый находится на другой странице PDF.

Мне нужно извлечь адресную информацию и сохранить результаты в файле Excel / CSV. Мне нужно, чтобы записи были отдельными для каждого поля информации. Мой лист Excel должен иметь название местоположения, почтовый адрес, город, штат, почтовый индекс в разных столбцах. Я использую pyPdf в Python.

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

import pyPdf  
def getPDFConten(path):
    content = ""
    num_pages = 10
    p = file(path, "rb")
    pdf = pyPdf.PdfFileReader(p)
    for i in range(9, num_pages):
        x = pdf.getPage(i).extractText()+'\n' 
        content += x

    content = " ".join(content.replace(u"\xa0", " ").strip().split())     
    return content

con = getPDFContent("document.pdf")
print con

или мой приведенный выше пример дает "Магазин подарков 620 Broadway Street Van Buren, AR 72956".

Если я могу читать входные данные построчно, тогда я легко получу Имя местоположения и Адрес Стри из первых двух строк, а остальные из третьей строки, используя подстроки.

Я попытался использовать решение, перечисленное [здесь ( pyPdf игнорирует переводы строк в файле PDF), но оно не сработало для меня. Я также попытался использовать pdfminer: он может извлекать информацию построчно, но сначала конвертирует pdf в текстовый файл, и я не хочу этого делать. Я хочу сделать это, используя только PyPdf. Кто-нибудь может подсказать, где я не прав или чего мне не хватает? Возможно ли это сделать с помощью pyPdf?

1 ответ

Решение

Вы можете попробовать использовать subprocess звонить pdftotext (вероятно, с -layout вариант) из утилиты poppler. Это сработало для меня намного лучше, чем использование pypdf.

Например, я использовал следующий код для извлечения номеров CAS из файла PDF:

import subprocess
import re

def findCAS(pdf, page=None):
    '''Find all CAS numbers on the numbered page of a file.

    Arguments:
    pdf -- Name of the PDF file to search
    page -- number of the page to search. if None, search all pages.
    '''
    if page == None:
        args = ['pdftotext', '-layout', '-q', pdf, '-']
    else:
        args = ['pdftotext', '-f', str(page), '-l', str(page), '-layout',
                '-q', pdf, '-']
    txt = subprocess.check_output(args)
    candidates =  re.findall('\d{2,6}-\d{2}-\d{1}', txt)
    checked = [x.lstrip('0') for x in candidates if checkCAS(x)]
    return list(set(checked))

def checkCAS(cas):
    '''Check if a string is a valid CAS number.

    Arguments:
    cas -- string to check
    '''
    nums = cas[::-1].replace('-', '') # all digits in reverse order
    checksum = int(nums[0]) # first digit is the checksum
    som = 0
    # Checksum method from: http://nl.wikipedia.org/wiki/CAS-nummer
    for n, d in enumerate(nums[1:]):
        som += (n+1)*int(d)
    return som % 10 == checksum
Другие вопросы по тегам