Como criar arquivos PDF em Python [fechado]

156

Estou trabalhando em um projeto que tira algumas imagens do usuário e cria um arquivo PDF que contém todas essas imagens.

Existe alguma maneira ou ferramenta para fazer isso no Python? Por exemplo, para criar um arquivo PDF (ou eps, ps) a partir de imagem1 + imagem 2 + imagem 3 -> arquivo PDF?

Stephen T.
fonte
47
Em caso de dúvida, prefixo o que você está procurando por py;-)
mjv
8
Outro truque de pesquisa do SO: [language or tag] some_keyword como em [python] PDFou[python] PDF image
mjv 12/02/2010
Para aqueles que vêm aqui usando o matplolib: stackoverflow.com/questions/17788685/…
David Parks
I downvoted essa pergunta porque a resposta aceita é a resposta errada ....
boatcoder

Respostas:

39

Eu sugiro pyPdf . Funciona muito bem. Também escrevi um post há algum tempo, você pode encontrá-lo aqui .

Geo
fonte
7
Um fork atual do PyPDF2 está localizado aqui .
Edmond Burnett
98
Observe que o pypdf apenas corta / cola / etc. conteúdo existente em pdf - você não pode adicionar texto ou imagens a um pdf.
drevicko
3
pyPDF2 não é para a criação de novos documentos PDF, 4cs
michelek 15/09/18
160

Aqui está a minha experiência depois de seguir as dicas nesta página.

  1. O pyPDF não pode incorporar imagens em arquivos. Só pode dividir e mesclar. (Fonte: Ctrl + F na página de documentação ) O que é ótimo, mas não se você tiver imagens que ainda não foram incorporadas em um PDF.

  2. O pyPDF2 não parece ter nenhuma documentação extra sobre o pyPDF.

  3. O ReportLab é muito extenso. ( Guia do usuário ) No entanto, com um pouco de Ctrl + F e grepping através de sua fonte, obtive o seguinte:

    • Primeiro, faça o download do instalador e fonte do Windows
    • Em seguida, tente isso na linha de comando 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()
      

Tudo o que eu precisava era colocar um monte de imagens em um PDF, para que eu pudesse verificar a aparência delas e imprimi-las. O exposto acima é suficiente para atingir esse objetivo.

O ReportLab é excelente, mas se beneficiaria da inclusão de mundos hellow como os mencionados com destaque em sua documentação.

Evgeni Sergeev
fonte
13
Devo dizer que o reportlab é o melhor para a geração de PDF que eu tentei, definitivamente o mais completo. No entanto, também é um pouco mais complicado. blog.pythonlibrary.org/2010/03/08/… blog.pythonlibrary.org/2010/09/21/…
Jose Salvatierra
1
Este foi exatamente o que eu estava procurando
Maarten
@JoseSalvatierra Obrigado José ... isso é realmente fácil. Obrigado pelo link do blog.
Arindam Roychowdhury
33

Eu sugiro PDFkit . ( guia de instalação )

Ele cria pdf a partir de arquivos html. Eu o escolhi para criar pdf em duas etapas da minha pilha Pyramid Pyramid:

  1. Renderização no lado do servidor com modelos mako com o estilo e a marcação que você deseja para seu documento pdf
  2. pdfkit.from_string(...)Método de execução passando o html renderizado como parâmetro

Dessa forma, você obtém um documento PDF com estilo e imagens compatíveis.

Você pode instalá-lo da seguinte maneira:

  • usando pip

    pip install pdfkit

  • Você também precisará instalar o wkhtmltopdf ( no Ubuntu ).
eton_ceb
fonte
14

Você pode tentar isso (Python-for-PDF-Generation) ou PyQt , que oferece suporte para impressão em pdf.

Python para geração de PDF

O Portable Document Format (PDF) permite criar documentos com a mesma aparência em todas as plataformas. Às vezes, no entanto, um documento PDF precisa ser gerado dinamicamente, e isso pode ser um grande desafio. Felizmente, existem bibliotecas que podem ajudar. Este artigo examina um deles para Python.

Leia mais em http://www.devshed.com/c/a/Python/Python-for-PDF-Generation/#whoCFCPh3TAks368.99

gruszczy
fonte
O link não funciona mais.
Robert Koch
9

Aqui está uma solução que funciona apenas com os pacotes padrão. matplotlibpossui um back-end em PDF para salvar números em PDF. Você pode criar figuras com subparcelas, nas quais cada subtrama é uma de suas imagens. Você tem total liberdade para mexer com a figura: Adicionando títulos, brinque com a posição, etc. Depois que sua figura estiver pronta, salve em PDF. Cada chamada para savefigcriará outra página de PDF.

O exemplo abaixo plota 2 imagens lado a lado, na página 1 e na 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
fonte
no meu teste, o código gera uma única página com 2 imagens
construtor
a versão atualizada do código pode ser encontrada em github.com/constructor-igor/TechSugar/blob/master/pythonSamples/…
constructor
7

Eu fiz isso bastante no PyQt e funciona muito bem. O Qt possui amplo suporte para imagens, fontes, estilos, etc., e tudo isso pode ser gravado em documentos PDF.

Allen
fonte
1
Uau, Qt parece incrível. Eles dizem que apóiam 15 plataformas, inc. Windows, Mac OS X, Linux, Android, iOS, Windows RT e esses sistemas operacionais em tempo real - INTEGRITY QNX VxWorks qt.io/qt-framework . E, como sou fã de python, gosto de "PyQt combina todas as vantagens do Qt e Python. Um programador tem todo o poder do Qt, mas é capaz de explorá-lo com a simplicidade do Python". Riverbankcomputing.co.uk / software / pyqt / intro
AnneTheAgile 30/10
7

Acredito que o matplotlib tem a capacidade de serializar gráficos, texto e outros objetos em um documento PDF.

Andrea
fonte
Sim você pode. Esta resposta SO tem alguns bons links sobre como fazê-lo.
Drevicko
6

Eu uso o rst2pdf para criar um arquivo pdf, pois estou mais familiarizado com o RST do que com o HTML. Ele suporta a incorporação de praticamente qualquer tipo de imagem raster ou vetorial.

Ele requer o reportlab , mas achei que o reportlab não é tão fácil de usar (pelo menos para mim).

ismailsunni
fonte
6

O fpdf também é python. E usado frequentemente. Consulte a pesquisa PyPI / pip. Mas talvez tenha sido renomeado de pyfpdf para fpdf. Dos recursos: suporte PNG, GIF e JPG (incluindo transparência e canal alfa)

mirek
fonte
1
A sua resposta é clara, mas Thyere certamente PyFPDF pfoject pyfpdf.readthedocs.io/en/latest
Wojciech Kaczmarek
Toda a confusão na nomeação é realmente uma pena. Esta resposta e o comentário de @WojciechKaczmarek realmente merecem mais votos e atenção. PyFPDF é uma porta python de uma biblioteca PDF frequentemente usada originalmente escrita em PHP.
Ideograma
3

Depende do formato dos arquivos de imagem, mas, para um projeto aqui no trabalho, usei a ferramenta tiff2pdf no LibTIFF, do RemoteSensing.org . Basicamente, usei o subprocesso para chamar tiff2pdf.exe com o argumento apropriado para ler o tipo de tiff que eu tinha e gerar o tipo de pdf que eu queria. Se eles não forem tiffs, você provavelmente poderá convertê-los em tiffs usando PIL, ou talvez encontre uma ferramenta mais específica para o seu tipo de imagem (ou mais genérica se as imagens forem diversas) como o ReportLab mencionado acima.

Tofystedeth
fonte
3

O fpdf funciona bem para mim. Muito mais simples que o ReportLab e realmente gratuito. Funciona com UTF-8.

mfs
fonte
2
Link / descrição: fpdf.org FPDF é uma classe PHP que permite gerar arquivos PDF com PHP puro, ou seja, sem usar a biblioteca PDFlib. F do FPDF significa Grátis: você pode usá-lo para qualquer tipo de uso e modificá-lo para atender às suas necessidades. O FPDF tem outras vantagens: funções de alto nível. Aqui está uma lista de seus principais recursos: Escolha da unidade de medida, formato e margens da página, Gerenciamento de cabeçalho e rodapé da página, Quebra automática de página, Quebra automática de linha e justificação de texto, Suporte de imagem (JPEG, PNG e GIF), Cores, Links, TrueType, Type1 e suporte a codificação, compactação de página
AnneTheAgile 30/10
12
Não é muito relevante, considerando que a pergunta era sobre Python, não sobre PHP
KingRadical
1
por que todo esse voto negativo? O fpdf também está disponível para python. Instalação do pip fpdf works
user1981924
1
O fpdf pode ter começado com o php. Mas há uma porta python que funciona muito bem. Então, acho que essa é uma resposta muito relevante que merece mais votos do que votos negativos. (Eu não estou certo sobre a situação quando esta resposta foi inicialmente publicada)
Sumudu
3

O rinohtype suporta a incorporação de imagens PDF, PNG e JPEG (nativamente) e outros formatos de bitmap (quando o Pillow está instalado).

(Divulgação completa: eu sou o autor do rinohtype)

Brecht Machiels
fonte
1
Ei! Corrija-me se eu estiver errado, mas parece que é uma ferramenta bastante poderosa e, ao contrário de muitas, muitas outras listadas aqui não são um wrapper python para uma biblioteca de porcaria php / ruby ​​/ perl / pyqt4 / outra porcaria.
Mikaelblomkvistsson 12/02/19
3

Se você está familiarizado com o LaTex, pode considerar o pylatex

Uma das vantagens do pylatex é que é fácil controlar a qualidade da imagem. As imagens no seu pdf terão a mesma qualidade que as imagens originais. Ao usar o reportlab, percebi que as imagens eram compactadas automaticamente e a qualidade da imagem reduzida.

A desvantagem do pylatex é que, como é baseado no LaTex, pode ser difícil colocar as imagens exatamente onde você deseja na página. No entanto, descobri que o uso do argumento position na classe Figure e, às vezes, Subfigure, fornece bons resultados.

Exemplo de código para criar um pdf com uma única imagem:

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)

Além de instalar o pylatex (pip install pylatex), você precisa instalar o LaTex. Para o Ubuntu e outros sistemas Debian, você pode executar sudo apt-get install texlive-full. Se você estiver usando o Windows, eu recomendaria o MixTex

larsjr
fonte