Cách tạo tệp PDF trong Python [đã đóng]


156

Tôi đang làm việc trên một dự án lấy một số hình ảnh từ người dùng và sau đó tạo một tệp PDF có chứa tất cả các hình ảnh này.

Có cách nào hay công cụ nào để làm điều này trong Python không? Ví dụ: để tạo tệp PDF (hoặc eps, ps) từ image1 + image 2 + image 3 -> tệp PDF?


47
Khi nghi ngờ, tiền tố bất cứ điều gì bạn đang tìm kiếm bởi py;-)
mjv

8
Một mẹo tìm kiếm SO khác: [language or tag] some_keyword như trong [python] PDFhoặc[python] PDF image
mjv

Đối với những người đến đây bằng matplolib: stackoverflow.com/questions/17788685/ory
David

Tôi đánh giá thấp câu hỏi này vì câu trả lời được chấp nhận là câu trả lời sai ....
Boatcoder

Câu trả lời:


39

Tôi đề nghị pyPdf . Nó hoạt động thực sự tốt đẹp. Tôi cũng đã viết một bài đăng blog trước đây, bạn có thể tìm thấy nó ở đây .


7
Một ngã ba hiện tại của PyPDF2 được đặt ở đây .
Edmond Burnett

98
Lưu ý rằng pypdf chỉ cắt / dán / vv .. nội dung pdf hiện có - bạn không thể thêm văn bản hoặc hình ảnh vào pdf.
drevicko

3
pyPDF2 không phải để tạo tài liệu PDF mới, 4cs
michelek

160

Dưới đây là kinh nghiệm của tôi sau khi làm theo gợi ý trên trang này.

  1. pyPDF không thể nhúng hình ảnh vào tập tin. Nó chỉ có thể phân chia và hợp nhất. (Nguồn: Ctrl + F thông qua trang tài liệu của nó ) Thật tuyệt vời, nhưng không phải nếu bạn có hình ảnh chưa được nhúng trong PDF.

  2. pyPDF2 dường như không có bất kỳ tài liệu bổ sung nào trên đầu trang của pyPDF.

  3. Báo cáoLab rất rộng. ( Userguide ) Tuy nhiên, với một chút Ctrl + F và đi qua nguồn của nó, tôi đã nhận được điều này:

    • Đầu tiên, tải xuống trình cài đặt Windowsnguồn
    • Sau đó thử điều này trên dòng lệnh 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()
      

Tất cả những gì tôi cần là đưa một loạt các hình ảnh vào một tệp PDF, để tôi có thể kiểm tra xem chúng trông như thế nào và in chúng ra. Trên đây là đủ để đạt được mục tiêu đó.

ReportLab là tuyệt vời, nhưng sẽ được hưởng lợi từ việc bao gồm các hellowworld như trên nổi bật trong tài liệu của mình.


13
Tôi phải nói báo cáo là tốt nhất cho thế hệ PDF mà tôi đã thử, chắc chắn là đầy đủ nhất. Tuy nhiên, nó cũng phức tạp hơn một chút. blog.pythonlibrary.org/2010/03/08/... blog.pythonlibrary.org/2010/09/21/...
Jose Salvatierra

1
Đây chính xác là những gì tôi đang tìm kiếm
Maarten

@JoseSalvatierra Cảm ơn Jose ... điều này thực sự dễ dàng. Cảm ơn các liên kết blog.
Arindam Roychowdhury

33

Tôi đề nghị Pdfkit . ( hướng dẫn cài đặt )

Nó tạo pdf từ các tệp html. Tôi đã chọn nó để tạo pdf trong 2 bước từ ngăn xếp Kim tự tháp Python của mình:

  1. Kết xuất phía máy chủ với các mẫu mako với kiểu và đánh dấu bạn muốn cho tài liệu pdf của bạn
  2. pdfkit.from_string(...)Phương thức thực hiện bằng cách chuyển html được kết xuất làm tham số

Bằng cách này bạn có được một tài liệu pdf với kiểu dáng và hình ảnh được hỗ trợ.

Bạn có thể cài đặt nó như sau:

  • sử dụng pip

    pip install pdfkit

  • Bạn cũng sẽ cần cài đặt wkhtmltopdf ( trên Ubuntu ).

14

Bạn có thể thử điều này (Python-for-PDF-Generation) hoặc bạn có thể thử PyQt , có hỗ trợ in ra pdf.

Python cho thế hệ PDF

Định dạng tài liệu di động (PDF) cho phép bạn tạo các tài liệu trông giống hệt nhau trên mọi nền tảng. Tuy nhiên, đôi khi một tài liệu PDF cần được tạo động, và đó có thể là một thách thức khá lớn. May mắn thay, có những thư viện có thể giúp đỡ. Bài viết này kiểm tra một trong những người cho Python.

Đọc thêm tại http://www.devshed.com/c/a/Python/Python-for-PDF-Generation/#whoCFCPh3TAks368.99


Liên kết không hoạt động nữa.
Robert Koch

9

Đây là một giải pháp chỉ hoạt động với các gói tiêu chuẩn. matplotlibcó phần phụ trợ PDF để lưu số liệu vào PDF. Bạn có thể tạo một số liệu với các ô phụ, trong đó mỗi ô phụ là một trong những hình ảnh của bạn. Bạn có toàn quyền tự do lộn xộn với hình: Thêm tiêu đề, chơi với vị trí, v.v ... Sau khi hình của bạn hoàn thành, hãy lưu vào PDF. Mỗi cuộc gọi savefigsẽ tạo một trang PDF khác.

Ví dụ bên dưới vẽ 2 hình ảnh cạnh nhau, trên trang 1 và trang 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()

trong thử nghiệm của tôi, mã tạo ra một trang duy nhất với 2 hình ảnh
tạo

phiên bản cập nhật của mã có thể được tìm thấy trong github.com/constructor-igor/TechSugar/blob/master/pythonSamples/ Kẻ
xây dựng

7

Tôi đã làm điều này khá một chút trong PyQt và nó hoạt động rất tốt. Qt có hỗ trợ rộng rãi cho hình ảnh, phông chữ, kiểu, v.v. và tất cả những thứ đó có thể được viết ra thành tài liệu pdf.


1
Wow, Qt trông thật tuyệt vời. Họ nói rằng họ hỗ trợ 15 plaforms, inc. Windows, Mac OS X, Linux, Android, iOS, Windows RT cộng với các Hệ điều hành thời gian thực này - INTEGRITY QNX VxWorks qt.io/qt-framework . Và, vì tôi là một người hâm mộ python, tôi thích "PyQt kết hợp tất cả các lợi thế của Qt và Python. Một lập trình viên có tất cả sức mạnh của Qt, nhưng có thể khai thác nó với sự đơn giản của Python." Riverbankcomputing.co.uk / phần mềm / pyqt / giới thiệu
AnneTheAgile

7

Tôi tin rằng matplotlib có khả năng tuần tự hóa đồ họa, văn bản và các đối tượng khác thành tài liệu pdf.


Vâng, bạn có thể. Câu trả lời SO này có một số liên kết tốt về cách làm điều đó.
drevicko

6

Tôi sử dụng rst2pdf để tạo tệp pdf, vì tôi quen thuộc với RST hơn là với HTML. Nó hỗ trợ nhúng hầu hết mọi loại hình ảnh raster hoặc vector.

Nó yêu cầu báo cáo , nhưng tôi thấy báo cáo không dễ sử dụng (ít nhất là đối với tôi).


6

fpdf là trăn (quá). Và thường được sử dụng. Xem tìm kiếm PyPI / pip. Nhưng có lẽ nó đã được đổi tên từ pyfpdf thành fpdf. Từ các tính năng: Hỗ trợ PNG, GIF và JPG (bao gồm cả kênh trong suốt và alpha)


1
Câu trả lời của bạn không rõ ràng, nhưng chắc chắn là pfoject pyfpdf.readthedocs.io/en/latest
Wojciech Kaczmarek của bạn

Tất cả sự nhầm lẫn trong việc đặt tên là một điều thực sự đáng tiếc. Câu trả lời này và nhận xét của @WojciechKaczmarek thực sự xứng đáng nhận được nhiều sự ủng hộ và chú ý hơn. PyFPDF là một cổng python của một thư viện PDF thường được sử dụng ban đầu được viết bằng PHP.
Ideogram


3

Nó phụ thuộc vào định dạng tệp hình ảnh của bạn, nhưng đối với một dự án tại đây, tôi đã sử dụng công cụ tiff2pdf trong LibTIFF từ RemoteSensing.org . Về cơ bản chỉ cần sử dụng quy trình con để gọi tiff2pdf.exe với đối số thích hợp để đọc loại tiff tôi có và xuất ra loại pdf tôi muốn. Nếu chúng không phải là tiff, bạn có thể chuyển đổi chúng thành tiff bằng PIL hoặc có thể tìm một công cụ cụ thể hơn cho loại hình ảnh của bạn (hoặc chung chung hơn nếu hình ảnh sẽ đa dạng) như ReportLab đã đề cập ở trên.


3

fpdf hoạt động tốt cho tôi. Đơn giản hơn nhiều so với ReportLab và thực sự miễn phí. Hoạt động với UTF-8.


2
Liên kết / Mô tả : fpdf.org FPDF là một lớp PHP cho phép tạo các tệp PDF bằng PHP thuần túy, nghĩa là không cần sử dụng thư viện PDFlib. F từ FPDF là viết tắt của Miễn phí: bạn có thể sử dụng nó cho bất kỳ loại sử dụng nào và sửa đổi nó cho phù hợp với nhu cầu của bạn. FPDF có những lợi thế khác: chức năng cấp cao. Dưới đây là danh sách các tính năng chính của nó: Lựa chọn đơn vị đo, định dạng trang và lề, Quản lý chân trang và chân trang, Ngắt trang tự động, Ngắt dòng tự động và chứng minh văn bản, Hỗ trợ hình ảnh (JPEG, PNG và GIF), Màu sắc, Liên kết, TrueType, Type1 và hỗ trợ mã hóa, nén trang
AnneTheAgile

12
Không liên quan lắm khi xem xét câu hỏi là về Python, không phải PHP
KingRadical

1
Tại sao tất cả điều này xuống cấp? fpdf cũng có sẵn cho python. Pip cài đặt fpdf hoạt động
user1981924

1
fpdf có thể đã bắt đầu với php. Nhưng có một cổng python hoạt động thực sự tốt. Vì vậy, tôi nghĩ rằng đây là một câu trả lời rất phù hợp, xứng đáng được nhiều phiếu hơn so với phiếu giảm. (Tôi không chắc chắn về tình huống khi câu trả lời này ban đầu được đăng)
Sumudu

3

rinohtype hỗ trợ nhúng các hình ảnh PDF, PNG và JPEG (nguyên bản) và các định dạng bitmap khác (khi Gối được cài đặt).

(Tiết lộ đầy đủ: Tôi là tác giả của rinohtype)


1
Chào! Sửa lỗi cho tôi nếu tôi sai, nhưng có vẻ như đó là công cụ khá mạnh mẽ và không giống như nhiều người khác, nhiều người khác được liệt kê ở đây không phải là một trình bao bọc python cho một thư viện php / ruby ​​/ perl / pyqt4 / khác.
Mikaelblomkvistsson

3

Nếu bạn quen thuộc với LaTex, bạn có thể muốn xem xét pylatex

Một trong những ưu điểm của pylatex là dễ dàng kiểm soát chất lượng hình ảnh. Hình ảnh trong pdf của bạn sẽ có chất lượng tương đương với hình ảnh gốc. Khi sử dụng báo cáo, tôi đã trải nghiệm rằng hình ảnh được tự động nén và chất lượng hình ảnh giảm.

Nhược điểm của pylatex là, vì nó dựa trên LaTex, nên khó có thể đặt hình ảnh chính xác nơi bạn muốn trên trang. Tuy nhiên, tôi đã thấy rằng việc sử dụng đối số vị trí trong lớp Hình và đôi khi là Cấu hình con, cho kết quả đủ tốt.

Mã ví dụ để tạo pdf với một hình ảnh duy nhất:

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)

Ngoài việc cài đặt pylatex (pip install pylatex), bạn cần cài đặt LaTex. Đối với Ubuntu và các hệ thống Debian khác, bạn có thể chạy sudo apt-get install texlive-full. Nếu bạn đang sử dụng Windows, tôi khuyên dùng MixTex

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.