Как создать PDF файлы в Python [закрыто]

156

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

Есть ли способ или инструмент для этого в Python? Например, чтобы создать файл PDF (или eps, ps) из image1 + image 2 + image 3 -> PDF file?

Стивен Т.
источник
47
Если есть сомнения, py
добавьте к
8
Еще один SO трюк поиска: [language or tag] some_keyword как в [python] PDFили[python] PDF image
MJV
Для тех, кто приезжает сюда, используя matplolib: stackoverflow.com/questions/17788685/…
Дэвид Паркс
Я отклонил этот вопрос, потому что принятый ответ - неправильный ответ ...
Боудкодер

Ответы:

39

Я предлагаю pyPdf . Это работает действительно хорошо. Я также написал пост в блоге некоторое время назад, вы можете найти его здесь .

Geo
источник
7
Текущий форк PyPDF2 находится здесь .
Эдмонд Бернетт
99
Обратите внимание, что pypdf только вырезает / вставляет / и т. Д. Существующее содержимое PDF - вы не можете добавлять текст или изображения в PDF.
drevicko
3
pyPDF2 не для создания новых документов PDF, 4cs
michelek
160

Вот мой опыт после следования подсказкам на этой странице.

  1. pyPDF не может вставлять изображения в файлы. Это может только разделить и объединить. (Источник: Ctrl + F на странице документации ). Это здорово, но нет, если у вас есть изображения, которые еще не встроены в PDF.

  2. У pyPDF2 , похоже, нет никакой дополнительной документации поверх pyPDF.

  3. ReportLab очень обширный. ( Руководство пользователя ) Однако, с небольшим количеством Ctrl + F и просмотром его источника, я получил это:

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

ReportLab - это здорово, но было бы полезно включить helloworlds, подобные приведенным выше, в свою документацию.

Евгений Сергеев
источник
13
Я должен сказать, что reportlab - лучшее из созданных мной PDF-файлов, безусловно, самое полное. Тем не менее, это также немного сложнее. blog.pythonlibrary.org/2010/03/08/… blog.pythonlibrary.org/2010/09/21/…
Хосе Сальватьерра
1
Это было именно то, что я искал
Мартен
@JoseSalvatierra Спасибо Хосе ... это действительно легко. Спасибо за ссылку в блоге.
Ариндам Ройховдхури
33

Я предлагаю Pdfkit . ( руководство по установке )

Он создает PDF из HTML-файлов. Я выбрал его для создания PDF за 2 шага из моего стека Python Pyramid:

  1. Рендеринг на стороне сервера с мако шаблонами со стилем и разметкой, которые вы хотите для вас pdf документ
  2. Выполнение pdfkit.from_string(...)метода путем передачи рендеринга HTML в качестве параметра

Таким образом, вы получите PDF документ с поддержкой стилей и изображений.

Вы можете установить его следующим образом:

  • используя пункт

    pip install pdfkit

  • Вам также нужно будет установить wkhtmltopdf ( в Ubuntu ).
eton_ceb
источник
14

Вы можете попробовать это (Python-for-PDF-Generation) или попробуйте PyQt , который поддерживает печать в PDF.

Python для генерации PDF

Переносимый формат документов (PDF) позволяет создавать документы, которые выглядят одинаково на любой платформе. Однако иногда документ PDF необходимо генерировать динамически, и это может быть довольно сложной задачей. К счастью, есть библиотеки, которые могут помочь. В этой статье рассматривается один из них для Python.

Узнайте больше на http://www.devshed.com/c/a/Python/Python-for-PDF-Generation/#whoCFCPh3TAks368.99

gruszczy
источник
Ссылка больше не работает.
Роберт Кох
9

Вот решение, которое работает только со стандартными пакетами. matplotlibимеет PDF-файл для сохранения рисунков в PDF. Вы можете создать фигуры с сюжетами, где каждый субплот является одним из ваших изображений. У вас есть полная свобода связываться с фигурой: добавление заголовков, игра с позицией и т. Д. Как только ваша фигура будет готова, сохраните ее в PDF. Каждый вызов savefigсоздаст еще одну страницу PDF.

Пример ниже показывает 2 изображения рядом, на странице 1 и странице 2.

from matplotlib.backends.backend_pdf import PdfPages
import matplotlib.pyplot as plt
from scipy.misc import imread
import os
import numpy as np

files = [ "Column0_Line16.jpg", "Column0_Line47.jpg" ]
def plotImage(f):
    folder = "C:/temp/"
    im = imread(os.path.join(folder, f)).astype(np.float32) / 255
    plt.imshow(im)
    a = plt.gca()
    a.get_xaxis().set_visible(False) # We don't need axis ticks
    a.get_yaxis().set_visible(False)

pp = PdfPages("c:/temp/page1.pdf")
plt.subplot(121)
plotImage(files[0])
plt.subplot(122)
plotImage(files[1])
pp.savefig(plt.gcf()) # This generates page 1
pp.savefig(plt.gcf()) # This generates page 2
pp.close()
Антон Швайгофер
источник
в моем тесте код генерирует одну страницу с 2 изображениями
конструктор
Обновленную версию кода можно найти по
конструктор
7

Я сделал это совсем немного в PyQt, и он работает очень хорошо. Qt имеет обширную поддержку изображений, шрифтов, стилей и т. Д., И все они могут быть записаны в документы PDF.

Аллен
источник
1
Вау, Qt выглядит потрясающе. Они говорят, что поддерживают 15 платформ, вкл. Windows, Mac OS X, Linux, Android, iOS, Windows RT, а также эти операционные системы реального времени - INTEGRITY QNX VxWorks qt.io/qt-framework . И так как я фанат Python, мне нравится «PyQt сочетает в себе все преимущества Qt и Python. Программист обладает всей мощью Qt, но может использовать его с простотой Python». Riverbankcomputing.co.uk / программное обеспечение / pyqt / вступление
AnneTheAgile
7

Я считаю, что matplotlib имеет возможность сериализации графики, текста и других объектов в PDF-документ.

Andrea
источник
Да, ты можешь. Этот SO ответ содержит несколько хороших ссылок о том, как это сделать.
drevicko
7

fpdf это тоже питон (тоже). И часто используется. Смотрите PyPI / pip search. Но, возможно, он был переименован из pyfpdf в fpdf. Из функций: поддержка PNG, GIF и JPG (включая прозрачность и альфа-канал)

Мирек
источник
1
Ваш ответ неясен, но вы, безусловно, PyFPDF pfoject pyfpdf.readthedocs.io/en/latest
Войцех Качмарек
Вся путаница с именами действительно жаль. Этот ответ и комментарий @WojciechKaczmarek действительно заслуживают большего количества голосов и внимания. PyFPDF - это порт Python часто используемой библиотеки PDF, изначально написанный на PHP.
Идеограмма
6

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

Это требует reportlab , но я обнаружил, что reportlab не так прост в использовании (по крайней мере, для меня).

ismailsunni
источник
3

Это зависит от того, в каком формате находятся ваши файлы изображений, но для работающего здесь проекта я использовал инструмент tiff2pdf в LibTIFF с RemoteSensing.org . По сути, просто использовал подпроцесс для вызова tiff2pdf.exe с соответствующим аргументом, чтобы прочитать тот тип tiff, который у меня был, и вывести нужный мне pdf. Если они не TIFF, вы, вероятно, можете преобразовать их в TIFF, используя PIL, или, возможно, найти инструмент, более специфичный для вашего типа изображения (или более общий, если изображения будут разнообразными), как ReportLab, упомянутый выше.

Tofystedeth
источник
3

у меня хорошо работает fpdf. Гораздо проще, чем ReportLab и действительно бесплатно. Работает с UTF-8.

МФС
источник
2
Ссылка / Описание : fpdf.org FPDF - это класс PHP, который позволяет генерировать PDF-файлы на чистом PHP, то есть без использования библиотеки PDFlib. F от FPDF означает бесплатно: вы можете использовать его для любого вида использования и изменять его в соответствии со своими потребностями. У FPDF есть и другие преимущества: функции высокого уровня. Вот список его основных функций: выбор единицы измерения, формата страницы и полей, управление верхним и нижним колонтитулами страницы, автоматический разрыв страницы, автоматический разрыв строки и выравнивание текста, поддержка изображений (JPEG, PNG и GIF), цвета, ссылки, TrueType, Type1 и поддержка кодирования, Сжатие страниц
AnneTheAgile
12
Не очень актуально, учитывая вопрос о Python, а не PHP
KingRadical
1
почему все это понижение? fpdf доступен также для python. pip install fpdf works
user1981924
1
fpdf мог начаться с php. Но есть порт Python, который работает очень хорошо. Поэтому я думаю, что это очень актуальный ответ, который заслуживает больше голосов за, чем за. (Я не уверен в ситуации, когда этот ответ был первоначально опубликован)
Sumudu
3

rinohtype поддерживает встраивание изображений PDF, PNG и JPEG (изначально) и других растровых форматов (если установлена ​​Pillow).

(Полное раскрытие: я автор rinohtype)

Брехт Мачиэльс
источник
1
Привет! Поправьте меня, если я ошибаюсь, но кажется, что это довольно мощный инструмент, и в отличие от многих, многие другие, перечисленные здесь, не являются оболочкой python для активной библиотеки php / ruby ​​/ perl / pyqt4 / other crap.
Mikaelblomkvistsson
3

Если вы знакомы с LaTex, возможно, вы захотите рассмотреть pylatex

Одним из преимуществ pylatex является то, что легко контролировать качество изображения. Изображения в вашем pdf будут того же качества, что и исходные изображения. При использовании reportlab я обнаружил, что изображения автоматически сжимаются и качество изображения снижается.

Недостатком pylatex является то, что, поскольку он основан на LaTex, может быть трудно разместить изображения именно там, где вы хотите на странице. Однако я обнаружил, что использование аргумента position в классе Figure, а иногда и в Subfigure дает достаточно хорошие результаты.

Пример кода для создания PDF с одним изображением:

from pylatex import Document, Figure

doc = Document(documentclass="article")
with doc.create(Figure(position='p')) as fig:
fig.add_image('Lenna.png')

doc.generate_pdf('test', compiler='latexmk', compiler_args=["-pdf", "-pdflatex=pdflatex"], clean_tex=True)

Помимо установки pylatex (pip install pylatex), вам необходимо установить LaTex. Для Ubuntu и других систем Debian вы можете запустить sudo apt-get install texlive-full. Если вы используете Windows, я бы порекомендовал MixTex

larsjr
источник