Генерация нескольких отчетов PDF в Python - PullRequest
0 голосов
/ 06 декабря 2018

Я не могу найти какие-либо предыдущие вопросы, учебные пособия или видео на 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')

Я очень новичок в программировании, поэтому, пожалуйста, разбейте все ответы по стилю Барни, чтобы я мог понять.Я использую Python 3.6 на ОС Ubuntu.Все кодирование, которое вы видите, это то, что я собрал так далеко от моих исследований.

Спасибо!

ОБНОВЛЕНИЕ:

По просьбе Витора Баптисты этоКак программа сохраняет файл CSV:

screening.pdf
1, last name, Hendrickson
2, first name, Jane
3, id number, 8190287
4, date of birth, 6-Feb-1991

Из того, что я понял, вам нужно иметь файл PDF в первом столбце и первой строке файла CSV.Затем вам нужно пометить, куда каждая запись будет идти в форме PDF.Я сделал это с помощью команды inspect выше, которая создала файл JSON.Затем я просмотрел JSON, чтобы увидеть, какое числовое значение имеет каждое поле, чтобы я мог соответствующим образом пометить их в CSV.

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Это, вероятно, будет иметь некоторые ошибки с учетом путей - но должно работать как-то:

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, а затем перемещается / переименовывается, чтобы быть похожей на вашуимена людей ....

0 голосов
/ 10 декабря 2018

Хорошо, я понял это, а потом немного.Скорее всего, это не самый лучший способ сделать это, но пока он работает:

Я ничего не изменил на генератор случайных персон, поэтому он все еще выглядит так:

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 (убедитесь, что это заполняемая форма) и создаст «тестовую» папку в каталоге вашего проекта.Взгляните на свой «тестовый» PDF, чтобы понять, как помечено каждое поле.Эти числа понадобятся вам при создании файла csv в генераторе случайных персон (посмотрите на строку печати и сравните ее с приведенным выше примером csv).

Следующая команда заполнит вашу PDF-форму:документ CSV у вас есть в командной строке.В моем случае это "role.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 случайных файлов.Я хотел, чтобы файлы были помечены в соответствии с человеком, которому принадлежит информация, но я не мог понять это.Я получил эту часть от Увеличивая номер в имени файла, когда файл существует .У меня нет ссылок на другие решения ... извините.

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

if __name__ == '__main__':
    for i in range(10):
        role_creator()
        time.sleep(.5)
        rolegenerator()
        time.sleep(.5)
        save_file()
        time.sleep(.5)

Опять же, это, вероятно, не лучшее решение, но оно работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...