Python'da PDF dosyaları oluşturma [kapalı]


156

Kullanıcıdan bazı görüntüler alır ve sonra tüm bu görüntüleri içeren bir PDF dosyası oluşturur bir proje üzerinde çalışıyorum.

Python'da bunu yapmanın herhangi bir yolu veya aracı var mı? Örneğin, image1 + image 2 + image 3 -> PDF dosyasından bir PDF dosyası (veya eps, ps) oluşturmak için?


47
Şüphe duyduğunuzda; aradığınız her şeyi ön ek py;-)
mjv

8
Başka bir SO search trick: [language or tag] some_keyword as in [python] PDFor[python] PDF image
mjv

Buraya matplolib kullanarak gelenler için: stackoverflow.com/questions/17788685/…
David Parks

Bu soruyu reddettim çünkü kabul edilen cevap yanlış cevaptır ....
boatcoder

Yanıtlar:



159

İşte bu sayfadaki ipuçlarını takip ettikten sonra yaşadığım deneyim.

  1. pyPDF görüntüleri dosyalara gömemez. Sadece bölünebilir ve birleşebilir. (Kaynak: belge sayfası aracılığıyla Ctrl + F ) Bu harika, ancak PDF'ye gömülü olmayan resimleriniz varsa değil.

  2. pyPDF2'nin pyPDF'nin üstünde fazladan bir belgeye sahip olmadığı görülüyor.

  3. ReportLab çok kapsamlıdır. ( Userguide ) Ancak, biraz Ctrl + F ve kaynak aracılığıyla selamlama ile, ben bunu aldım:

    • İlk olarak, Windows yükleyicisini ve kaynağını indirin
    • Sonra bunu Python komut satırında deneyin:

      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()
      

Tek ihtiyacım olan PDF'ye bir sürü görüntü almak, böylece nasıl göründüklerini ve yazdırdıklarını kontrol edebiliyorum. Yukarıdakiler bu hedefe ulaşmak için yeterlidir.

ReportLab harika, ancak yukarıdaki gibi dünya dünyalarını belgelerine dahil etmekten fayda sağlayacaktır.


13
Reportlab'ın denediğim PDF üretimi için en iyisi olduğunu söylemeliyim, kesinlikle en eksiksiz. Ancak, biraz daha karmaşık. blog.pythonlibrary.org/2010/03/08/… blog.pythonlibrary.org/2010/09/21/…
Jose Salvatierra

1
Tam da aradığım şey buydu
Maarten

@JoseSalvatierra Teşekkürler Jose ... Bu gerçekten kolay. Blog bağlantısı için teşekkürler.
Arindam Roychowdhury

33

Pdfkit'i öneririm . (kurulum kılavuzu )

Html dosyalarından pdf oluşturur. Python Piramit yığınımdan 2 adımda pdf oluşturmayı seçtim:

  1. Sunucu tarafını mako şablonlarıyla, sizin için istediğiniz stille ve biçimlendirmeyle oluşturma pdf belgesi
  2. pdfkit.from_string(...)Oluşturulan html'yi parametre olarak ileterek yöntem yürütme

Bu şekilde stil ve resim destekli bir pdf belgesi alırsınız.

Aşağıdaki gibi yükleyebilirsiniz:

  • pip kullanma

    pip install pdfkit

  • Ayrıca wkhtmltopdf ( Ubuntu üzerinde ) yüklemeniz gerekecektir .

14

Deneyebilirsin bu (Python-for-PDF-Nesil) veya deneyebileceğiniz PyQt pdf yazdırma desteği vardır.

PDF Üretimi için Python

Taşınabilir Belge Biçimi (PDF), her platformda tamamen aynı görünen belgeler oluşturmanıza olanak tanır. Bununla birlikte, bazen bir PDF belgesinin dinamik olarak oluşturulması gerekir ve bu oldukça zor olabilir. Neyse ki, yardımcı olabilecek kütüphaneler var. Bu makalede Python için olanlardan biri incelenmektedir.

Daha fazla bilgi için http://www.devshed.com/c/a/Python/Python-for-PDF-Generation/#whoCFCPh3TAks368.99


Bağlantı artık çalışmıyor.
Robert Koch

9

İşte sadece standart paketlerle çalışan bir çözüm. matplotlibrakamları PDF'ye kaydetmek için bir PDF arka ucuna sahiptir. Her alt grafiğin resimlerinizden biri olduğu alt grafiklerle bir şekil oluşturabilirsiniz. Şekil ile uğraşmak için tamamen özgürsünüz: Başlık ekleme, pozisyonla oynama vb. Rakamınız bittikten sonra PDF'ye kaydedin. Her çağrı, savefigbaşka bir PDF sayfası oluşturur.

Aşağıdaki örnek 2 resmi yan yana, sayfa 1 ve sayfa 2 olarak çizer.

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()

testimde, kod 2 resim ile tek bir sayfa oluşturur
yapıcı


7

Bu biraz PyQt içinde yaptım ve çok iyi çalışıyor. Qt, resimler, yazı tipleri, stiller, vb. İçin geniş bir desteğe sahiptir ve bunların hepsi pdf belgelerine yazılabilir.


1
Vay canına, Qt harika görünüyor. 15 plaformu desteklediklerini söylüyorlar. Windows, Mac OS X, Linux, Android, iOS, Windows RT ve bu Gerçek Zamanlı İşletim Sistemleri - INTEGRITY QNX VxWorks qt.io/qt-framework . Ve ben bir python hayranı olduğum için, "PyQt Qt ve Python'un tüm avantajlarını birleştiriyor. Bir programcı Qt'nin tüm gücüne sahip, ancak Python'un sadeliğinden faydalanabiliyor." Riverbankcomputing.co.uk / yazılım / pyqt / intro
AnneTheAgile

7

Matplotlib'in grafik, metin ve diğer nesneleri bir pdf belgesine serileştirme yeteneğine sahip olduğuna inanıyorum.


Evet yapabilirsin. Bu SO cevabının nasıl yapılacağına dair bazı iyi bağlantıları vardır.
drevicko

7

fpdf python (aynı zamanda). Ve sıklıkla kullanılır. Bkz. PyPI / pip araması. Ama belki pyfpdf'den fpdf'ye değiştirildi. Özelliklerden: PNG, GIF ve JPG desteği (saydamlık ve alfa kanalı dahil)


1
Cevabınız net değil, ama kesinlikle PyFPDF pfoject pyfpdf.readthedocs.io/en/latest
Wojciech Kaczmarek

Adlandırmadaki tüm karışıklıklar gerçekten üzücü. Bu cevap ve @WojciechKaczmarek'in yorumu gerçekten daha fazla oy ve dikkati hak ediyor. PyFPDF, başlangıçta PHP'de yazılmış, sık kullanılan bir PDF kütüphanesinin bir python portudur.
İdeogram

6

HTML'den daha çok RST'ye aşina olduğum için pst dosyası oluşturmak için rst2pdf kullanıyorum . Hemen hemen her tür raster veya vektör görüntüsünün gömülmesini destekler.

Reportlab gerektirir , ancak reportlab'ın (en azından benim için) kullanımı o kadar basit olmadığını gördüm.



3

Görüntü dosyalarınızın hangi formatta olduğuna bağlıdır, ancak işteki bir proje için RemoteSensing.org'dan LibTIFF'deki tiff2pdf aracını kullandım . Temelde sadece tiff2pdf.exe vardı tiff tür okumak ve istediğim pdf tür çıktı uygun argüman ile aramak için alt işlem kullanılır. Eğer tiffler değilse, muhtemelen PIL kullanarak tiff'lere dönüştürebilir veya yukarıda belirtilen ReportLab gibi görüntü türünüze (veya görüntüler farklıysa daha genel) daha spesifik bir araç bulabilirsiniz.


3

fpdf benim için iyi çalışıyor. ReportLab'dan çok daha basit ve gerçekten ücretsiz. UTF-8 ile çalışır.


2
Link / Descrip .: fpdf.org FPDF, saf PHP ile PDF dosyaları oluşturmaya izin veren bir PHP sınıfıdır, yani PDFlib kütüphanesini kullanmadan. FPDF'nin F'si Ücretsiz anlamına gelir: her türlü kullanım için kullanabilir ve ihtiyaçlarınıza uyacak şekilde değiştirebilirsiniz. FPDF'nin başka avantajları da vardır: üst düzey fonksiyonlar. Ana özelliklerinin bir listesi: Ölçü birimi seçimi, sayfa biçimi ve kenar boşlukları, Sayfa üstbilgisi ve altbilgisi yönetimi, Otomatik sayfa sonu, Otomatik satır sonu ve metin yaslama, Görüntü desteği (JPEG, PNG ve GIF), Renkler, Bağlantılar, TrueType, Type1 ve kodlama desteği, Sayfa sıkıştırma
AnneTheAgile

12

1
neden bütün bu düşüşler? fpdf python için de kullanılabilir. pip install fpdf works
user1981924 25:18

1
fpdf php ile başlamış olabilir. Ama gerçekten iyi çalışan bir python portu var. Bu yüzden, bunun aşağı oylardan daha fazla oyu hak eden çok ilgili bir cevap olduğunu düşünüyorum. (Bu cevabın ilk olarak gönderildiği durumdan emin değilim)
Sumudu

3

rinohtype , PDF, PNG ve JPEG görüntülerini (yerel olarak) ve diğer bitmap biçimlerini (Yastık takıldığında) gömmeyi destekler.

(Tam açıklama: rinohtype'ın yazarıyım)


1
Hey! Eğer yanılıyorsam beni düzeltin, ama oldukça güçlü bir araç gibi görünüyor ve burada listelenen pek çok farklı, acient php / ruby ​​/ perl / pyqt4 / diğer bok kütüphanesi için bir python sarıcı değil.
Mikaelblomkvistsson

3

LaTex'i biliyorsanız, pylatex'i düşünebilirsiniz .

Pylatex'in avantajlarından biri, görüntü kalitesini kontrol etmenin kolay olmasıdır. PDF'nizdeki görüntüler orijinal görüntülerle aynı kalitede olacaktır. Reportlab kullanırken, görüntülerin otomatik olarak sıkıştırıldığını ve görüntü kalitesinin düştüğünü gördüm.

Pylatex'in dezavantajı, LaTex'e dayandığından, görüntüleri tam olarak sayfada istediğiniz yere yerleştirmenin zor olabileceğidir. Bununla birlikte, Figure sınıfında ve bazen Subfigure'da konum bağımsız değişkenini kullanmanın yeterince iyi sonuçlar verdiğini buldum.

Tek bir resimle pdf oluşturmak için örnek kod:

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) kurulumuna ek olarak, LaTex'i kurmanız gerekir. Ubuntu ve diğer Debian sistemleri için çalıştırabilirsiniz sudo apt-get install texlive-full. Windows kullanıyorsanız MixTex'i tavsiye ederim

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.