我似乎找不到以前的任何问题,教程或youtube视频来帮助解决我的问题。该项目正在创建500个随机角色,将该信息导出到csv中,然后填写可填写的PDF表单。一旦启动并运行,我便可以将其交给人力资源部门来帮助他们填写表格。我可以创建一个报告,但是对我来说一生都无法弄清楚如何制作另一个499。每次尝试时,它都会覆盖以前的结果。
我的随机角色生成器:
import random
import sys
sys.stdout = open('roles.csv', 'a')
def role_generator():
firstnames = open ('first_names.txt').read().splitlines()
lastnames = open ('last_names.txt').read().splitlines()
months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
for num in range(500):
first = random.choice(firstnames)
last = random.choice(lastnames)
day = random.randint(1, 29)
month = random.choice(months)
year = random.randint(1960, 2001)
idnumber = random.randint(1234567, 9999999)
print(f'1, last name, {last}\n2, first name, {first}\n3, id number, {idnumber}\n4, date of birth, {day}-{month}-{year}\n')
role_generator()
我的PDF填充器
import os
os.system('pdfforms inspect screening*.pdf')
os.system('pdfforms fill roles.csv '
'screening.pdf '
'screening_1.pdf')
我对编程很陌生,所以请按巴尼风格划分所有答案,以便我理解。我在Ubuntu OS上使用Python 3.6。到目前为止,您所看到的所有编码都是我到目前为止尚未完成的研究。
谢谢!
更新:
应Vitor Baptista的要求,这是程序保存csv文件的方式:
screening.pdf
1, last name, Hendrickson
2, first name, Jane
3, id number, 8190287
4, date of birth, 6-Feb-1991
根据我的收集,您需要在CSV文件的第一列和第一行中包含pdf文件。然后,您需要在pdf表格中标记每个条目的位置。我是通过上面的inspect命令完成的,该命令创建了一个JSON文件。然后,我查看了JSON以查看每个字段具有的数值,以便可以在csv中适当地标记它们。
答案 0 :(得分:1)
考虑到路径,这可能会出现一些错误-但应该以某种方式起作用:
import random
def make_filename(first,last,year,month,day):
# make sure your names do not contain any character thats
# impossible in a filename - if so, clean them first or
# clean the file name after constructing it
# Potter_Harry_1970_Jan_01.pdf
return f'{last}_{first}_{year}_{month}_{day:02}.pdf'
def role_generator():
# fixed the file reading to use with open
# changed the id-generation to not have dupes
# changed it to yield each single result as tuple (filename, text)
with open ('first_names.txt') as f :
firstnames = [x.strip() for x in f.read().splitlines() if x.strip()]
with open ('last_names.txt') as f:
lastnames = [x.strip() for x in f.read().splitlines() if x.strip()]
months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
how_many = 500
# changed because "idnumber = random.randint(1234567, 9999999)" may produce dupes
ids = random.sample(range(1234567, 10000000),k=how_many) # no dupes this way
for num in range(how_many):
first = random.choice(firstnames)
last = random.choice(lastnames)
day = random.randint(1, 29)
month = random.choice(months)
year = random.randint(1960, 2001)
idnumber = id.pop()
text = f'''screening.pdf
1, last name, {last}
2, first name, {first}
3, id number, {idnumber}
4, date of birth, {day}-{month}-{year}
'''
yield (make_filename(first,last,year,month,day),text)
# for each single result do:
for new_name, text in role_generator():
# write one person as roles.csv
with open("./roles.csv","w") as f:
f.write(text)
# fill one pdf - might need absolute path to template-pdf
os.system('pdfforms inspect ./screening.pdf')
# this also might need the absolute path
os.system('pdfforms fill ./roles.csv')
# this will rename the one pdf to the new_name also provided - you might
# need to fix this to fit the paths
os.rename('/home/PycharmProjects/untitled/filled/screening.pdf',
'/home/PycharmProjects/untitled/screening/' + new_name)
这样,每个单个pdf表单都由一个role.csv生成,然后移动/重命名 与您的姓名相似。...
答案 1 :(得分:0)
好吧,我想出了一些。这很可能不是最好的方法,但目前可以使用:
我没有更改随机角色生成器的任何内容,因此它看起来仍然像这样:
import random
import sys
sys.stdout = open('roles.csv', 'a')
def role_generator():
firstnames = open ('first_names.txt').read().splitlines()
lastnames = open ('last_names.txt').read().splitlines()
months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
for num in range(500):
first = random.choice(firstnames)
last = random.choice(lastnames)
day = random.randint(1, 29)
month = random.choice(months)
year = random.randint(1960, 2001)
idnumber = random.randint(1234567, 9999999)
print(f'1, last name, {last}\n2, first name, {first}\n3, id number, {idnumber}\n4, date of birth, {day}-{month}-{year}\n')
role_generator()
我在PDF Filler中添加了一个终端命令:
def rolegenerator():
os.system('pdfforms inspect screening.pdf')
os.system('pdfforms fill roles.csv')
os.system('cp /home/PycharmProjects/untitled/filled/screening.pdf /home/PycharmProjects/untitled/screening/screening.pdf')
您需要确保系统上已安装pdfforms。我将Pycharm用于我的项目,所以我只是通过该程序安装了它。 PDFForms将“检查”您的pdf(确保它是可填写的表单),并在项目目录中创建一个“ test”文件夹。查看您的“测试” pdf文件,以了解每个字段的标签方式。在随机角色生成器中创建csv文件时,需要使用这些数字(查看打印行并将其与上述csv示例进行比较)。
下一条命令将使用命令行中包含的csv文档填写pdf表单。在我的情况下是“ roles.csv”。这将创建一个“已填充”目录,并具有一个供您使用的PDF格式。
然后我决定将填写的pdf复制到另一个名为“ screening”的目录,这是第三个命令。
我使用以下代码以单独的名称保存每个文件:
def save_file():
path = "/home/PycharmProjects/untitled/screening/screening.pdf/"
newPath = "/home/PycharmProjects/untitled/screening"
i = 1
for root, dirs, files in os.walk(path):
for name in files:
base, extension = os.path.splitext(name)
if not os.path.exists(os.path.join(newPath, base + extension)):
oldfile = os.path.join(os.path.abspath(root), name)
newfile = os.path.join(newPath, base + extension)
os.rename(oldfile, newfile)
else:
oldfile = os.path.join(os.path.abspath(root), name)
newfile = os.path.join(newPath, base + '_' + str(i) + extension)
i += 1
os.rename(oldfile, newfile)
save_file()
这部分仍然存在一些问题。每次都重命名目录中的所有文件;但我仍然可以生成500个随机文件。我希望根据信息所属的人对文件进行标记,但我无法弄清楚。我来自Incrementing number in file name when file exists。我没有其他解决方案的参考...抱歉。
对于最后一部分,我添加了一个带时间延迟的循环。我不知道为什么,但是增加时间延迟可以使程序更流畅地运行而不会崩溃。可能是因为它处理了如此多的内容,使系统有时间赶上:
if __name__ == '__main__':
for i in range(10):
role_creator()
time.sleep(.5)
rolegenerator()
time.sleep(.5)
save_file()
time.sleep(.5)
同样,它可能不是最好的解决方案,但是它可以工作。