Jak tworzyć pliki PDF w Pythonie [zamknięte]

156

Pracuję nad projektem, który pobiera kilka obrazów od użytkownika, a następnie tworzy plik PDF zawierający wszystkie te obrazy.

Czy jest jakiś sposób lub jakieś narzędzie do zrobienia tego w Pythonie? Np. Aby utworzyć plik PDF (lub eps, ps) z obrazka 1 + obraz 2 + obrazek 3 -> plik PDF?

Stephen T.
źródło
47
W razie wątpliwości py
wpisz
8
Kolejna sztuczka wyszukiwania SO: [language or tag] some_keyword jak w [python] PDFor[python] PDF image
mjv
Dla tych, którzy przyjeżdżają tutaj używając matplolib: stackoverflow.com/questions/17788685/ ...
David Parks
Odrzuciłem to pytanie, ponieważ zaakceptowana odpowiedź jest błędna ....
boatcoder

Odpowiedzi:

39

Proponuję pyPdf . Działa naprawdę fajnie. Niedawno napisałem też post na blogu, możesz go znaleźć tutaj .

Geo
źródło
7
Aktualna widelec z PyPDF2 znajduje się tutaj .
Edmond Burnett
98
Pamiętaj, że plik pypdf wycina / wkleja / itp. Tylko istniejącą zawartość PDF - nie możesz dodawać tekstu ani obrazów do pliku PDF.
drevicko
3
pyPDF2 nie służy do tworzenia nowych dokumentów PDF, 4cs
michelek
160

Oto moje doświadczenie po wykonaniu wskazówek na tej stronie.

  1. pyPDF nie może osadzać obrazów w plikach. Może tylko dzielić i łączyć. (Źródło: Ctrl + F na stronie dokumentacji ) Co jest świetne, ale nie, jeśli masz obrazy, które nie są jeszcze osadzone w pliku PDF.

  2. Wydaje się, że pyPDF2 nie ma żadnej dodatkowej dokumentacji poza pyPDF.

  3. ReportLab jest bardzo rozbudowany. ( Podręcznik użytkownika ) Jednak z odrobiną Ctrl + F i grepowaniem przez jego źródło, otrzymałem to:

    • Najpierw pobierz instalator i źródło systemu Windows
    • Następnie spróbuj tego w wierszu poleceń Pythona:

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

Wszystko, czego potrzebowałem, to pobrać kilka obrazów do pliku PDF, abym mógł sprawdzić, jak wyglądają, i wydrukować je. Powyższe wystarczy, aby osiągnąć ten cel.

ReportLab jest świetny, ale skorzystałby na umieszczeniu helloworlds, takich jak powyższe, w widocznym miejscu w swojej dokumentacji.

Evgeni Sergeev
źródło
13
Muszę powiedzieć, że reportlab jest najlepszy do generowania plików PDF, którego próbowałem, zdecydowanie najbardziej kompletny. Jednak jest to też nieco bardziej skomplikowane. blog.pythonlibrary.org/2010/03/08/... blog.pythonlibrary.org/2010/09/21/…
Jose Salvatierra
1
To było dokładnie to, czego szukałem
Maarten
@JoseSalvatierra Dzięki Jose ... to naprawdę proste. Dzięki za link do bloga.
Arindam Roychowdhury
33

Proponuję Pdfkit . ( instrukcja instalacji )

Tworzy pdf z plików html. Wybrałem go, aby utworzyć plik PDF w 2 krokach z mojego stosu Python Pyramid:

  1. Renderowanie po stronie serwera za pomocą szablonów mako ze stylem i znacznikami, które chcesz umieścić w dokumencie PDF
  2. Wykonywanie pdfkit.from_string(...)metody przez przekazanie wyrenderowanego html jako parametru

W ten sposób otrzymasz dokument pdf z obsługą stylów i obrazów.

Możesz go zainstalować w następujący sposób:

  • za pomocą pip

    pip install pdfkit

  • Będziesz także musiał zainstalować wkhtmltopdf ( na Ubuntu ).
eton_ceb
źródło
14

Możesz spróbować tego (Python-for-PDF-Generation) lub możesz wypróbować PyQt , który obsługuje drukowanie do formatu PDF.

Python do generowania plików PDF

Portable Document Format (PDF) umożliwia tworzenie dokumentów, które wyglądają dokładnie tak samo na każdej platformie. Czasami jednak dokument PDF musi być generowany dynamicznie, co może być sporym wyzwaniem. Na szczęście są biblioteki, które mogą pomóc. W tym artykule omówiono jedną z nich dla języka Python.

Przeczytaj więcej na http://www.devshed.com/c/a/Python/Python-for-PDF-Generation/#whoCFCPh3TAks368.99

gruszczy
źródło
Link już nie działa.
Robert Koch
9

Oto rozwiązanie, które działa tylko ze standardowymi pakietami. matplotlibma zaplecze PDF do zapisywania liczb w formacie PDF. Możesz tworzyć figury z wykresami pobocznymi, gdzie każdy wykres podrzędny jest jednym z obrazów. Masz pełną swobodę w manipulowaniu figurą: dodawanie tytułów, gra z pozycją itp. Gdy figura jest gotowa, zapisz ją w formacie PDF. Każde wywołanie savefigspowoduje utworzenie kolejnej strony PDF.

Przykład poniżej przedstawia 2 obrazy obok siebie, na stronie 1 i stronie 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
źródło
w moim teście kod generuje pojedynczą stronę z 2 obrazami
konstruktor
zaktualizowaną wersję kodu można znaleźć na github.com/constructor-igor/TechSugar/blob/master/pythonSamples/ ...
konstruktor
7

Zrobiłem to całkiem sporo w PyQt i działa to bardzo dobrze. Qt ma szerokie wsparcie dla obrazów, czcionek, stylów itp., A wszystko to można zapisać w dokumentach PDF.

Allen
źródło
1
Wow, Qt wygląda niesamowicie. Mówią, że obsługują 15 platform, inc. Windows, Mac OS X, Linux, Android, iOS, Windows RT oraz te systemy operacyjne czasu rzeczywistego - INTEGRITY QNX VxWorks qt.io/qt-framework . A ponieważ jestem fanem Pythona, podoba mi się „PyQt łączy w sobie wszystkie zalety Qt i Pythona. Programista ma całą moc Qt, ale jest w stanie wykorzystać ją z prostotą Pythona.” Riverbankcomputing.co.uk / software / pyqt / intro
AnneTheAgile
7

Uważam, że matplotlib ma możliwość serializacji grafiki, tekstu i innych obiektów do dokumentu PDF.

Andrea
źródło
Tak, możesz. Ta odpowiedź TAK zawiera dobre linki, jak to zrobić.
drevicko
7

fpdf to (też) python. I często używany. Zobacz wyszukiwanie PyPI / pip. Ale może została zmieniona z pyfpdf na fpdf. Z funkcji: obsługa PNG, GIF i JPG (w tym przezroczystość i kanał alfa)

mirek
źródło
1
Twoja odpowiedź jest niejasna, ale z pewnością jest to PyFPDF pfoject pyfpdf.readthedocs.io/en/latest
Wojciech Kaczmarek
Szkoda całego zamieszania w nazewnictwie. Ta odpowiedź i komentarz @WojciechKaczmarek naprawdę zasługują na więcej głosów i uwagi. PyFPDF to port Pythona często używanej biblioteki PDF, pierwotnie napisanej w PHP.
Ideogram
6

Używam rst2pdf do tworzenia pliku pdf, ponieważ bardziej znam RST niż HTML. Obsługuje osadzanie prawie każdego rodzaju obrazów rastrowych lub wektorowych.

Wymaga reportlab , ale stwierdziłem, że reportlab nie jest tak prosty w użyciu (przynajmniej dla mnie).

ismailsunni
źródło
3

Zależy to od formatu plików graficznych, ale do projektu tutaj w pracy użyłem narzędzia tiff2pdf w LibTIFF z RemoteSensing.org . Po prostu użyłem podprocesu do wywołania tiff2pdf.exe z odpowiednim argumentem, aby odczytać rodzaj tiff, który miałem i wypisać taki plik PDF, jaki chciałem. Jeśli nie są to tiffy, prawdopodobnie możesz przekonwertować je na tiffy za pomocą PIL lub może znaleźć narzędzie bardziej specyficzne dla twojego typu obrazu (lub bardziej ogólne, jeśli obrazy będą zróżnicowane), takie jak wspomniany powyżej ReportLab.

Tofystedeth
źródło
3

fpdf działa dobrze dla mnie. Znacznie prostsze niż ReportLab i naprawdę darmowe. Działa z UTF-8.

mfs
źródło
2
Link / Descrip .: fpdf.org FPDF to klasa PHP, która umożliwia generowanie plików PDF w czystym PHP, czyli bez korzystania z biblioteki PDFlib. F od FPDF oznacza Free: możesz go używać do dowolnego użytku i modyfikować, aby dopasować go do swoich potrzeb. FPDF ma inne zalety: funkcje wysokiego poziomu. Oto lista jego głównych funkcji: wybór jednostki miary, formatu strony i marginesów, zarządzanie nagłówkiem i stopką strony, automatyczny podział strony, automatyczny podział linii i wyrównywanie tekstu, obsługa obrazów (JPEG, PNG i GIF), kolory, linki, Obsługa TrueType, Type1 i kodowania, kompresja strony
AnneTheAgile
12
Niezbyt istotne, biorąc pod uwagę, że pytanie dotyczyło Pythona, a nie PHP
KingRadical
1
po co te wszystkie przegłosowania? fpdf jest dostępny również dla Pythona. działa pip install fpdf
user1981924
1
fpdf mógł zacząć się od php. Ale jest port Pythona, który działa naprawdę dobrze. Myślę więc, że jest to bardzo trafna odpowiedź, która zasługuje na więcej głosów pozytywnych niż negatywnych. (Nie jestem pewien, jak wyglądała ta odpowiedź)
Sumudu
3

rinohtype obsługuje osadzanie obrazów PDF, PNG i JPEG (natywnie) i innych formatów bitmapowych (gdy zainstalowano Pillow).

(Pełne ujawnienie: jestem autorem rinohtype)

Brecht Machiels
źródło
1
Hej! Popraw mnie, jeśli się mylę, ale wydaje się, że jest to całkiem potężne narzędzie i w przeciwieństwie do wielu innych wymienionych tutaj nie jest opakowaniem Pythona dla acient php / ruby ​​/ perl / pyqt4 / innej biblioteki crap.
Mikaelblomkvistsson
3

Jeśli znasz LaTex, możesz rozważyć pylatex

Jedną z zalet pylatexu jest łatwość kontrolowania jakości obrazu. Obrazy w pliku PDF będą tej samej jakości co oryginalne obrazy. Korzystając z reportlab, zauważyłem, że obrazy zostały automatycznie skompresowane, a jakość obrazu spadła.

Wadą pylatexu jest to, że ponieważ jest oparty na LaTex, może być trudno umieścić obrazy dokładnie tam, gdzie chcesz na stronie. Jednak odkryłem, że użycie argumentu position w klasie Figure, a czasem Subfigure, daje wystarczająco dobre wyniki.

Przykładowy kod do tworzenia pliku PDF z jednym obrazem:

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)

Oprócz instalacji pylatexu (pip install pylatex), należy zainstalować LaTex. W przypadku Ubuntu i innych systemów Debian, które możesz uruchomić sudo apt-get install texlive-full. Jeśli używasz Windowsa, polecam MixTex

larsjr
źródło