将数据从PDF格式转换为CSV

时间:2015-07-20 16:15:15

标签: python python-2.7 csv pdf pdf-form

我正在尝试将在多个可填写的pdf格式中输入的数据转换为一个csv文件 此代码包含几个步骤:

  1. 打开新的.csv文件(标题行)
  2. 使用"打开多个pdf表单,用于... in"环
  3. 将表单字段中输入的数据转换为csv
  4. 但是,在运行命令时,我收到错误:

    fc-int01-generateAppearances: None
    Traceback (most recent call last):
        File "C:\Python27\Scripts\test3.py", line 31, in <module>
            writer.writerow(value)
        _csv.Error: sequence expected
    

    如果我只是python中的打印值(表单数据),它可以工作。但导入数据却没有。可能还存在从行到列的值有问题的问题。我希望我很清楚。

    这是我的代码:

    import glob
    import os
    import sys
    import csv
    from pdfminer.pdfparser import PDFParser
    from pdfminer.pdfdocument import PDFDocument
    from pdfminer.pdftypes import resolve1
    
    #input file path for specific file
    #filename = "C:\Python27\Scripts\MH_1.pdf"
    #fp = open(filename, 'rb')
    
    #open new csv file
    out_file=open('C:\Users\Wonen\Downloads\Test\output.csv', 'w+')
    writer = csv.writer(out_file)
    #header row
    writer.writerow(('Name coordinator', 'Date', 'Address', 'District',
                     'City', 'Complaintnr'))
    
    #enter folder path to open multiple files
    path = 'C:\Users\Wonen\Downloads\Test'
    for filename in glob.glob(os.path.join(path, '*.pdf')):
        fp = open(filename, 'rb')
        #read pdf's
        parser = PDFParser(fp)
        doc = PDFDocument(parser)
        #doc.initialize()    # <<if password is required
        fields = resolve1(doc.catalog['AcroForm'])['Fields']
        for i in fields:
            field = resolve1(i)
            name, value = field.get('T'), field.get('V')
            print '{0}: {1}'.format(name, value)
            writer.writerow(value)
    

    使用print (repr(value))

    的文本pdf(包括所有输出)的输出
    None
    'Crip Gang'
    None
    None
    None
    /Ja
    None
    /1
    /1
    None
    None
    /Ja
    /Ja
    None
    None
    None
    'wfwf'
    'sd'
    'dfwf'
    'ffasf'
    'tsdbd'
    'dfadfasdf'
    None
    'df'
    None
    'asdff'
    None
    'wff'
    None
    'ffs'
    None
    None
    None
    None
    None
    None
    None
    None
    None
    None
    None
    '1'
    '2'
    '7'
    /0
    'Ja'
    'Two unlimited'
    'Captain Jack'
    None
    'www.kijkbijmij.nl'
    'Onderverhuur'
    /Ja
    

    等。等等#34;无&#34;代表&#34;空文本框&#34 ;;和&#34; 1&#34;和&#34; 0&#34;代表&#34;是&#34;和&#34;不&#34;输出。

1 个答案:

答案 0 :(得分:0)

尝试更改代码的最后一部分,如下所示:

    .
    .
    .
#enter folder path to open multiple files
path = 'C:\Users\Wonen\Downloads\Test'
for filename in glob.glob(os.path.join(path, '*.pdf')):
    fp = open(filename, 'rb')
    #read pdf's
    parser = PDFParser(fp)
    doc = PDFDocument(parser)
    #doc.initialize()    # <<if password is required
    fields = resolve1(doc.catalog['AcroForm'])['Fields']
    row = []
    for i in fields:
        field = resolve1(i)
        name, value = field.get('T'), field.get('V')
        row.append(value)
    writer.writerow(row)

out_file.close()

目前尚不清楚这是否有效,但它可能会为您提供解决问题所需的信息。

令人困惑的是,对于csv的第一个标题行:

writer.writerow(('Name coordinator', 'Date', 'Address','District','City', 'Complaintnr'))

定义了每行写入的字段值。这意味着fields应该是一个列表,其中包含该订单中这6个项目的数据。

您需要弄清楚如何将每组fields中的内容翻译成6个数据项的row列表。这就是我的答案中的代码 - 我想,但无法测试。