Необходимо либо отредактировать PDF, чтобы заменить некоторый текст, либо создать новую страницу PDF и вставить ее между двумя другими PDF в коде.

Вопрос или проблема

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

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

  1. Создание PDF с заполнителем: Создайте PDF-документ с текстом-заполнителем, например, "принадлежит <Имя> ".
  2. Редактирование 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

  1. Создание второго 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')
  2. Объединение 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-документов, является более практичным и простым для реализации.

Выбор подхода зависит от ваших предпочтений и специфики проекта. Рекомендуем протестировать оба варианта, чтобы определить, какой из них лучше соответствует вашим требованиям.

Оцените материал
Добавить комментарий

Капча загружается...