web-dev-qa-db-pt.com

Como criar PDF arquivos em Python

Eu estou trabalhando em um projeto que leva algumas imagens do usuário e, em seguida, cria um arquivo PDF que contém todas essas imagens.

Existe alguma maneira ou ferramenta para fazer isso em Python? Por exemplo. criar um arquivo PDF (ou eps, ps) a partir do arquivo image1 + image 2 + image 3 -> PDF?

156
Stephen T.

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

41
Geo

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 através de sua página documentação ) O que é ótimo, mas não se você tiver imagens que não estejam incorporadas em um PDF.

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

  3. ReportLab é muito extenso. ( Userguide ) No entanto, com um pouco de Ctrl + F e grepping através de sua fonte, eu tenho isso:

    • Primeiramente, baixe o instalador do Windows e fonte
    • Então tente isso na linha de comando do 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 checar como elas estavam e imprimi-las. O acima é suficiente para atingir esse objetivo.

O ReportLab é ótimo, mas se beneficiaria da inclusão de mundos inofensivos como o acima destacado em sua documentação.

137
Evgeni Sergeev

Sugiro Pdfkit . (instalação guia )

Cria pdf a partir de arquivos html. Eu escolhi para criar pdf em 2 passos da minha pilha Pyramid Pyramid:

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

Dessa forma, você obtém um documento em PDF com estilo e imagens suportadas.

Você pode instalá-lo da seguinte maneira: 

  • usando pip

    pip install pdfkit

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

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

Python para PDF Geração

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

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

14
gruszczy

Eu fiz isso um pouco no PyQt e funciona muito bem. O Qt tem amplo suporte para imagens, fontes, estilos, etc, e todos eles podem ser escritos em documentos PDF.

6
Allen

Aqui está uma solução que funciona apenas com os pacotes padrão. matplotlib tem um backend PDF para salvar figuras em PDF. Você pode criar figuras com subtramas, onde cada subtrama é uma das suas imagens. Você tem total liberdade para mexer com a figura: Adicionando títulos, jogando com a posição, etc. Uma vez que sua figura esteja pronta, salve em PDF. Cada chamada para savefig criará outra página do PDF.

Exemplo abaixo representa duas 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()
5
Anton Schwaighofer

Eu acredito que o matplotlib tem a capacidade de serializar gráficos, textos e outros objetos em um documento pdf.

5
Andrea

Eu uso rst2pdf para criar um arquivo pdf, já que estou mais familiarizado com o RST do que com o HTML. Ele suporta a incorporação de quase qualquer tipo de imagens raster ou vetoriais.

Ele requer reportlab , mas eu encontrei reportlab não é tão simples de usar (pelo menos para mim).

5
ismailsunni

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

4
mirek

Você pode realmente tentar xhtml2pdf http://flask.pocoo.org/snippets/68/

1
zeroc00l

o fpdf funciona bem para mim. Muito mais simples que o ReportLab e realmente grátis. Funciona com o UTF-8.

1
mfs

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)

1
Brecht Machiels

Depende de qual formato seus arquivos de imagem estão, mas para um projeto aqui no trabalho eu usei a ferramenta tiff2pdf no LibTIFF de RemoteSensing.org . Basicamente, usei o subprocesso para chamar tiff2pdf.exe com o argumento apropriado para ler o tipo de discussão que eu tinha e produzir o tipo de pdf que eu queria. Se eles não são tiffs você provavelmente poderia convertê-los em tiffs usando PIL, ou talvez encontrar 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.

1
Tofystedeth

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

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

A desvantagem do pylatex é que, uma vez que é baseado no LaTex, pode ser difícil colocar as imagens exatamente onde você quer na página. No entanto, descobri que usar o 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 o Sudo apt-get install texlive-full. Se você estiver usando o Windows eu recomendaria MixTex

0
Chepe