Hướng dẫn pypdf2 html to pdf - pypdf2 html sang pdf

Công việc của mình thường xuyên phải gộp nhiều trang PDF nhỏ thành 1 file PDF, bình thường thì việc gộp file PDF này có thể được thực hiện bằng một số công cụ online như smallpdf, hoặc 1 số phần mềm xử lý pdf của Adobe. Tuy nhiên, mình không muốn file pdf của mình bị upload lên các dịch vụ online, mà cài cả 1 phần mềm Adobe cần phải trả phí vào chỉ để gộp PDF thì mình cũng không muốn, vậy nên trong bài này mình sẽ chia sẻ với các bạn cách chúng ta có thể tự tạo ra một công cụ dòng lệnh (CLI – tool) để có thể gộp nhiều trang PDF thành 1 tài liệu PDF bằng Python. Các hướng dẫn trong bài này mình thực hiện trên hệ điều hành MacOS, với hệ điều hành Windows, hoặc các hệ điều hành khác, thì cũng tương tự.

  • Cài đặt thư viện xử lý PDF trong Python
  • Sử dụng Python để gộp các files PDF
  • Cách sử dụng code Python để gộp file PDF

Cài đặt thư viện xử lý PDF trong Python

Sử dụng Python để gộp các files PDFPyPDF2, để cài đặt, chúng ta sử dụng dòng lệnh sau trong ứng dụng Terminal của MacOS:

pip install PyPDF2

Cách sử dụng code Python để gộp file PDF

Sử dụng Python để gộp các files PDF

Cách sử dụng code Python để gộp file PDFjoin.py tại đường dẫn

/Users/user_name/Documents/PythonScripts

Có rất nhiều thư viện để xử lý PDF trong Python, trong bài này, mình dùng PyPDF2, để cài đặt, chúng ta sử dụng dòng lệnh sau trong ứng dụng Terminal của MacOS:

import argparse
from PyPDF2 import PdfFileMerger

parser = argparse.ArgumentParser(description="Merge multiple pdfs into one pdf")

parser.add_argument('-o','--output')

parser.add_argument('-i','--input', nargs="+")

args = parser.parse_args()
pdfs = args.input

merger = PdfFileMerger()

for pdf in pdfs:
    merger.append(pdf)

merger.write(args.output)
merger.close()

Cách sử dụng code Python để gộp file PDF

Có rất nhiều thư viện để xử lý PDF trong Python, trong bài này, mình dùng PyPDF2, để cài đặt, chúng ta sử dụng dòng lệnh sau trong ứng dụng Terminal của MacOS:

/Users/user_name/Documents/PythonScripts
3

Sau khi cài đặt thành công thì chúng ta có thể chuyển qua bước tiếp theo

Chúng ta có thể lưu đoạn code sau đây trong một file Python, mình lưu ở file join.py tại đường dẫn

Các bạn có thể lưu code ở một đường dẫn khác tuỳ ý các bạn. Đoạn code như sau:

Cách sử dụng công cụ này như sau, trong cửa sổ Terminal, bạn có thể gõ theo cú pháp sau đây

Hướng dẫn pypdf2 html to pdf - pypdf2 html sang pdf

Phương thức GET_STRING_WIDTH cho phép xác định độ dài của chuỗi trong phông chữ hiện tại, được sử dụng ở đây để tính toán vị trí và chiều rộng của khung xung quanh tiêu đề. Sau đó, các màu được đặt (thông qua set_draw_color, set_fill_color và set_text_color) và độ dày của dòng được đặt thành 1 mm (so với 0,2 theo mặc định) với set_line_width. Cuối cùng, chúng tôi xuất ra ô (tham số cuối cùng cho đúng chỉ ra rằng nền phải được điền).

Phương pháp được sử dụng để in các đoạn văn là multi_cell. Mỗi lần một dòng đạt đến cực bên phải của ô hoặc ký tự trở lại vận chuyển được đáp ứng, việc phá vỡ dòng được phát hành và một ô mới tự động được tạo theo hiện tại. Văn bản là hợp lý theo mặc định.

Ở đây tôi đang sử dụng tệp HTML để chuyển đổi tệp PDF .it chuyển đổi tệp PDF nhưng các thiết kế HTML không xuất hiện trong tệp PDF được chuyển đổi.

import pdfkit
filename = "testfile.html"
with open(filename, "w") as file:
        file.write(message)
pdfkit.from_file(filename, 'my_testpdf.pdf')

Ở đây nó chuyển đổi tệp pdf nhưng các thiết kế html không có trong tệp pdf để bất kỳ ai giúp tôi giải quyết vấn đề này

Hỏi ngày 28 tháng 5 năm 2020 lúc 9:39May 28, 2020 at 9:39

Hướng dẫn pypdf2 html to pdf - pypdf2 html sang pdf

Bạn có thể sử dụng các công cụ như fpdf hoặc pypdf2 để viết các tệp html văn bản và đọc tài liệu trên write_html để biết thêm chi tiết

Đã trả lời ngày 28 tháng 5 năm 2020 lúc 11:18May 28, 2020 at 11:18

Hướng dẫn pypdf2 html to pdf - pypdf2 html sang pdf

Phương thức GET_STRING_WIDTH cho phép xác định độ dài của chuỗi trong phông chữ hiện tại, được sử dụng ở đây để tính toán vị trí và chiều rộng của khung xung quanh tiêu đề. Sau đó, các màu được đặt (thông qua set_draw_color, set_fill_color và set_text_color) và độ dày của dòng được đặt thành 1 mm (so với 0,2 theo mặc định) với set_line_width. Cuối cùng, chúng tôi xuất ra ô (tham số cuối cùng cho đúng chỉ ra rằng nền phải được điền).

  • Phương pháp được sử dụng để in các đoạn văn là multi_cell. Mỗi lần một dòng đạt đến cực bên phải của ô hoặc ký tự trở lại vận chuyển được đáp ứng, việc phá vỡ dòng được phát hành và một ô mới tự động được tạo theo hiện tại. Văn bản là hợp lý theo mặc định.
    • Hai thuộc tính tài liệu được xác định: tiêu đề (set_title) và tác giả (set_Author). Thuộc tính có thể được xem bằng hai phương tiện. Đầu tiên là mở tài liệu trực tiếp với Acrobat Reader, chuyển đến menu Tệp và chọn tùy chọn Thuộc tính tài liệu. Thứ hai, cũng có sẵn từ trình cắm, là nhấp chuột phải và chọn Thuộc tính tài liệu.
    • Tiêu đề, chân trang, ngắt trang và hình ảnh
    • Phá vỡ dòng và màu sắc
    • Một tính năng thú vị khác được sử dụng ở đây: Tria trang tự động. Ngay sau khi một ô sẽ vượt qua giới hạn trong trang (ở mức 2 cm từ dưới cùng theo mặc định), một lần ngắt được thực hiện và phông chữ được khôi phục. Mặc dù tiêu đề và chân trang chọn phông chữ của riêng họ (
      import argparse
      from PyPDF2 import PdfFileMerger
      
      parser = argparse.ArgumentParser(description="Merge multiple pdfs into one pdf")
      
      parser.add_argument('-o','--output')
      
      parser.add_argument('-i','--input', nargs="+")
      
      args = parser.parse_args()
      pdfs = args.input
      
      merger = PdfFileMerger()
      
      for pdf in pdfs:
          merger.append(pdf)
      
      merger.write(args.output)
      merger.close()
      
      7), cơ thể vẫn tiếp tục với
      import argparse
      from PyPDF2 import PdfFileMerger
      
      parser = argparse.ArgumentParser(description="Merge multiple pdfs into one pdf")
      
      parser.add_argument('-o','--output')
      
      parser.add_argument('-i','--input', nargs="+")
      
      args = parser.parse_args()
      pdfs = args.input
      
      merger = PdfFileMerger()
      
      for pdf in pdfs:
          merger.append(pdf)
      
      merger.write(args.output)
      merger.close()
      
      2. Cơ chế phục hồi tự động này cũng áp dụng cho màu sắc và chiều rộng dòng. Giới hạn mà các trang phá vỡ trang có thể được đặt với set_auto_page_break.

Hai thuộc tính tài liệu được xác định: tiêu đề (set_title) và tác giả (set_Author). Thuộc tính có thể được xem bằng hai phương tiện. Đầu tiên là mở tài liệu trực tiếp với Acrobat Reader, chuyển đến menu Tệp và chọn tùy chọn Thuộc tính tài liệu. Thứ hai, cũng có sẵn từ trình cắm, là nhấp chuột phải và chọn Thuộc tính tài liệu.

Cài đặt phần ghi chú

from fpdf import FPDF

pdf = FPDF()
pdf.add_page()
pdf.set_font('Arial', 'B', 16)
pdf.cell(40, 10, 'Hello World!')
pdf.output('tuto1.pdf', 'F')

Thử nghiệm

Ví dụ này sử dụng các phương pháp tiêu đề và chân trang để xử lý các tiêu đề và chân trang trang. Chúng được gọi là tự động. Chúng đã tồn tại trong lớp FPDF nhưng không làm gì cả, do đó chúng tôi phải mở rộng lớp và ghi đè chúng.

pdf = FPDF('P', 'mm', 'A4')

Có thể sử dụng cảnh quan (

/Users/user_name/Documents/PythonScripts
4), các định dạng trang khác (chẳng hạn như
/Users/user_name/Documents/PythonScripts
5 và
/Users/user_name/Documents/PythonScripts
6) và các đơn vị đo (
/Users/user_name/Documents/PythonScripts
7,
/Users/user_name/Documents/PythonScripts
8,
/Users/user_name/Documents/PythonScripts
9).

Hiện tại không có trang nào, vì vậy chúng tôi phải thêm một trang với add_page. Nguồn gốc nằm ở góc trên bên trái và vị trí hiện tại theo mặc định được đặt ở mức 1 cm từ biên giới; Các lề có thể được thay đổi với set_margins.

Trước khi chúng ta có thể in văn bản, bắt buộc phải chọn một phông chữ với set_font, nếu không, tài liệu sẽ không hợp lệ. Chúng tôi chọn Arial Bold 16:

pdf.set_font('Arial', 'B', 16)

Chúng tôi có thể đã chỉ định chữ in nghiêng với

import argparse
from PyPDF2 import PdfFileMerger

parser = argparse.ArgumentParser(description="Merge multiple pdfs into one pdf")

parser.add_argument('-o','--output')

parser.add_argument('-i','--input', nargs="+")

args = parser.parse_args()
pdfs = args.input

merger = PdfFileMerger()

for pdf in pdfs:
    merger.append(pdf)

merger.write(args.output)
merger.close()
0, được gạch chân bằng
import argparse
from PyPDF2 import PdfFileMerger

parser = argparse.ArgumentParser(description="Merge multiple pdfs into one pdf")

parser.add_argument('-o','--output')

parser.add_argument('-i','--input', nargs="+")

args = parser.parse_args()
pdfs = args.input

merger = PdfFileMerger()

for pdf in pdfs:
    merger.append(pdf)

merger.write(args.output)
merger.close()
1 hoặc phông chữ thông thường với một chuỗi trống (hoặc bất kỳ sự kết hợp nào). Lưu ý rằng kích thước phông chữ được đưa ra theo điểm, không phải milimet (hoặc đơn vị người dùng khác); Đó là ngoại lệ duy nhất. Các phông chữ tiêu chuẩn khác là
import argparse
from PyPDF2 import PdfFileMerger

parser = argparse.ArgumentParser(description="Merge multiple pdfs into one pdf")

parser.add_argument('-o','--output')

parser.add_argument('-i','--input', nargs="+")

args = parser.parse_args()
pdfs = args.input

merger = PdfFileMerger()

for pdf in pdfs:
    merger.append(pdf)

merger.write(args.output)
merger.close()
2,
import argparse
from PyPDF2 import PdfFileMerger

parser = argparse.ArgumentParser(description="Merge multiple pdfs into one pdf")

parser.add_argument('-o','--output')

parser.add_argument('-i','--input', nargs="+")

args = parser.parse_args()
pdfs = args.input

merger = PdfFileMerger()

for pdf in pdfs:
    merger.append(pdf)

merger.write(args.output)
merger.close()
3,
import argparse
from PyPDF2 import PdfFileMerger

parser = argparse.ArgumentParser(description="Merge multiple pdfs into one pdf")

parser.add_argument('-o','--output')

parser.add_argument('-i','--input', nargs="+")

args = parser.parse_args()
pdfs = args.input

merger = PdfFileMerger()

for pdf in pdfs:
    merger.append(pdf)

merger.write(args.output)
merger.close()
4 và
import argparse
from PyPDF2 import PdfFileMerger

parser = argparse.ArgumentParser(description="Merge multiple pdfs into one pdf")

parser.add_argument('-o','--output')

parser.add_argument('-i','--input', nargs="+")

args = parser.parse_args()
pdfs = args.input

merger = PdfFileMerger()

for pdf in pdfs:
    merger.append(pdf)

merger.write(args.output)
merger.close()
5.

Bây giờ chúng ta có thể in một ô với ô. Một ô là một khu vực hình chữ nhật, có thể đóng khung, chứa một số văn bản. Nó là đầu ra ở vị trí hiện tại. Chúng tôi chỉ định kích thước của nó, văn bản của nó (giữa hoặc căn chỉnh), nếu nên rút ra biên giới và nơi vị trí hiện tại di chuyển theo nó (bên phải, bên dưới hoặc đến đầu dòng tiếp theo). Để thêm một khung, chúng tôi sẽ làm điều này:

pdf.cell(40, 10, 'Hello World!', 1)

Để thêm một ô mới bên cạnh nó với văn bản tập trung và chuyển sang dòng tiếp theo, chúng tôi sẽ làm:

pdf.cell(60, 10, 'Powered by FPDF.', 0, 1, 'C')

Ghi chú: Việc phá vỡ dòng cũng có thể được thực hiện với LN. Phương pháp này cho phép chỉ định ngoài chiều cao của giờ nghỉ.: the line break can also be done with ln. This method allows to specify in addition the height of the break.

Cuối cùng, tài liệu được đóng và gửi đến trình duyệt với đầu ra. Chúng tôi có thể đã lưu nó trong một tệp bằng cách chuyển tên tệp mong muốn.

THẬN TRỌNG: Trong trường hợp PDF được gửi đến trình duyệt, không có gì khác phải được xuất, không phải trước khi cũng không phải sau (ít không gian hoặc vận chuyển trở lại vấn đề). Nếu bạn gửi một số dữ liệu trước đây, bạn sẽ nhận được thông báo lỗi: "Một số dữ liệu đã được xuất vào trình duyệt, không thể gửi tệp PDF". Nếu bạn gửi sau, trình duyệt của bạn có thể hiển thị một trang trống.: in case when the PDF is sent to the browser, nothing else must be output, not before nor after (the least space or carriage return matters). If you send some data before, you will get the error message: "Some data has already been output to browser, can't send PDF file". If you send after, your browser may display a blank page.

Tiêu đề, chân trang, ngắt trang và hình ảnh

Dưới đây là một ví dụ hai trang với tiêu đề, chân trang và logo:

from fpdf import FPDF

class PDF(FPDF):
    def header(self):
        # Logo
        self.image('logo_pb.png', 10, 8, 33)
        # Arial bold 15
        self.set_font('Arial', 'B', 15)
        # Move to the right
        self.cell(80)
        # Title
        self.cell(30, 10, 'Title', 1, 0, 'C')
        # Line break
        self.ln(20)

    # Page footer
    def footer(self):
        # Position at 1.5 cm from bottom
        self.set_y(-15)
        # Arial italic 8
        self.set_font('Arial', 'I', 8)
        # Page number
        self.cell(0, 10, 'Page ' + str(self.page_no()) + '/{nb}', 0, 0, 'C')

# Instantiation of inherited class
pdf = PDF()
pdf.alias_nb_pages()
pdf.add_page()
pdf.set_font('Times', '', 12)
for i in range(1, 41):
    pdf.cell(0, 10, 'Printing line number ' + str(i), 0, 1)
pdf.output('tuto2.pdf', 'F')

Thử nghiệm

Ví dụ này sử dụng các phương pháp tiêu đề và chân trang để xử lý các tiêu đề và chân trang trang. Chúng được gọi là tự động. Chúng đã tồn tại trong lớp FPDF nhưng không làm gì cả, do đó chúng tôi phải mở rộng lớp và ghi đè chúng.

Logo được in bằng phương thức hình ảnh bằng cách chỉ định góc trên bên trái và chiều rộng của nó. Chiều cao được tính toán tự động để tôn trọng tỷ lệ hình ảnh.

Để in số trang, giá trị null được truyền dưới dạng chiều rộng ô. Điều đó có nghĩa là ô nên mở rộng đến lề phải của trang; Nó là tiện dụng cho văn bản trung tâm. Số trang hiện tại được trả về bằng phương thức page_NO; Đối với tổng số trang, nó thu được bằng giá trị đặc biệt

import argparse
from PyPDF2 import PdfFileMerger

parser = argparse.ArgumentParser(description="Merge multiple pdfs into one pdf")

parser.add_argument('-o','--output')

parser.add_argument('-i','--input', nargs="+")

args = parser.parse_args()
pdfs = args.input

merger = PdfFileMerger()

for pdf in pdfs:
    merger.append(pdf)

merger.write(args.output)
merger.close()
6 sẽ được thay thế khi đóng tài liệu (miễn là đầu tiên bạn gọi là alias_nb_pages). Lưu ý việc sử dụng phương thức SET_Y cho phép đặt vị trí tại một vị trí tuyệt đối trong trang, bắt đầu từ trên cùng hoặc phía dưới.

Một tính năng thú vị khác được sử dụng ở đây: Tria trang tự động. Ngay sau khi một ô sẽ vượt qua giới hạn trong trang (ở mức 2 cm từ dưới cùng theo mặc định), một lần ngắt được thực hiện và phông chữ được khôi phục. Mặc dù tiêu đề và chân trang chọn phông chữ của riêng họ (

import argparse
from PyPDF2 import PdfFileMerger

parser = argparse.ArgumentParser(description="Merge multiple pdfs into one pdf")

parser.add_argument('-o','--output')

parser.add_argument('-i','--input', nargs="+")

args = parser.parse_args()
pdfs = args.input

merger = PdfFileMerger()

for pdf in pdfs:
    merger.append(pdf)

merger.write(args.output)
merger.close()
7), cơ thể vẫn tiếp tục với
import argparse
from PyPDF2 import PdfFileMerger

parser = argparse.ArgumentParser(description="Merge multiple pdfs into one pdf")

parser.add_argument('-o','--output')

parser.add_argument('-i','--input', nargs="+")

args = parser.parse_args()
pdfs = args.input

merger = PdfFileMerger()

for pdf in pdfs:
    merger.append(pdf)

merger.write(args.output)
merger.close()
2. Cơ chế phục hồi tự động này cũng áp dụng cho màu sắc và chiều rộng dòng. Giới hạn mà các trang phá vỡ trang có thể được đặt với set_auto_page_break.

Phá vỡ dòng và màu sắc

Hãy tiếp tục với một ví dụ in các đoạn văn hợp lý. Nó cũng minh họa việc sử dụng màu sắc.

/Users/user_name/Documents/PythonScripts
0

Thử nghiệm

Ví dụ này sử dụng các phương pháp tiêu đề và chân trang để xử lý các tiêu đề và chân trang trang. Chúng được gọi là tự động. Chúng đã tồn tại trong lớp FPDF nhưng không làm gì cả, do đó chúng tôi phải mở rộng lớp và ghi đè chúng.

Logo được in bằng phương thức hình ảnh bằng cách chỉ định góc trên bên trái và chiều rộng của nó. Chiều cao được tính toán tự động để tôn trọng tỷ lệ hình ảnh.

Để in số trang, giá trị null được truyền dưới dạng chiều rộng ô. Điều đó có nghĩa là ô nên mở rộng đến lề phải của trang; Nó là tiện dụng cho văn bản trung tâm. Số trang hiện tại được trả về bằng phương thức page_NO; Đối với tổng số trang, nó thu được bằng giá trị đặc biệt

import argparse
from PyPDF2 import PdfFileMerger

parser = argparse.ArgumentParser(description="Merge multiple pdfs into one pdf")

parser.add_argument('-o','--output')

parser.add_argument('-i','--input', nargs="+")

args = parser.parse_args()
pdfs = args.input

merger = PdfFileMerger()

for pdf in pdfs:
    merger.append(pdf)

merger.write(args.output)
merger.close()
6 sẽ được thay thế khi đóng tài liệu (miễn là đầu tiên bạn gọi là alias_nb_pages). Lưu ý việc sử dụng phương thức SET_Y cho phép đặt vị trí tại một vị trí tuyệt đối trong trang, bắt đầu từ trên cùng hoặc phía dưới.

Cài đặt phần ghi chú

Trước đây, để nhập đối tượng, bạn nên sử dụng gói PYFPDF:

/Users/user_name/Documents/PythonScripts
1

Sau phiên bản 1.7, để nhập nó, bạn nên sử dụng gói FPDF:

/Users/user_name/Documents/PythonScripts
2