Как сделать слияние почты поверх PDF?
Я часто получаю PDF от нашего дизайнера (встроенного в Adobe InDesign), который должен быть разослан тысячам людей.
У меня есть список со всеми людьми, и это легко сделать слияние почты в OpenOffice.org. Однако OpenOffice.org не поддерживает расширенный PDF. Я просто хочу вывести текст на каждую страницу и распечатать его.
Вот как я это делаю сейчас: распечатайте 6.000 копий PDF, затем снова поместите их в принтер и просто распечатайте имя, адрес и другую информацию поверх него. Но это дорого.
К сожалению, я не могу сделать PDF-файл с изображением и использовать его в OpenOffice.org, потому что он останавливает работу компьютера. Отправка этой работы на принтер также занимает очень много времени.
Итак, есть ли простой способ сделать это слияние (желательно на Python), не платя за закрытые решения третьих сторон?
9 ответов
Теперь я сделал аккаунт. Я исправил это, используя оригинальный pdftk.
В своем квесте я полностью пропускаю функции "фон" и "наложение". Мое решение было таким:
pdftk names.pdf background boat_background.pdf output out.pdf
Создание names.pdf
Вы можете легко сделать это с помощью Python reportlab или аналогичных сценариев создания PDF. Для этого лучше всего использовать код, на создание 6k-страниц в LibreOffice/OpenOffice уходит несколько часов, а на Python - всего несколько секунд.
Есть два гораздо более простых и дешевых решения.
Во-первых, вы можете выполнить слияние писем непосредственно в InDesign, используя DataMerge. Это утилита, добавленная в InDesign еще в CS. Вы экспортируете или сохраняете свои имена в формате CSV. Импортируйте данные в шаблон InDesign, а затем вставьте свое имя, адрес и такие поля в макет. Нажмите Go. Он создаст новый документ со всеми готовыми буквами, или вы можете перейти прямо к принтеру.
ИЛИ, вы можете экспортировать свои данные в файл XML и создать динамический макет, используя заполнители XML в InDesign.
В книге "Руководство дизайнера по Adobe InDesign и XML" вы узнаете, как это сделать, или вы можете посмотреть видеоролики Lynda.com о динамических рабочих процессах с InDesign и XML.
Очень легко сделать.
Если вы хотите создать отдельные файлы PDF для слияния, вы можете запустить один длинный PDF со всеми именами в одном файле, а затем выполнить извлечение для разделения файлов PDF в самой Acrobat Pro.
Возможно, вы могли бы посмотреть на PDF-библиотеку, как iText. Если у вас есть знания в области программирования и немного времени, вы можете написать код, который добавляет контактную информацию в PDF-файлы.
Кто-то спросил конкретику. Я не хотел запачкать свой лучший ответ этим, потому что вы можете делать это как хотите (и просто зная, что pdftk до него, это должно дать людям идею).
Но вот несколько сценариев, которые я использовал давным-давно:
csv_to_pdf.py
#!/usr/bin/python
# This makes one PDF page per name in the CSV file
# csv_to_pdf.py <CSV_FILE>
import csv
import sys
from reportlab.pdfgen.canvas import Canvas
from reportlab.lib.units import cm, mm
in_db = csv.reader(open(sys.argv[1], "rb"));
outname = sys.argv[1].replace("csv", "pdf")
pdf = Canvas(outname)
in_db.next()
i = 0
for rad in in_db:
pdf.setFontSize(11)
adr = rad[1]
tekst = pdf.beginText(2*cm, 26*cm)
for a in adr.split('\n'):
if not a.strip():
continue
if a[-1] == ',':
a = a[:-1]
tekst.textLine(a)
pdf.drawText(tekst)
pdf.showPage()
i += 1
if i % 1000 == 0:
print i
pdf.save()
Когда вы запустите это, у вас есть файл с тысячами страниц, только с именем на нем. Это когда вы можете создать фоновый рисунок PDF под всеми ними:
pdftk <YOUR_NEW_PDF_FILE.pdf> background <DESIGNED_FILE.pdf> <MERGED.pdf>
Как насчет использования программы с переменными данными, такой как - XMPie для Adobe Indesign. Это плагин, который должен ссылаться на ваш список людей (хотя это может быть список в Excel).
Одним простым способом было бы создать заполняемую PDF-форму из исходного документа в Acrobat и выполнить слияние почты с формой и CSV-файлом.
PDF-слияния относительно легко сделать в python и pdftk. Fdfgen (pip install fdfgen
) - это библиотека Python, которая создаст файл PDF из массива Python, поэтому вы можете сохранить сетку Excel в CSV, убедиться, что заголовки CSV соответствуют имени поля формы PDF, которое вы хотите заполнить этим столбцом, и выполнить команду что-то вроде
import csv
import subprocess
from fdfgen import forge_fdf
PDF_FORM = 'path/to/form.pdf'
CSV_DATA = 'path/to/data.csv'
infile = open(CSV_DATA, 'rb')
reader = csv.DictReader(infile)
rows = [row for row in reader]
infile.close()
for row in rows:
# Create fdf
filename = row['filename'] # Construct filename
fdf_data = [(k,v) for k, v in row.items()]
fdf = forge_fdf(fdf_data_strings=fdf_data)
fdf_file = open(filename+'.fdf', 'wb')
fdf_file.write(fdf)
fdf_file.close()
# Use PDFTK to create filled, flattened, pdf file
cmds = ['pdftk', PDF_FORM, 'fill_form', filename+'.fdf',
'output', filename+'.pdf', 'flatten', 'dont_ask']
process = subprocess.Popen(cmds, stdout=subprocess.PIPE)
stdout, stderr = process.communicate()
returncode = process.poll()
os.remove(filename+'.fdf')
Я столкнулся с этой проблемой достаточно, чтобы написать собственное бесплатное решение, PdfZero. PdfZero имеет функцию слияния по почте для объединения электронных таблиц с PDF-формами. Вам все еще нужно будет создать форму PDF, но вы можете загрузить форму и csv в pdfzero, выбрать поля формы, которые вы хотите заполнить какими столбцами, создать соглашение об именах для каждого заполненного pdf, используя данные CSV, если это необходимо, и выполнить пакетную генерацию. заполненные PDF.
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я написал PdfZero
Вероятно, лучшим способом было бы создать другой PDF-файл с отсутствующим текстом и наложить один PDF-файл поверх другого. Быстрый Google нашел эту ссылку, показывающую, как это сделать в Acrobat, и я уверен, что есть и другие методы.
Если вы не можете получить шаблон в другом формате, чем PDF, простое специальное решение будет
- преобразовать PDF в изображение
- поместите изображение в фон вашего документа (OpenOffice.org)
- расположение полей слияния в верхней части изображения
- сделать слияние и печать почты
Для беспрепятственного, беспроблемного решения используйте iText, чтобы просто добавить текст в PDF. Например, вы можете сделать следующее, чтобы добавить текст в документ PDF после загрузки:
PdfContentByte cb= ...;
cb.BeginText();
cb.SetFontAndSize(font, fontSize);
float x = ...;
float y = ...;
cb.SetTextMatrix(x, y);
cb.ShowText(fieldValue);
cb.EndText();
После этого сохраните его как другой файл и распечатайте.
Тем не менее, я обнаружил, что поля формы - это способ создания PDF-документов из шаблонов.
Если у вас есть шаблон с полями формы (добавленный с помощью Adobe Acrobat), у вас есть один из двух вариантов:
- Создайте файл FDF, который по сути представляет собой список значений для полей в форме. FDF - это простой текстовый документ, который ссылается на исходный документ, поэтому при открытии PDF-документа документ загружается со значениями полей, предоставленными FDF.
- Также можно загрузить шаблон с помощью библиотеки, такой как iText / iTextSharp, вручную заполнить поля формы и сохранить ее в виде отдельного файла PDF.
Пример файла FDF выглядит следующим образом (украдено из Planet PDF):
%FDF-1.2
%âãÏÓ
1 0 obj
<<<
/F(Example PDF Form.pdf)
/Fields[
<<
/T(myTextField)
/V(myTextField default value)
>>
]
>>
>> endobj trailer
<>
%%EOF
Из-за простого формата и небольшого размера FDF этот подход является предпочтительным, и этот подход должен хорошо работать на любом языке.
Что касается заполнения полей программным способом, вы можете использовать iText следующим образом:
PdfAcroForm acroForm = writer.AcroForm;
acroForm.Put(new PdfName(fieldInfo.Name), new PdfString(fieldInfo.Value));
Вы можете использовать функцию слияния данных InDesign или сделать то, что вы делали, распечатав часть работы, а затем распечатать слияние почты поверх этого с помощью Word или Open Office. Но также обратите внимание на то, чтобы найти компанию, которая может заниматься офсетной печатью переменных данных или динамической публикацией. Может быть немного дороже, но может сэкономить пакет, когда дело доходит до времени, тестирования, даже упаковки и рассылки.
Отказ от ответственности: я автор этого инструмента.
Я сталкивался с этой проблемой достаточно много раз, чтобы создать для нее бесплатный онлайн-инструмент: https://pdfbatchfill.com/
Он принимает форму PDF в качестве шаблона и использует ее вместе с данными формы CSV для создания одного PDF или отдельных PDF-файлов в ZIP-файле.