Ответ 1
Я предлагаю pyPdf. Он работает очень хорошо. Я также написал сообщение в блоге некоторое время назад, вы можете найти его здесь.
Я работаю над проектом, который принимает некоторые изображения от пользователя, а затем создает PDF файл, содержащий все эти изображения.
Есть ли способ или какой-либо инструмент для этого в Python? Например. для создания файла PDF (или eps, ps) из image1 + image 2 + image 3 → PDF файл?
Я предлагаю pyPdf. Он работает очень хорошо. Я также написал сообщение в блоге некоторое время назад, вы можете найти его здесь.
Вот мой опыт после подсказок на этой странице.
pyPDF не может вставлять изображения в файлы. Он может расколоться и слить. (Источник: Ctrl + F через страницу документации) Это здорово, но нет, если у вас есть изображения, которые еще не встроены в PDF.
pyPDF2, похоже, нет никакой дополнительной документации поверх pyPDF.
ReportLab очень обширен. (Userguide) Однако, с небольшим количеством Ctrl + F и grepping через его источник, я получил следующее:
Затем попробуйте это в командной строке Python:
from reportlab.pdfgen import canvas
from reportlab.lib.units import inch, cm
c = canvas.Canvas('ex.pdf')
c.drawImage('ar.jpg', 0, 0, 10*cm, 10*cm)
c.showPage()
c.save()
Все, что мне нужно - это собрать кучу изображений в PDF, чтобы я мог проверить, как они выглядят и печатать их. Вышеизложенное достаточно для достижения этой цели.
ReportLab велик, но выиграет от включения в него документации helloworld, как показано выше.
Я предлагаю Pdfkit. (руководство по установке guide)
Он создает PDF из HTML файлов. Я выбрал его для создания PDF в 2 шага из моего стека Python Pyramid:
pdfkit.from_string(...)
путем передачи рендеринга HTML в качестве параметраТаким образом, вы получите документ в формате PDF с поддержкой стилей и изображений.
Вы можете установить его следующим образом:
используя пункт
pip install pdfkit
Вы можете попробовать this (Python-for-PDF-Generation) или вы можете попробовать PyQt, который поддерживает печать в формате pdf.
Python для создания PDF
Формат Portable Document Format (PDF) позволяет создавать документы, которые выглядят одинаково на каждой платформе. Иногда документ PDF нужно генерировать динамически, и это может быть довольно сложной задачей. К счастью, есть библиотеки, которые могут помочь. В этой статье рассматривается один из них для Python.
Подробнее на http://www.devshed.com/c/a/Python/Python-for-PDF-Generation/#whoCFCPh3TAks368.99
Я сделал это довольно много в PyQt, и он работает очень хорошо. Qt имеет обширную поддержку изображений, шрифтов, стилей и т.д., И все они могут быть записаны в pdf-документы.
Я считаю, что matplotlib имеет возможность сериализовать графику, текст и другие объекты в pdf-документе.
Я использую rst2pdf для создания PDF файла, так как я больше знаком с RST, чем с HTML. Он поддерживает встраивание практически любого вида растровых или векторных изображений.
Для этого требуется reportlab, но я обнаружил, что reportlab не так прост в использовании (по крайней мере, для меня).
fpdf - это питон (тоже). И часто используется. См. Поиск PyPI/pip. Но, возможно, он был переименован из pyfpdf в fpdf. Из особенностей: Поддержка PNG, GIF и JPG (включая прозрачность и альфа-канал)
Вот решение, которое работает только с стандартными пакетами. 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()
На самом деле вы можете попробовать xhtml2pdf http://flask.pocoo.org/snippets/68/
Это зависит от того, в каком формате находятся ваши файлы изображений, но для проекта здесь на работе я использовал инструмент tiff2pdf в LibTIFF из RemoteSensing.org. В основном используется только подпроцесс для вызова tiff2pdf.exe с соответствующим аргументом, чтобы прочитать тип tiff, который у меня был, и вывести вид pdf, который я хотел. Если они не являются tiffs, вы можете преобразовать их в tiffs с помощью PIL или, возможно, найти инструмент, более специфичный для вашего типа изображения (или более общий, если изображения будут разнообразными), например ReportLab, упомянутых выше.
rinohtype поддерживает встраивание PDF, PNG и изображений JPEG (изначально) и других форматов растровых изображений (при установке Pillow).
(Полное раскрытие: я являюсь автором rinohtype)
Если вы знакомы с 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
fpdf хорошо работает для меня. Гораздо проще, чем ReportLab и действительно бесплатно. Работает с UTF-8.