Использование временного файла для вставки штрих-кодов в файл PDF

Я работаю над проектом, в котором мне нужно использовать один большой PDF-файл с 100 000 изображений, где мне нужно вставить настраиваемый/переменный штрих-код на каждую n-ю страницу (условная зависимость).

Содержимое штрих-кода будет меняться для каждой вставки, для этого примера, скажем, на основе итерации.

В прошлом я использовал PyMuPDF для управления PDF-файлами, включая вставку изображений. Я протестировал вставку штрих-кодов, когда они сохраняются в файл, и у меня не было проблем.

Я использовал Treepoem в прошлом для создания пользовательских штрих-кодов по мере необходимости в гораздо меньшем масштабе.

(Это все еще находится в стадии планирования/доказательства концепции). Поэтому меня беспокоит то, что если я буду делать это в большем масштабе, я буду ограничен скоростью чтения/записи диска.

Я понимаю, что у python есть библиотека временных файлов, которую я никогда не использовал. Я пытаюсь использовать это для создания и сохранения штрих-кодов во временных файлах в памяти, а затем вставлять их в файл PDF из памяти, а не с диска/файла.

Я проверил и подтвердил, что создание штрих-кода и сохранение его в файл позволяет мне вставлять его в файл PDF по мере необходимости. Пример ниже:

import fitz
import treepoem

barcode_file = treepoem.generate_barcode(
    barcode_type='datamatrixrectangular',
    data='10000010'
).convert('1').save('barcode_file.jpg') # Convert('1') forces monochrome, reducing file size.

pdf_file = fitz.open()  # Creating a new file for this example.
pdf_file.new_page()  # Inserting a new blank page.
page = pdf_file[0]

rect = fitz.Rect(70, 155, 200, 230)  # Generic area defined, required to insert barcode into. (x0, y0, x1, y1)

page.insert_image(rect, filename='barcode_file.jpg')
pdf_file.save('example_pdf_with_barcode.pdf')

При попытке реализовать tempfile для удаления сохранения в файл я не знаю, где его использовать.

Я попытался создать новый объект tempfile, вставив в него изображение штрих-кода.

import fitz
import tempfile
import treepoem

barcode_contents = treepoem.generate_barcode(
    barcode_type='datamatrixrectangular',
    data='10000010'
).convert('1')

barcode_tempfile = tempfile.TemporaryFile()
barcode_tempfile.write(b'{barcode_contents}')  # Like f-string, with binary?
barcode_tempfile.seek(0)  # Required, not understood.

pdf_file = fitz.open()  # Creating a new file for this example.
pdf_file.new_page()  # Inserting a new blank page.
page = pdf_file[0]

rect = fitz.Rect(70, 155, 200, 230)  # Generic area defined, required to insert barcode into. (x0, y0, x1, y1)

page.insert_image(rect, filename=barcode_tempfile)
pdf_file.save('example_pdf_with_barcode.pdf')

Что возвращает ошибку на основе разрешения:

  File "<redacted>\example.py", line 20, in <module>
    page.insert_image(rect, filename=barcode_tempfile)
  File "<redacted>\venv\Lib\site-packages\fitz\utils.py", line 352, in insert_image
    xref, digests = page._insert_image(
                    ^^^^^^^^^^^^^^^^^^^
  File "<redacted>\venv\Lib\site-packages\fitz\fitz.py", line 6520, in _insert_image
    return _fitz.Page__insert_image(self, filename, pixmap, stream, imask, clip, overlay, rotate, keep_proportion, oc, width, height, xref, alpha, _imgname, digests)
           
RuntimeError: cannot open <redacted>\AppData\Local\Temp\tmpr_98wni9: Permission denied

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

Генератор штрих-кода Treepoem также имеет метод save(), с помощью которого вы обычно можете сохранить в файл. Вместо этого я попытался сохранить временный файл, как показано ниже:

import fitz
import tempfile
import treepoem

treepoem.generate_barcode(
    barcode_type='datamatrixrectangular',
    data='10000010'
).convert('1').save(tempfile.TemporaryFile('barcode_tempfile'))

pdf_file = fitz.open()  # Creating a new file for this example.
pdf_file.new_page()  # Inserting a new blank page.
page = pdf_file[0]

rect = fitz.Rect(70, 155, 200, 230)  # Generic area defined, required to insert barcode into. (x0, y0, x1, y1)

page.insert_image(rect, filename=barcode_tempfile)
pdf_file.save('example_pdf_with_barcode.pdf')

Что приводит к следующей ошибке:

File "<redacted>\example.py", line 8, in <module>
    ).convert('1').save(tempfile.TemporaryFile('barcode_tempfile'))
                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "<redacted>\AppData\Local\Programs\Python\Python311\Lib\tempfile.py", line 563, in NamedTemporaryFile
    file = _io.open(dir, mode, buffering=buffering,
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ValueError: invalid mode: 'barcode_tempfile'

Поэтому я не уверен, смогу ли я сохранить во временный файл с помощью этого метода.

Кто-нибудь может объяснить, если это возможно, как лучше всего решить эту проблему?

(В настоящее время используется Python 3.11)

Спасибо,

Мутабельность и переработка объектов в Python
Мутабельность и переработка объектов в Python
Объекты являются основной конструкцией любого языка ООП, и каждый язык определяет свой собственный синтаксис для их создания, обновления и...
Другой маршрут в Flask Python
Другой маршрут в Flask Python
Flask - это фреймворк, который поддерживает веб-приложения. В этой статье я покажу, как мы можем использовать @app .route в flask, чтобы иметь другую...
14 Задание: Типы данных и структуры данных Python для DevOps
14 Задание: Типы данных и структуры данных Python для DevOps
Проверить тип данных используемой переменной, мы можем просто написать: your_variable=100
Python PyPDF2 - запись метаданных PDF
Python PyPDF2 - запись метаданных PDF
Python скрипт, который будет записывать метаданные в PDF файл, для этого мы будем использовать PDF ридер из библиотеки PyPDF2 . PyPDF2 - это...
Переменные, типы данных и операторы в Python
Переменные, типы данных и операторы в Python
В Python переменные используются как место для хранения значений. Пример переменной формы:
Почему Python - идеальный выбор для проекта AI и ML
Почему Python - идеальный выбор для проекта AI и ML
Блог, которым поделился Harikrishna Kundariya в нашем сообществе Developer Nation Community.
0
0
85
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваши проблемы в области обработки временных файлов. Вместо того, чтобы вдаваться в подробности, я предлагаю придерживаться Pillow и использовать исключительно его возможности:

  • преобразовать изображение PIL в JPEG / PNG, как вы это сделали, но позволить PIL сохранить в файл памяти
  • вставьте этот образ памяти, используя PyMuPDF
import io  # need this for memory output
fp = io.BytesIO()  # memory binary file
treepoem.generate_barcode(
    barcode_type='datamatrixrectangular',
    data='10000010'
).convert('1').save(fp, "JPEG"))  # write image to memory

# now insert image into page using PyMuPDF
# fp.getvalue() delivers the image content in memory
page.insert_image(rect, stream=fp.getvalue())

@KJ спасибо за комплименты. Я не думал о подходящем формате для штрих-кодов - ничего не знаю в этой области. Поэтому, пожалуйста, игнорируйте мой литерал "JPEG" / замените его на что-нибудь получше.

Jorj McKie 26.11.2022 18:35

Я думаю, что Pillow также поддерживает чисто черно-белый формат — еще не искал. Правильный выбор в любом случае заставит базовую библиотеку MuPDF выбрать оптимальный формат изображения для PDF.

Jorj McKie 26.11.2022 18:42

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

Jamjar91 29.11.2022 11:07

Другие вопросы по теме