Вопрос или проблема
Я написал книгу, которую хочу сделать доступной бесплатно с вебсайта, но хочу, чтобы на второй странице было указано имя и адрес электронной почты человека, который её скачал, чтобы можно было отследить, если она появится в сети.
Пользователи будут авторизованы на сайте, поэтому их имя и адрес электронной почты известны. Затем мне нужно автоматическое кодовое решение, чтобы добавить их имя и адрес электронной почты в PDF. Я подумал о двух вариантах:
-
ВАРИАНТ 1: Самый чистый способ сделать это – сначала создать PDF книги с второй страницей с текстом-заполнителем, например, “принадлежит Джону Смиту [email protected]“, а затем программно отредактировать этот файл, чтобы заменить текст-заполнитель на имя и адрес электронной почты данного пользователя. Однако, как я выяснил, сначала открыв PDF в Notepad++ и затем исследовав это, способ хранения текста в PDF не простой и недетерминированный. Поэтому этот вариант, похоже, неосуществим, если кто-то не имеет трюка.
-
ВАРИАНТ 2: Другой подход может заключаться в том, чтобы сохранить титульную страницу документа как одноместный PDF, а затем страницы с 3-й до конца как другой PDF, а затем программно создать пользовательский PDF второй страницы с именем и адресом электронной почты пользователя, а затем программно объединить три PDF в один документ.
Ключевым моментом является то, что все это должно быть осуществимо в коде автоматически с вебсайта.
Любые предложения по варианту 1 будут замечательными. В качестве альтернативы, для варианта 2 любые предложения относительно программного обеспечения, которое могло бы помочь (1) создать пользовательскую вторую страницу с именем и адресом электронной почты пользователя, как описано, и (2) объединить титульную страницу, вторую страницу и основную часть документа в один PDF?
Большое спасибо.
Ответ или решение
Разработка системы для автоматического создания пользовательских PDF-документов может быть сложной задачей, но существует несколько эффективных подходов для достижения этой цели. Рассмотрим два предложенных вами варианта более подробно.
Вариант 1: Редактирование существующего PDF-документа
Этот вариант включает в себя создание PDF-документа с заполнителем текста, который затем будет заменён на имя и электронную почту пользователя. Хотя вы правильно отметили, что текст в PDF-документах кодируется не совсем однозначно, существуют библиотеки, которые могут помочь в этом процессе.
Использование библиотеки Python pdfrw
- Создание PDF с заполнителем: Создайте PDF-документ с текстом-заполнителем, например, "принадлежит <Имя>
". - Редактирование PDF: Используйте библиотеку
pdfrw
для редактирования текста в PDF. Вот пример кода, который заменяет заполнители:
import pdfrw
def replace_placeholder(input_pdf, output_pdf, name, email):
# Чтение исходного PDF
template_pdf = pdfrw.PdfReader(input_pdf)
# Обход страниц
for page in template_pdf.pages:
# Замена заполнителей текста
if '/Contents' in page:
content = page.Contents.stream
content = content.replace(b'placeholder_name', name.encode('utf-8'))
content = content.replace(b'placeholder_email', email.encode('utf-8'))
page.Contents.stream = content
# Сохранение результата
pdfrw.PdfWriter(output_pdf, trailer=template_pdf).write()
# Пример вызова функции
replace_placeholder('source.pdf', 'output.pdf', 'Иван Иванов', '[email protected]')
Этот код загрузит исходный PDF-документ, заменит заполнители на реальные данные и сохранит новый файл.
Вариант 2: Создание нового PDF-документа
Этот подход более прост, так как вы будете создавать новые PDF-документы для каждой страницы и затем объединять их.
Использование библиотеки reportlab
и PyPDF2
-
Создание второго PDF с использованием
reportlab
:from reportlab.lib.pagesizes import letter from reportlab.pdfgen import canvas def create_custom_page(name, email, output_pdf): c = canvas.Canvas(output_pdf, pagesize=letter) c.drawString(100, 750, f'Принадлежит: {name}') c.drawString(100, 735, f'Email: {email}') c.save() # Создаем новый PDF со страницы create_custom_page('Иван Иванов', '[email protected]', 'custom_page.pdf')
-
Объединение PDF-документов с использованием
PyPDF2
:import PyPDF2 def merge_pdfs(pdf_list, output_pdf): pdf_writer = PyPDF2.PdfWriter() for pdf in pdf_list: pdf_reader = PyPDF2.PdfReader(pdf) for page in pdf_reader.pages: pdf_writer.add_page(page) with open(output_pdf, 'wb') as out: pdf_writer.write(out) # Объединяем три PDF в один merge_pdfs(['title_page.pdf', 'custom_page.pdf', 'body.pdf'], 'final_book.pdf')
Заключение
Оба описанных подхода могут быть реализованы на серверной стороне вашего веб-приложения. Вариант 1 обеспечивает более чистое решение, однако он сталкивается с определёнными трудностями при редактировании существующих PDF-файлов. Вариант 2, хотя и требует генерации нескольких PDF-документов, является более практичным и простым для реализации.
Выбор подхода зависит от ваших предпочтений и специфики проекта. Рекомендуем протестировать оба варианта, чтобы определить, какой из них лучше соответствует вашим требованиям.