Cómo crear archivos PDF en Python [cerrado]

156

Estoy trabajando en un proyecto que toma algunas imágenes del usuario y luego crea un archivo PDF que contiene todas estas imágenes.

¿Hay alguna forma o herramienta para hacer esto en Python? Por ejemplo, para crear un archivo PDF (o eps, ps) desde imagen1 + imagen 2 + imagen 3 -> archivo PDF?

Stephen T.
fuente
47
En caso de duda, prefija lo que esté buscando por py;-)
mjv
8
Otro truco de búsqueda SO: [language or tag] some_keyword como en [python] PDFo[python] PDF image
mjv
Para aquellos que vienen aquí usando matplolib: stackoverflow.com/questions/17788685/…
David Parks
Voté esta pregunta porque la respuesta aceptada es la respuesta incorrecta ...
Boatcoder

Respuestas:

39

Sugiero pyPdf . Funciona muy bien También escribí una publicación de blog hace un tiempo, puedes encontrarla aquí .

Geo
fuente
77
Un tenedor actual de PyPDF2 se encuentra aquí .
Edmond Burnett
98
Tenga en cuenta que pypdf solo corta / pega / etc. contenido PDF existente: no puede agregar texto o imágenes a un pdf.
drevicko
3
pyPDF2 no es para crear nuevos documentos PDF, 4cs
michelek
160

Aquí está mi experiencia después de seguir las sugerencias en esta página.

  1. pyPDF no puede incrustar imágenes en archivos. Solo puede dividirse y fusionarse. (Fuente: Ctrl + F a través de su página de documentación ) Lo cual es genial, pero no si tiene imágenes que aún no están incrustadas en un PDF.

  2. pyPDF2 no parece tener ninguna documentación adicional además de pyPDF.

  3. ReportLab es muy extenso. ( Guía del usuario ) Sin embargo, con un poco de Ctrl + F y grepping a través de su fuente, obtuve esto:

    • Primero, descargue el instalador y la fuente de Windows
    • Luego intente esto en la línea de comando de 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()

Todo lo que necesitaba era obtener un montón de imágenes en un PDF, para poder comprobar cómo se ven e imprimirlas. Lo anterior es suficiente para lograr ese objetivo.

ReportLab es excelente, pero se beneficiaría de incluir helloworlds como el anterior en su documentación.

Evgeni Sergeev
fuente
13
Debo decir que reportlab es el mejor para la generación de PDF que he probado, definitivamente el más completo. Sin embargo, también es un poco más complicado. blog.pythonlibrary.org/2010/03/08/… blog.pythonlibrary.org/2010/09/21/…
Jose Salvatierra
1
Esto era exactamente lo que estaba buscando
Maarten
@JoseSalvatierra Gracias José ... esto es realmente fácil. Gracias por el enlace del blog.
Arindam Roychowdhury
33

Sugiero Pdfkit . ( guía de instalación )

Crea pdf desde archivos html. Lo elegí para crear pdf en 2 pasos desde mi pila Python Pyramid:

  1. Representación del lado del servidor con plantillas mako con el estilo y el marcado que desea para su documento pdf
  2. pdfkit.from_string(...)Método de ejecución pasando el html representado como parámetro

De esta forma obtienes un documento pdf con estilo e imágenes compatibles.

Puede instalarlo de la siguiente manera:

  • usando pip

    pip install pdfkit

  • También necesitará instalar wkhtmltopdf ( en Ubuntu ).
eton_ceb
fuente
14

Puede probar esto (Python-for-PDF-Generation) o puede probar PyQt , que tiene soporte para imprimir en pdf.

Python para la generación de PDF

El formato de documento portátil (PDF) le permite crear documentos que se ven exactamente iguales en todas las plataformas. Sin embargo, a veces es necesario generar un documento PDF de forma dinámica, y eso puede ser todo un desafío. Afortunadamente, hay bibliotecas que pueden ayudar. Este artículo examina uno de esos para Python.

Más información en http://www.devshed.com/c/a/Python/Python-for-PDF-Generation/#whoCFCPh3TAks368.99

gruszczy
fuente
Link ya no funciona.
Robert Koch
9

Aquí hay una solución que funciona solo con los paquetes estándar. matplotlibtiene un backend PDF para guardar figuras en PDF. Puede crear figuras con subtramas, donde cada subtrama es una de sus imágenes. Tiene total libertad para meterse con la figura: Agregar títulos, jugar con la posición, etc. Una vez que su figura esté lista, guárdela en PDF. Cada llamada a savefigcreará otra página de PDF.

El siguiente ejemplo muestra 2 imágenes una al lado de la otra, en la página 1 y en la página 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()
Anton Schwaighofer
fuente
en mi prueba, el código genera una sola página con 2 imágenes
constructor
La versión actualizada del código se puede encontrar en github.com/constructor-igor/TechSugar/blob/master/pythonSamples/…
constructor
7

He hecho esto bastante en PyQt y funciona muy bien. Qt tiene un amplio soporte para imágenes, fuentes, estilos, etc. y todos pueden escribirse en documentos PDF.

Allen
fuente
1
Wow, Qt se ve increíble. Dicen que admiten 15 plataformas, inc. Windows, Mac OS X, Linux, Android, iOS, Windows RT más estos sistemas operativos en tiempo real: INTEGRITY QNX VxWorks qt.io/qt-framework . Y, como soy un fanático de Python, me gusta "PyQt combina todas las ventajas de Qt y Python. Un programador tiene todo el poder de Qt, pero puede explotarlo con la simplicidad de Python". Riverbankcomputing.co.uk / software / pyqt / intro
AnneTheAgile
7

Creo que matplotlib tiene la capacidad de serializar gráficos, texto y otros objetos en un documento pdf.

Andrea
fuente
Sí tu puedes. Esta respuesta SO tiene algunos buenos enlaces sobre cómo hacerlo.
drevicko
7

fpdf es python (también). Y de uso frecuente. Ver PyPI / pip search. Pero tal vez fue renombrado de pyfpdf a fpdf. De las características: compatibilidad con PNG, GIF y JPG (incluida transparencia y canal alfa)

mirek
fuente
1
Su respuesta no está clara, pero Thyere es ciertamente PyFPDF pfoject pyfpdf.readthedocs.io/en/latest
Wojciech Kaczmarek
Toda la confusión en el nombramiento es realmente una pena. Esta respuesta y el comentario de @WojciechKaczmarek realmente merecen más votos a favor y atención. PyFPDF es un puerto de Python de una biblioteca PDF de uso frecuente originalmente escrita en PHP.
Ideograma
6

Uso rst2pdf para crear un archivo pdf, ya que estoy más familiarizado con RST que con HTML. Admite incrustar casi cualquier tipo de imágenes ráster o vectoriales.

Requiere reportlab , pero descubrí que reportlab no es tan fácil de usar (al menos para mí).

ismailsunni
fuente
3

Depende de en qué formato estén sus archivos de imagen, pero para un proyecto aquí en el trabajo utilicé la herramienta tiff2pdf en LibTIFF de RemoteSensing.org . Básicamente, solo utilicé el subproceso para llamar a tiff2pdf.exe con el argumento apropiado para leer el tipo de tiff que tenía y generar el tipo de pdf que quería. Si no son tiffs, probablemente podría convertirlos en tiffs usando PIL, o tal vez encontrar una herramienta más específica para su tipo de imagen (o más genérica si las imágenes serán diversas) como ReportLab mencionado anteriormente.

Tofystedeth
fuente
3

fpdf me funciona bien. Mucho más simple que ReportLab y realmente gratis. Funciona con UTF-8.

mfs
fuente
2
Enlace / Descripción: fpdf.org FPDF es una clase PHP que permite generar archivos PDF con PHP puro, es decir, sin usar la biblioteca PDFlib. F de FPDF significa Gratis: puede usarlo para cualquier tipo de uso y modificarlo para satisfacer sus necesidades. FPDF tiene otras ventajas: funciones de alto nivel. Aquí hay una lista de sus características principales: elección de unidad de medida, formato de página y márgenes, gestión de encabezado y pie de página, salto de página automático, salto de línea automático y justificación de texto, soporte de imagen (JPEG, PNG y GIF), colores, enlaces, TrueType, Type1 y soporte de codificación, compresión de página
AnneTheAgile
12
No es muy relevante considerando que la pregunta era sobre Python, no PHP
KingRadical
1
¿Por qué todo este voto negativo? fpdf está disponible también para python. pip install fpdf works
user1981924
1
fpdf podría haber comenzado con php. Pero hay un puerto de Python que funciona muy bien. Así que creo que esta es una respuesta muy relevante que merece más votos positivos que negativos. (No estoy seguro de la situación cuando esta respuesta se publicó inicialmente)
Sumudu
3

rinohtype admite la incrustación de imágenes PDF, PNG y JPEG (de forma nativa) y otros formatos de mapa de bits (cuando Pillow está instalado).

(Divulgación completa: soy el autor de rinohtype)

Brecht Machiels
fuente
1
¡Oye! Corríjame si me equivoco, pero parece que es una herramienta bastante poderosa y, a diferencia de muchos, muchos otros enumerados aquí no es un contenedor de Python para una biblioteca php / ruby ​​/ perl / pyqt4 / other crap.
Mikaelblomkvistsson
3

Si está familiarizado con LaTex, puede considerar pylatex

Una de las ventajas de pylatex es que es fácil controlar la calidad de la imagen. Las imágenes en su pdf serán de la misma calidad que las imágenes originales. Al usar Reportlab, experimenté que las imágenes se comprimían automáticamente y que la calidad de la imagen se reducía.

La desventaja de pylatex es que, dado que se basa en LaTex, puede ser difícil colocar las imágenes exactamente donde desea en la página. Sin embargo, descubrí que usar el argumento de posición en la clase Figura, y a veces Subfigura, da resultados suficientemente buenos.

Código de ejemplo para crear un pdf con una sola imagen:

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)

Además de instalar pylatex (pip install pylatex), debe instalar LaTex. Para Ubuntu y otros sistemas Debian puede ejecutar sudo apt-get install texlive-full. Si está utilizando Windows, recomendaría MixTex

larsjr
fuente