【问题标题】:Convert data from PDFform to CSV将数据从 PDF 格式转换为 CSV
【发布时间】:2015-10-09 20:46:03
【问题描述】:

我正在尝试将在多个可填写的 pdf 表单中输入的数据转换为一个 csv 文件。
这段代码由几个步骤组成:

  1. 打开新的 .csv 文件(标题行)
  2. 使用“for...in”循环打开多个 pdf 表单
  3. 将表单域中输入的数据转换为 csv

但是,在运行命令时我收到错误:

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

等等。 “无”代表“空文本框”; “1”和“0”分别代表“是”和“否”输出。

【问题讨论】:

  • 错误发生前一行print函数的输出是什么?
  • value 需要是一个序列。如果还没有,请尝试writer.writerow([value])
  • @martineau,问题几乎解决了。我希望它是一行上的逗号分隔值(清理中间的空白)。但这超出了我对 python 的了解。
  • writerow() 将在作为参数传递给它的序列中的每个元素之间放置一个逗号。当您使用[value] 时,序列仅由一个元素组成,即value 中的所有元素。请向我们展示value 中的数据是什么样的。如果每个字段都不同,那么我们也需要知道这一点。
  • @martineau 我编辑了这条评论。

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


【解决方案1】:

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

    .
    .
    .
#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 列表。这就是我答案中的代码所做的——我认为,但无法测试。

【讨论】:

  • 这看起来好多了!我还有两个问题。 1.一些值字段允许'输入'并使输出在csv中跳转行。 2. 脚本向后抓取表单。
  • writer.writerow(('Name coordinator', 'Date', 'Address','District','City', 'Complaintnr')) 在 csv 中写入我的标题行。我给了你一个示例标题代码。该表格有 25 个问题,因此将包含 25 个标题而不是 6 个。这一行比此处显示的要长得多。
  • 您可能必须先检查这些值,然后再将它们附加到行列表。这样您就可以更改为特殊情况添加的内容,例如“输入”或None。如果“向后刮”你的意思是字段值的顺序相反,你可以用writer.writerow(list(reversed(row)))来解决这个问题。
  • writer.writerow(list(reversed(row))) 正是我所需要的,再次感谢。 “在将它们附加到行列表之前检查值”我不知道如何。很好的提示。我会在网上搜索,除非你准备好解决方案:-)
  • 您可以通过一系列if语句检查和更正row.append()之前的值:即if value is None: value = ''elif value == '1': value = 'yes'等。如果我的回答对您有帮助,请考虑接受并/或向上投票。谢谢。
猜你喜欢
  • 1970-01-01
  • 2020-05-09
  • 1970-01-01
  • 2019-06-20
  • 2018-01-31
  • 2019-05-08
  • 2017-02-13
  • 2019-03-09
  • 1970-01-01
相关资源
最近更新 更多