Làm cách nào để chuyển đổi hình ảnh thành pdf trong python?

Python là một ngôn ngữ kịch bản và do đó, nó giúp theo nhiều cách để tạo các trình chuyển đổi tệp như CSV sang PDF, PDF sang DOC và ngược lại. Với sự trợ giúp của một số thư viện nhất định, chúng tôi cũng có thể tạo một ứng dụng chuyển đổi hình ảnh thành PDF. Để tạo một ứng dụng như vậy, chúng tôi sử dụng mô-đun img2pdf trong Python. Nó giúp phân tích cú pháp nhị phân hình ảnh và chuyển đổi nó thành PDF

Chúng tôi sẽ làm theo các bước sau để tạo một ứng dụng,

  • Trước tiên, hãy đảm bảo rằng hệ thống đã có sẵn các yêu cầu về img2pdf. Nhập pip install img2pdf trên thiết bị đầu cuối của bạn để cài đặt gói. Nhập img2pdf vào sổ ghi chép

  • Nhập filedialog để mở hộp thoại yêu cầu người dùng chọn nhiều ảnh trong thư mục

  • Nhập thư viện tkinter bằng cách nhập từ nhập tkinter *

  • Tạo cấu trúc cơ bản bằng Thư viện Tkinter, chẳng hạn như Tiện ích Nút để mở Hộp thoại Tệp, tiện ích Nhãn để hiển thị thông báo

  • Định nghĩa chức năng mở hộp thoại yêu cầu người dùng chọn nhiều ảnh trong thư mục

  • Xác định chức năng mở tệp dưới dạng nhị phân và chuyển đổi tệp thành PDF bằng phương thức chuyển đổi

Thí dụ

# Import required Libraries
from tkinter import *
from tkinter import filedialog
import img2pdf
from tkinter import ttk
# Create an instance of tkinter frame
win = Tk()
#set the geometry
win.geometry('750x250')
win.title("Image to PDF")
def select_file():
   global images
   images = filedialog.askopenfilenames(initialdir = "",title = "Select Images")
   Label(win, text=images).pack()
#Convert Image to PDF
def image_to_pdf():
   for image in enumerate(images):
      with open(f"{image}.pdf", "wb") as file:
         file.write(img2pdf.convert(images))
         Label(frame,text=file).pack()
# Add Labels and Buttons
Label(win, text = "Image to PDF Convertor",font = "Caveat 25 bold").pack(pady = 30)
ttk.Button(win, text = "Select Images",command = select_file).pack(ipadx = 10)
frame = Frame(win)
frame.pack()
ttk.Button(frame, text = "Convert and Save",command = image_to_pdf).pack(side = LEFT, pady=20,ipadx = 10)
win.mainloop()

đầu ra

Chạy đoạn mã trên sẽ hiển thị cửa sổ ứng dụng sẽ chuyển đổi hình ảnh thành tệp PDF

Làm cách nào để chuyển đổi hình ảnh thành pdf trong python?

Bây giờ, chọn một tệp Hình ảnh từ thư mục cục bộ và nhấp vào nút "Chuyển đổi và Lưu" để chuyển đổi và lưu dưới dạng PDF

Chuyển đổi không mất dữ liệu hình ảnh raster sang PDF. Bạn nên sử dụng img2pdf nếu ưu tiên của bạn là (theo thứ tự này)

  1. luôn mất dữ liệu. hình ảnh được nhúng trong PDF sẽ luôn có cùng thông tin màu chính xác cho mọi pixel làm đầu vào
  2. bé nhỏ. nếu có thể, sự khác biệt về kích thước tệp giữa hình ảnh đầu vào và PDF đầu ra sẽ chỉ là chi phí hoạt động của chính bộ chứa PDF
  3. Nhanh. nếu có thể, hình ảnh đầu vào chỉ được dán vào tài liệu PDF nguyên trạng mà không cần bất kỳ CPU nào đói mã hóa lại dữ liệu pixel

Phần mềm chuyển đổi thông thường (như ImageMagick) sẽ

  1. không bị mất dữ liệu vì mã hóa lại thành JPEG
  2. không nhỏ vì sử dụng mã hóa phẳng lãng phí dữ liệu pixel thô
  3. không nhanh vì dữ liệu đầu vào được mã hóa lại

Một ưu điểm khác của việc không phải mã hóa lại đầu vào (trong hầu hết các tình huống phổ biến) là img2pdf có thể xử lý đầu vào lớn hơn nhiều so với phần mềm khác, vì dữ liệu pixel thô không bao giờ phải được tải vào bộ nhớ

Bảng sau đây cho thấy cách img2pdf xử lý các đầu vào khác nhau tùy thuộc vào định dạng tệp đầu vào và không gian màu của hình ảnh

Định dạngKhông gian màuKết quảJPEGanydirectJPEG2000bất kỳdirectPNG (không xen kẽ, không trong suốt)bất kỳTIFF (CCITT Nhóm 4)đơn sắc trực tiếpbất kỳ ngoại trừ CMYK và đơn sắcPNG Paethanyđơn sắcCCITT Nhóm 4bất kỳCMYKphẳng

Đối với các hình ảnh JPEG, JPEG2000, PNG và TIFF không xen kẽ với dữ liệu được mã hóa CCITT Nhóm 4, img2pdf nhúng trực tiếp dữ liệu hình ảnh vào PDF mà không cần mã hóa lại. Do đó, nó chỉ coi định dạng PDF là định dạng chứa dữ liệu hình ảnh. Trong những trường hợp này, img2pdf chỉ tăng kích thước tệp theo kích thước của bộ chứa PDF (thường khoảng 500 đến 700 byte). Do dữ liệu chỉ được sao chép và không được mã hóa lại nên img2pdf cũng thường nhanh hơn các giải pháp khác cho các định dạng đầu vào này

Đối với tất cả các loại đầu vào khác, trước tiên img2pdf phải chuyển đổi dữ liệu pixel để tương thích với PDF. Trong hầu hết các trường hợp, bộ lọc PNG Paeth được áp dụng cho dữ liệu pixel. Đối với đầu vào đơn sắc, CCITT Nhóm 4 được sử dụng thay thế. Chỉ đối với đầu vào CMYK, không có bộ lọc nào được áp dụng trước khi áp dụng nén phẳng

Cách sử dụng

Hình ảnh phải được cung cấp dưới dạng tệp vì img2pdf cần tìm kiếm trong bộ mô tả tệp

Nếu không có tệp đầu ra nào được chỉ định với tùy chọn

$ img2pdf --help
4/
$ img2pdf --help
5, đầu ra sẽ được thực hiện thành thiết bị xuất chuẩn. Một lời gọi điển hình là

$ img2pdf img1.png img2.jpg -o out.pdf

Tài liệu chi tiết có thể được truy cập bằng cách chạy

$ img2pdf --help

lỗi

  • Nếu bạn tìm thấy tệp TIFF được mã hóa JPEG, JPEG2000, PNG hoặc CCITT Nhóm 4 mà Adobe Acrobat Reader không thể đọc được khi nhúng vào tệp PDF, vui lòng liên hệ với tôi

  • Một lỗi được tạo ra nếu hình ảnh đầu vào bị hỏng. Điều này thường xảy ra nếu hình ảnh đầu vào có giá trị Định hướng EXIF ​​​​không hợp lệ bằng 0. Mặc dù chỉ cho phép chín giá trị khác nhau từ 1 đến 9, điện thoại Android và máy ảnh DSLR của Canon tạo ra ảnh JPEG với giá trị không hợp lệ là 0. Sửa hình ảnh đầu vào của bạn bằng

    $ img2pdf --help
    
    6 hoặc phần mềm tương tự trước khi chuyển JPEG sang
    $ img2pdf --help
    
    7 hoặc chạy
    $ img2pdf --help
    
    7 với
    $ img2pdf --help
    
    9 (nếu bạn chạy img2pdf từ dòng lệnh) hoặc bằng cách chuyển
    $ apt install img2pdf
    
    0 làm đối số cho
    $ apt install img2pdf
    
    1 khi sử dụng img2pdf làm thư viện

  • img2pdf sử dụng PIL (hoặc Gối) để lấy dữ liệu meta hình ảnh và chuyển đổi đầu vào nếu cần. Để ngăn chặn các cuộc tấn công từ chối dịch vụ bằng bom giải nén, Gối giới hạn số pixel tối đa mà một hình ảnh đầu vào được phép có. Nếu bạn chắc chắn rằng bạn biết mình đang làm gì, thì bạn có thể vô hiệu hóa biện pháp bảo vệ này bằng cách chuyển tùy chọn

    $ apt install img2pdf
    
    2 cho img2pdf. Điều này cho phép một người xử lý hình ảnh đầu vào thậm chí rất lớn

Cài đặt

Trên hệ thống dựa trên Debian và Ubuntu, img2pdf có thể được cài đặt từ kho lưu trữ chính thức

$ apt install img2pdf

Nếu bạn muốn cài đặt nó bằng pip, bạn có thể chạy

$ pip3 install img2pdf

Nếu bạn muốn cài đặt từ mã nguồn, hãy sử dụng

$ cd img2pdf/
$ pip3 install .

Để kiểm tra tập lệnh bảng điều khiển mà không cần cài đặt gói trên hệ thống của bạn, hãy sử dụng virtualenv

$ cd img2pdf/
$ virtualenv ve
$ ve/bin/pip3 install .

Sau đó, bạn có thể kiểm tra trình chuyển đổi bằng cách sử dụng

$ ve/bin/img2pdf -o test.pdf src/tests/test.jpg

Đối với người dùng Microsoft Windows, dựa trên PyInstaller. các tệp exe được sản xuất bởi appveyor. Nếu bạn không muốn cài đặt Python trước khi sử dụng img2pdf, bạn có thể vào appveyor và nhấp vào "Artifacts" để tải xuống phiên bản mới nhất. https. //ci. băng tải ứng dụng. com/dự án/josch/img2pdf

GUI

Tồn tại một GUI thử nghiệm với tất cả các cài đặt hiện đang bị tắt. Bạn có thể chuyển đổi trực tiếp hình ảnh sang PDF nhưng bạn chưa thể đặt bất kỳ tùy chọn nào qua GUI. Nếu bạn quan tâm đến việc thêm nhiều tính năng hơn vào PDF, vui lòng gửi yêu cầu hợp nhất. GUI dựa trên tkinter và hoạt động trên Linux, Windows và MacOS

Thư viện

Gói cũng có thể được sử dụng như một thư viện

import img2pdf

# opening from filename
with open("name.pdf","wb") as f:
	f.write(img2pdf.convert('test.jpg'))

# opening from file handle
with open("name.pdf","wb") as f1, open("test.jpg") as f2:
	f1.write(img2pdf.convert(f2))

# using in-memory image data
with open("name.pdf","wb") as f:
	f.write(img2pdf.convert("\x89PNG...")

# multiple inputs (variant 1)
with open("name.pdf","wb") as f:
	f.write(img2pdf.convert("test1.jpg", "test2.png"))

# multiple inputs (variant 2)
with open("name.pdf","wb") as f:
	f.write(img2pdf.convert(["test1.jpg", "test2.png"]))

# convert all files ending in .jpg inside a directory
dirname = "/path/to/images"
imgs = []
for fname in os.listdir(dirname):
	if not fname.endswith(".jpg"):
		continue
	path = os.path.join(dirname, fname)
	if os.path.isdir(path):
		continue
	imgs.append(path)
with open("name.pdf","wb") as f:
	f.write(img2pdf.convert(imgs))

# convert all files ending in .jpg in a directory and its subdirectories
dirname = "/path/to/images"
imgs = []
for r, _, f in os.walk(dirname):
	for fname in f:
		if not fname.endswith(".jpg"):
			continue
		imgs.append(os.path.join(r, fname))
with open("name.pdf","wb") as f:
	f.write(img2pdf.convert(imgs))


# convert all files matching a glob
import glob
with open("name.pdf","wb") as f:
	f.write(img2pdf.convert(glob.glob("/path/to/*.jpg")))

# ignore invalid rotation values in the input images
with open("name.pdf","wb") as f:
	f.write(img2pdf.convert('test.jpg'), rotation=img2pdf.Rotation.ifvalid)

# writing to file descriptor
with open("name.pdf","wb") as f1, open("test.jpg") as f2:
	img2pdf.convert(f2, outputstream=f1)

# specify paper size (A4)
a4inpt = (img2pdf.mm_to_pt(210),img2pdf.mm_to_pt(297))
layout_fun = img2pdf.get_layout_fun(a4inpt)
with open("name.pdf","wb") as f:
	f.write(img2pdf.convert('test.jpg', layout_fun=layout_fun))

# use a fixed dpi of 300 instead of reading it from the image
dpix = dpiy = 300
layout_fun = img2pdf.get_fixed_dpi_layout_fun((dpix, dpiy))
with open("name.pdf","wb") as f:
	f.write(img2pdf.convert('test.jpg', layout_fun=layout_fun))

# create a PDF/A-1b compliant document by passing an ICC profile
with open("name.pdf","wb") as f:
	f.write(img2pdf.convert('test.jpg', pdfa="/usr/share/color/icc/sRGB.icc"))

So sánh với ImageMagick

Tạo một hình ảnh thử nghiệm lớn

$ convert logo: -resize 8000x original.jpg

Chuyển đổi nó thành PDF bằng ImageMagick và img2pdf

$ time img2pdf original.jpg -o img2pdf.pdf
$ time convert original.jpg imagemagick.pdf

Lưu ý rằng ImageMagick mất nhiều thời gian hơn để thực hiện chuyển đổi so với img2pdf. Nó cũng sử dụng gấp đôi bộ nhớ

Bây giờ hãy trích xuất dữ liệu hình ảnh từ cả hai tài liệu PDF và so sánh nó với bản gốc

$ img2pdf --help
0

Để có được đầu ra không mất dữ liệu với ImageMagick, chúng ta có thể sử dụng nén Zip nhưng điều đó làm tăng kích thước của đầu ra một cách không cần thiết

$ img2pdf --help
1

So sánh với pdfLaTeX

pdfLaTeX thực hiện chuyển đổi không mất dữ liệu từ các hình ảnh được bao gồm sang PDF theo mặc định. Nếu đầu vào là JPEG, thì nó chỉ cần nhúng JPEG vào PDF giống như cách img2pdf thực hiện. Nhưng đối với các định dạng hình ảnh khác, nó sử dụng nén phẳng dữ liệu pixel đơn giản và do đó làm tăng kích thước tệp đầu ra một cách không cần thiết

$ img2pdf --help
2

So sánh với podofoimg2pdf

Giống như pdfLaTeX, podofoimg2pdf có thể thực hiện chuyển đổi không mất dữ liệu từ JPEG sang PDF bằng cách nhúng rõ ràng dữ liệu JPEG vào bộ chứa pdf. Nhưng cũng giống như pdfLaTeX, nó sử dụng nén phẳng cho tất cả các định dạng tệp khác, do đó đôi khi dẫn đến các tệp lớn hơn mức cần thiết

$ img2pdf --help
3

Nó cũng chỉ hỗ trợ JPEG, PNG và TIF làm đầu vào và thiếu nhiều tính năng tiện lợi của img2pdf như kích thước trang, đường viền, xoay và siêu dữ liệu

So sánh với Tesseract OCR

Tesseract OCR gần nhất với chức năng mà img2pdf cung cấp. Nó có thể chuyển đổi đầu vào JPEG và PNG sang PDF mà không cần tăng kích thước tệp một cách không cần thiết và đồng thời không mất dữ liệu. Vì vậy, nếu đầu vào của bạn là hình ảnh JPEG và PNG, thì bạn có thể sử dụng Tesseract thay vì img2pdf một cách an toàn. Đối với đầu vào khác, Tesseract có thể không thực hiện chuyển đổi không mất dữ liệu. Ví dụ: nó chuyển đổi đầu vào CMYK thành RGB và xóa kênh alpha khỏi hình ảnh có độ trong suốt. Đối với TIFF hoặc GIF động nhiều trang, nó sẽ chỉ chuyển đổi khung hình đầu tiên

Làm cách nào để chuyển đổi sang PDF bằng Python?

Trong bài viết này, bạn sẽ biết cách chuyển đổi văn bản và tệp văn bản sang PDF bằng Python. FPDF là một lớp Python cho phép tạo tệp PDF bằng mã Python. .
Nhập lớp FPDF từ mô-đun fpdf
thêm một trang
Đặt phông chữ
Chèn một ô và cung cấp văn bản
Lưu pdf với “. phần mở rộng pdf”

Có cách nào để biến ảnh thành PDF không?

Bạn có thể chuyển đổi các tệp JPEG, PNG, BMP, GIF và TIFF thành tài liệu PDF bằng công cụ trực tuyến Acrobat .

Python có thể tạo PDF không?

Một cách phổ biến để tạo tệp PDF là lưu tệp Word dưới dạng. pdf nhưng chúng ta cũng có thể tạo tệp PDF bằng Python . Ưu điểm? .