Python 如何读取整个文件夹中的已填充PDF表单,并将值传输到csv表中?

Python 如何读取整个文件夹中的已填充PDF表单,并将值传输到csv表中?,python,pdf,export-to-csv,Python,Pdf,Export To Csv,我有一个PDF表单文件夹,有6个可填充字段。如何制作一个脚本,可以读取所有表单,获取值,并将每个表单的值添加为CSV文件中的新记录 到目前为止,我已经设法使用PyPDF2读取单个文件并将所有值输入到字典中 这是我的代码: import PyPDF2 import csv f = PyPDF2.PdfFileReader('form.pdf') ff = f.getFields() 这是输出: >>> ff {'Name': {'/FT': '/Tx', '/T': 'Name

我有一个PDF表单文件夹,有6个可填充字段。如何制作一个脚本,可以读取所有表单,获取值,并将每个表单的值添加为CSV文件中的新记录

到目前为止,我已经设法使用PyPDF2读取单个文件并将所有值输入到字典中

这是我的代码:

import PyPDF2
import csv
f = PyPDF2.PdfFileReader('form.pdf')
ff = f.getFields()
这是输出:

>>> ff
{'Name': {'/FT': '/Tx', '/T': 'Name', '/V': 'Mike'},
'Favourite Colour': {'/FT': '/Tx', '/T': 'Favourite Colour', '/V': 'Blue'},
'Favourite Food': {'/FT': '/Tx', '/T': 'Favourite Food', '/V': "Apple"},
'Y/N': {'/FT': '/Ch', '/T': 'Y/N', '/Ff': 131072, '/V': 'Yes', '/DV': '-'},
'Number of Siblings': {'/FT': '/Tx', '/T': 'Number of Siblings', '/V': '2'},
'Phone Number': {'/FT': '/Tx', '/T': 'Phone Number', '/V': '829-555-5555'}}
然后,我使用get()提取所需的值:

gg = {}
gg['Name'] = ff.get('Name').get('/V')
gg['Favourite Colour'] = ff.get('Favourite Colour').get('/V')
gg['Favourite Food'] = ff.get('Favourite Food').get('/V')
gg['Y/N'] = ff.get('Y/N').get('/V')
gg['Number of Siblings'] = ff.get('Number of Siblings').get('/V')
gg['Phone Number'] = ff.get('Phone Number').get('/V')
这给了我:

>>> gg
{'Name': 'Mike', 'Favourite Colour': 'Blue', 'Favourite Food': 'Apple', 'Y/N': 'Yes', 'Number of Siblings': '10', 'Phone Number': '829-555-5555'}
但现在我不知道如何将其打印到CSV。问题还在于我有几十个这样的PDF表单,所以我不能只更改
f=PyPDF2.PdfFileReader('form.PDF')
,然后一个接一个地做

是否有一种方法可以读取完整的PDF表单文件夹,并将每个表单的值打印为CSV中的唯一记录


任何帮助都将不胜感激。谢谢大家!

您可以使用
dict
-comprehension使数据提取更清晰,即:

ff = {'Name': {'/FT': '/Tx', '/T': 'Name', '/V': 'Mike'},
'Favourite Colour': {'/FT': '/Tx', '/T': 'Favourite Colour', '/V': 'Blue'},
'Favourite Food': {'/FT': '/Tx', '/T': 'Favourite Food', '/V': "Apple"},
'Y/N': {'/FT': '/Ch', '/T': 'Y/N', '/Ff': 131072, '/V': 'Yes', '/DV': '-'},
'Number of Siblings': {'/FT': '/Tx', '/T': 'Number of Siblings', '/V': '2'},
'Phone Number': {'/FT': '/Tx', '/T': 'Phone Number', '/V': '829-555-5555'}}
gg = {k:v['/V'] for k,v in ff.items()}
print(gg)
输出:

{'Name': 'Mike', 'Favourite Colour': 'Blue', 'Favourite Food': 'Apple', 'Y/N': 'Yes', 'Number of Siblings': '2', 'Phone Number': '829-555-5555'}
请注意,我们不必硬编码字段以这种方式执行此操作。如果您要处理的所有文件的名称都以
.pdf
结尾,并且没有任何文件具有此类名称,并且实际上不是pdf文件,则您可以使用
glob
内置模块,然后再使用它进行处理,请检查是否存在以下情况:

import glob
for filename in glob.glob("*.pdf"):
    print(filename)

是否输出所有要处理的文件。要编写CSV文件,您可以利用内置模块
CSV

完成四分之三的工作

创建一个函数来包装您迄今为止所做的工作。给它起个好名字,比如
pdf\u form\u field\u values(pdf\u path)
。对于给定的pdf文件路径,这将返回一个字典

您还需要在文件夹中的所有PDF上创建一个循环。你可以用它

您可以使用文件写入csv文件。如果你想要一个标题,你可以告诉作者去创建它。您还可以告诉作者您希望列的顺序

总而言之:

from glob import glob
import csv

with io.open('results.csv', mode='w', newline='') as output:
    columns = ['Name', 'Favourite Colour', 'Favourite Food', 'Y/N',
               'Number of Siblings', 'Phone Number']

    writer = csv.DictWriter(output, columns)

    writer.writeheader()  # optional

    for pdf_path in glob('*.pdf'):
        fields = pdf_form_field_values(pdf_path)
        writer.write(fields)

我还没有测试过这段代码,所以可能会有一些小错误,但您知道了。

根据您的想法,您应该执行
writer.writeheader()
,以便使用header@Daweo对不起,我记错了。将很快纠正。@Daweo已修复,谢谢您的帮助