Как создать pdf файл из нескольких jpg python
Я работаю над проектом, который принимает некоторые изображения от пользователя, а затем создает PDF-файл, содержащий все эти изображения.
есть ли способ или какой-либо инструмент для этого в Python? Например. чтобы создать PDF-файл (или eps, ps) из image1 + image 2 + image 3 -> PDF-файл?
предлагаю pyPdf. Это работает очень хорошо. Я также писал в блоге некоторое время назад, вы можете найти его здесь.
вот мой опыт после следования подсказкам на этой странице.
pyPDF не может вставлять изображения в файлы. Он может только разделяться и сливаться. (Источник: Ctrl+F через его страница документация) Это здорово, но если у вас есть изображения, которые не встроены в PDF.
pyPDF2 похоже, нет никакой дополнительной документации поверх pyPDF.
ReportLab очень обширен. (Userguide) однако, с немного Ctrl+F и grepping через его источник, я получил это:
затем попробуйте это в командной строке Python:
все, что мне нужно, это получить кучу изображений в PDF, чтобы я мог проверить, как они выглядят и распечатать их. Вышеизложенного достаточно для достижения этого цель.
ReportLab велик,но выиграет от включения helloworlds, как указано выше, в его документации.
Он создает pdf из html-файлов. Я выбрал его для создания pdf в 2 шага из моего стека пирамиды Python:
- рендеринг на стороне сервера с шаблонами mako со стилем и разметкой, которые вы хотите для вас pdf-документ
- выполнения pdfkit.from_string(. ) метод, передавая отображаемый html в качестве параметра
таким образом вы получаете pdf-документ со стилем и изображениями поддерживаемый.
Вы можете установить его следующим образом :
pip install pdfkit
вы можете попробовать этой(Python-for-PDF-Generation) или вы можете попробовать PyQt, который имеет поддержку для печати в PDF.
Python для генерации PDF
Формат переносимых документов (PDF) позволяет создавать документы, которые выглядят одинаково на каждой платформе. Иногда PDF-документ должен быть создан динамически, однако, и это может быть довольно сложной задачей. К счастью, есть библиотеки, которые могут помочь. Эта статья изучает один из них для Python.
Я сделал это совсем немного в PyQt, и он работает очень хорошо. Qt имеет обширную поддержку изображений, шрифтов, стилей и т. д. И все они могут быть записаны в pdf-документы.
Я считаю, что matplotlib имеет возможность сериализовать графику, текст и другие объекты в pdf-документ.
Я использую rst2pdf для создания pdf-файла, так как я больше знаком с RST, чем с HTML. Он поддерживает встраивание практически любых растровых или векторных изображений.
требует reportlab, но я обнаружил, что reportlab не так прямолинейно использовать (по крайней мере для меня).
fpdf-это python (тоже). И часто используется. Ознакомиться с PyPI / поиск типун. Но, возможно, он был переименован из pyfpdf в fpdf. Из особенностей: Поддержка PNG, GIF и JPG (включая прозрачность и альфа-канал)
вот решение, которое работает только со стандартными пакетами. matplotlib имеет бэкэнд PDF для сохранения фигур в PDF. Вы можете создать фигуры с подзаголовками, где каждый подзаголовок является одним из ваших изображений. У вас есть полная свобода возиться с фигурой: добавлять заголовки, играть с позицией и т. д. Как только ваша фигура будет сделана, сохраните в PDF. Каждый вызов savefig создаст еще одну страницу PDF.
Есть ли практический способ создать PDF из списка файлов изображений, используя Python?
В Perl я знаю этот модуль. С его помощью я могу создать PDF всего за 3 строки:
Мне нужно сделать что-то очень похожее на это, но в Python. Я знаю pyPdf модуль, но мне хотелось бы кое-что простое.
Если вы пришли через Google, вот код:
Теперь вы можете использовать ту же логику:
Вы можете найти дополнительную информацию на странице учебного руководства или на странице официальная документация.
Если вы используете Python 3, вы можете использовать модуль Python img2pdf
Установите его, используя pip3 install img2pdf , а затем вы можете использовать его в скрипте используя import img2pdf
Как насчет этого??
Это не совсем новый ответ, но - при использовании img2pdf размер страницы получился неправильным. Итак, вот что я сделал, чтобы использовать размер изображения, надеюсь, он найдет кого-то удачного:
При условии 1) все изображения имеют одинаковый размер, 2) размещение одного изображения на странице, 3) изображение заполняет всю страницу
Лучший способ конвертировать несколько изображений в PDF, который я пробовал до сих пор, это использовать PIL чисто. Это довольно просто, но мощно:
Просто установите save_all на True и append_images на список изображений, которые вы хотите добавить.
Вы можете столкнуться с AttributeError: 'JpegImageFile' object has no attribute 'encoderinfo' . Решение здесь Ошибка при сохранении нескольких JPEG-файлов в виде многостраничного PDF-файла
Примечание. Установите новейший PIL , чтобы убедиться, что аргумент save_all доступен для PDF.
У меня была та же проблема, поэтому я создал функцию Python, чтобы объединить несколько изображений в один PDF-файл. Этот код (доступен на моей странице github, использует >, и основан на ответах по следующим ссылкам:
Вот пример того, как объединить изображения в PDF:
У нас есть папка «D: \ pictures» с изображениями типов png и jpg, и мы хотим создать из них файл pdf_with_pictures.pdf и сохранить его в той же папке.
Я знаю, что на вопрос дан ответ, но еще один способ решить эту проблему - использовать библиотеку подушек. Чтобы преобразовать весь каталог изображений:
Для использования его на одном изображении:
pgmagick - это GraphicsMagick(Magick++) привязка для Python.
Инструкция по установке pgmagick для windows:
Примечание. Попробуйте загрузить правильную версию, соответствующую вашей версии Python, установленной на вашем компьютере, и 32-битной или 64-битной.
Вы можете проверить, есть ли у вас 32-битный или 64-битный питон, просто набрав python на своем терминале и нажав Enter.
Так что у него есть python version 2.7 и он выключен 32 bit (Intel)] on win32 , поэтому вам нужно скачать и установить pgmagick‑0.5.8.win32‑py2.7.exe .
Это следующие доступные пакеты расширений Python для pgmagick:
- pgmagick - 0.5.8.win - amd64 - py2.6.exe
- pgmagick - 0.5.8.win - amd64 - py2.7.exe
- pgmagick - 0.5.8.win - amd64 - py3.2.exe
- pgmagick - 0.5.8.win32 - py2.6.exe
- pgmagick - 0.5.8.win32 - py2.7.exe
- pgmagick - 0.5.8.win32 - py3.2.exe
2) Затем вы можете следовать инструкциям по установке из здесь .
А затем попробуйте импортировать его.
Я взял код и внес небольшое изменение, чтобы сделать его пригодным для использования.
Есть вопросы по Python?
На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!
Telegram Чат & Канал
Вступите в наш дружный чат по Python и начните общение с единомышленниками! Станьте частью большого сообщества!
Паблик VK
Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!
В данной статье не будет утомительных разборов пакета PyFPDF. Однако, мы раскроем более чем исчерпывающую информацию для эффективного использования. Обратите внимание на то, что существует небольшая книжечка «Python и PDF: pyFPDF» от Эдвуда Оказио на Leanpub, если вы захотите узнать больше о библиотеке, сверх той информации, которая указана в данной статье или документации пакета.
Установка
Установка PyFPDF – это просто, так как он подразумевает работу с pip. Установка проходит следующим образом:
На момент написания, эта команда устанавливала версию 1.7.2 на Python 3.6 без каких-либо проблем. Во время установки вы увидите, что этот пакет не имеет зависимостей, что приятно.
Базовое использование
Теперь, когда у вас есть установленный PyFPDF, попробуем использовать его для создания простого файла PDF. Откройте ваш редактор Python и создайте новый файл под названием **simple_demo.py**. После этого, введите следующий код:
pdf . cell ( 200 , 10 , txt = "Welcome to Python!" , ln = 1 , align = "C" )Первый элемент, который нам нужно обсудить, это импорт. Здесь мы импортируем класс FPDF из пакета fpdf. Настройки по умолчанию этого класса создают PDF в режиме Portrait, используя миллиметры в качестве единицы измерения и размер страницы А4. Если вы хотите быть четче, вы можете вписать следующую строку установки:
Я не фанат использования буквы «P», чтобы указать классу, какая это ориентация. Вы можете использовать «L», если предпочитаете пейзаж вместо портрета.
Пакет PyFPDF поддерживает supports ‘pt’, ‘cm’ и ‘in’ в качестве альтернативных единиц измерения. Если обратиться к источнику, вы увидите, что пакет PyFPDF поддерживает только следующие размеры страниц:
Это выглядит немного ограниченно, в сравнении с ReportLab, где у вас в распоряжении несколько дополнительных размеров поддерживаемых изначально, кроме этого, вы можете указать собственный размер страницы, если вам это нужно.
В любом случае, следующий шаг – это создание страницы при помощи метода add_page. Далее, мы указываем шрифт при помощи метода set_font. Вы увидите, что мы передаем родительское наименование шрифта и размер, которые нам нужны. Вы также можете настроить стиль шрифта при помощи аргумента style. Если вы хотите сделать это, помните, что для этого нужна строка, такая как «В» для жирного шрифта, или «Bl» для полужирного.
Далее, мы создаем клетку, шириной 200 миллиметров и 10 миллиметров в высоту. Клетка, по большому счету, плавающая, и содержит текст, к ней можно подключить границы. Она разделяется автоматически, если включен автоматический разрыв страницы, так что клетка перейдет за границу страницы. Параметр txt – это текст, который вам нужно ввести в PDF. Параметр In указывает PyFPDF, что нужно добавить разрыв строки, если он указан как 1, что мы и делаем в нашей статье. Наконец, мы можем установить выравнивание текста по ширине (по умолчания), или по центру («С»). Здесь мы выбираем второй вариант.
Наконец, мы сохраняем документ на диск, вызывая метод output с путем к файлу, который мы хотим сохранить.
После запуска кода, мой PDF выглядит следующим образом:
Давайте попробуем узнать побольше о работе PyFPDF со шрифтами.
Работа со шрифтами
PyFPDF содержит набор базовых шрифтов, старательно прописанных в класс FPDF:
Один из самых гибких и привычных способов сгенерировать pdf — написать код на LaTeX и воспользоваться соответствующей программой. Но есть и другие способы, которые могут оказаться проще и понятнее, чем LaTeX. Специально к старту курса Fullstack-разработчик на Python представляем перевод статьи о том, как для генерации PDF можно воспользоваться библиотекой pText; эта статья написана Йорисом Схеллекенсом — разработчиком pText.
В этом руководстве мы будем использовать pText — библиотеку Python, предназначенную для чтения, обработки и создания PDF-документов. Он предлагает как низкоуровневую (позволяющую получить доступ к точным координатам и макету, если вы решите их использовать), так и высокоуровневую модель (где вы можете делегировать точные расчёты полей, позиций и т. д.). Мы рассмотрим, как создавать и проверять PDF-документ в Python, используя pText, а также как использовать некоторые LayoutElement [элементы макета] для добавления штрих-кодов и таблиц.
Portable Document Format (PDF) не является форматом WYSIWYG («что видишь, то и получаешь»). Он был разработан как платформенно-независимый, не зависящий от базовой операционной системы и механизмов рендеринга.
Чтобы добиться этого, PDF был создан взаимодействовать с помощью чего-то, больше похожего на язык программирования, и полагается на серию инструкций и операций для достижения результата. Фактически PDF основан на языке сценариев — PostScript, который был первым независимым от устройства языком описания страниц. В нём есть операторы, которые изменяют графические состояния, на высоком уровне они выглядят примерно так:
Установить шрифт Helvetica.
Установить чёрный цвет обводки.
Перейти к (60,700).
Нарисовать глиф "H".
Это объясняет несколько вещей:
Почему так сложно точно извлечь текст из PDF.
Почему сложно редактировать PDF-документ.
Почему большинство библиотек PDF применяют очень низкоуровневый подход к созданию контента (вы должны указать координаты, в которых следует отображать текст, поля и т. д.).
Установка pText
pText можно загрузить c GitHub или установить через pip:
Создание PDF-документа на Python с помощью pText
pText имеет два интуитивно понятных ключевых класса — Document и Page, которые представляют документ и страницы в нём. Это основная структура для создания PDF-документов. Кроме того, класс PDF представляет собой API для загрузки и сохранения создаваемых нами документов. Имея это в виду, давайте создадим пустой файл PDF:
Большая часть кода здесь говорит сама за себя. Мы начинаем с создания пустого документа, затем добавляем пустую страницу в документ с помощью функции append() и, наконец, сохраняем файл с помощью PDF.dumps().
Стоит отметить, что мы использовали флаг "wb" для записи в двоичном режиме, поскольку мы не хотим, чтобы Python кодировал этот текст. Это даёт нам пустой PDF-файл с названием output.pdf в вашей файловой системе:
Создание документа «Hello World» с помощью pText
Конечно, пустые PDF-документы не содержат много информации. Давайте добавим контент на страницу, прежде чем добавлять его в экземпляр документа.
Подобно двум классам, описанным ранее, чтобы добавить контент на страницу, мы добавим PageLayout, указывающий на тип макета, который мы хотели бы видеть, и добавим один или несколько абзацев в этот макет.
С этой целью Document является экземпляром самого низкого уровня в иерархии объектов, а Paragraph — экземпляром самого высокого уровня, размещённым поверх PageLayout и, следовательно, страницы. Давайте добавим абзац на нашу страницу:
Вы заметите, что мы добавили 2 дополнительных объекта:
Экземпляр PageLayout, более конкретный через его подкласс SingleColumnLayout: этот класс отслеживает, где контент добавляется на страницу, какие области доступны для будущего контента, каковы поля страницы и какие ведущие (пространство между объектами Paragraph) должно быть.
Поскольку здесь мы работаем только с одним столбцом, мы используем SingleColumnLayout. В качестве альтернативы мы можем использовать MultiColumnLayout.
Экземпляр Paragraph: этот класс представляет блок текста. Вы можете установить такие свойства, как шрифт, font_size, font_color, и многие другие. Дополнительные примеры вы можете найти в документации.
Код генерирует файл output.pdf, содержащий наш абзац:
Проверка созданного PDF с помощью pText.
Примечание: этот раздел является необязательным, если вас не интересует внутренняя работа PDF-документа.
Но может быть очень полезно немного узнать о формате (например, при отладке классической проблемы «почему мой контент теперь отображается на этой странице»). Обычно программа для чтения PDF читает документ, начиная с последних байтов:
Здесь мы видим маркер конца файла (%% EOF) и таблицу перекрестных ссылок (обычно сокращённо xref).
Внешняя ссылка ограничена токенами «startxref» и «xref».
Внешняя ссылка (в документе может быть несколько) действует как справочная таблица для программы чтения PDF-файлов.
Он содержит байтовое смещение (начиная с верхней части файла) каждого объекта в PDF. Первая строка внешней ссылки (0 11) говорит, что в этой внешней ссылке 11 объектов и что первый объект начинается с номера 0.
Каждая последующая строка состоит из байтового смещения, за которым следует так называемый номер поколения и буква f или n:
Объекты, отмеченные буквой f, являются свободными, их рендеринг не ожидается.
Объекты, отмеченные буквой n, «используются».
Внизу xref мы находим словарь трейлеров. Словари в синтаксисе PDF разделяются символами << и >>. В этом словаре есть следующие пары:
/ID [<61e6d144af4b84e0e0aa52deab87cfe9> <61e6d144af4b84e0e0aa52deab87cfe9>]
Словарь трейлеров является отправной точкой для программы чтения PDF-файлов и содержит ссылки на все другие данные. В этом случае:
/Root: это ещё один словарь, который ссылается на фактическое содержание документа.
/Info: это словарь, содержащий метаинформацию документа (автор, название и так далее).
Строки типа 1 0 R в синтаксисе PDF называются «ссылками». И здесь нам пригодится таблица xref. Чтобы найти объект, связанный с 1 0 R, мы смотрим на объект 1 (номер поколения 0). Таблица поиска xref сообщает нам, что мы можем ожидать найти этот объект в 15-м байте документа. Если проверить это, то обнаружим:
Обратите внимание, что тот объект начинается с 1 0 obj и заканчивается endobj. Это ещё одно подтверждение того, что мы на самом деле имеем дело с объектом 1. Этот словарь говорит нам, что мы можем найти страницы документа в объекте 3:
Это словарь /Pages, и он сообщает нам, что в этом документе одна страница (запись /Count). Запись для /Kids обычно представляет собой массив с одной ссылкой-объектом на страницу. Мы можем ожидать найти первую страницу в объекте 4:
Этот словарь содержит несколько интересных записей:
/MediaBox: физические размеры страницы (в данном случае страница формата A4).
/Contents: ссылка на (обычно сжатый) поток операторов содержимого PDF.
/Resources: ссылка на словарь, содержащий все ресурсы (шрифты, изображения и так далее), используемые для рендеринга этой страницы.
Давайте проверим объект 5, чтобы узнать, что на самом деле отображается на этой странице:
Как упоминалось ранее, этот поток содержимого сжимается. Вы можете определить, какой метод сжатия использовался, с помощью записи /Filter. Если мы применим распаковку (unzip) к объекту 5, то мы должны получить фактические операторы содержимого:
Наконец, мы находимся на уровне, где можем декодировать контент. Каждая строка состоит из аргументов, за которыми следует их оператор. Быстро пройдёмся по операторам:
q: сохранить текущее графическое состояние (помещая его в стек);
BT: начать текст;
0 0 0 rg: установить текущий цвет обводки на (0,0,0) rgb. Это чёрный;
/F1 1 Tf: установить текущий шрифт на /F1 (это запись в словаре ресурсов, упомянутом ранее) и размер шрифта на 1.
20.000000 0 0 20.000000 60.000000 738.000000 Tm: установить текстовую матрицу, что требует отдельного руководства. Достаточно сказать, что эта матрица регулирует размер шрифта и положение текста. Здесь мы масштабируем шрифт до размера 20 и устанавливаем курсор для рисования текста на 60 738. Система координат PDF начинается в нижнем левом углу страницы. Итак, 60 738 находится где-то рядом с левым верхом страницы (с учётом того, что высота страницы составляет 842 единицы).
(Hello world) Tj: строки в синтаксисе PDF разделяются ( и ). Эта команда указывает программе чтения PDF-файлов отобразить строку «Hello world» в позиции, которую мы указали ранее с помощью текстовой матрицы, в шрифте, размере и цвете, которые мы указали в командах перед этим.
ET: конец текста.
Q: извлечь состояние графики из стека (таким образом восстанавливая состояние графики).
Добавление других элементов макета pText на страницы
pText поставляется с широким спектром объектов LayoutElement. В предыдущем примере мы кратко исследовали Paragraph. Но есть и другие элементы, такие как UnorderedList, OrderedList, Image, Shape, Barcode и Table. Давайте создадим чуть более сложный пример с таблицей и штрих-кодом. Таблицы состоят из TableCells, которые мы добавляем в экземпляр Table. Штрих-код может быть одним из многих типов штрих-кода — мы будем использовать QR-код:
Некоторые детали реализации:
pText поддерживает различные цветовые модели, в том числе RGBColor, HexColor, X11Color и HSVColor.
Вы можете добавлять объекты LayoutElement непосредственно в объект Table, но вы также можете обернуть их объектом TableCell, это даёт вам некоторые дополнительные параметры, такие как col_span и row_span или, в данном случае, background_color.
Если font, font_size или font_color не указаны, Paragraph примет значение по умолчанию Helvetica, размер 12, чёрный.
Код сгенерирует такой документ:
Заключение
В этом руководстве мы рассмотрели pText — библиотеку для чтения, записи и управления файлами PDF. Мы рассмотрели ключевые классы, такие как Document и Page, а также некоторые элементы, такие как Paragraph, Barcode и PageLayout. Наконец, мы создали несколько PDF-файлов с различным содержимым, а также проверили, как PDF-файлы хранят данные под капотом.
Документ PDF приятен глазу и достаточно удобен для того, чтобы использовать его в электронном документообороте, для генерации разнообразных счетов и отчётов, особенно актуальных в крупных организациях и в их внутренней сети, поэтому разработка крупных и сложных веб-проектов часто сопряжена с генерацией PDF. Если вам интересна работа со сложными веб-проектами и не хочется выбирать между бэком или фронтом, то вы можете присмотреться к курсу Fullstack-разработчик на Python.
Узнайте, как прокачаться и в других специальностях или освоить их с нуля:
Читайте также: