sách gpt4 ăn đã đi

Giải thích mã chi tiết về cách sử dụng pypdf2 để hợp nhất, phân tách và mã hóa các tệp PDF trong Python

In lại Tác giả: qq735679552 Thời gian cập nhật: 28-09-2022 22:32:09 28 4
mua khóa gpt4 giày nike

CFSDN nhấn mạnh vào giá trị tạo ra nguồn mở và chúng tôi cam kết xây dựng nền tảng chia sẻ tài nguyên để mọi nhân viên CNTT có thể tìm thấy thế giới tuyệt vời của bạn tại đây.

Bài viết blog CFSDN này sử dụng pypdf2 để hợp nhất, phân tách và mã hóa các tệp PDF trong Python. Các chi tiết mã được tác giả sưu tầm và biên soạn. Nếu bạn quan tâm đến bài viết này, hãy nhớ thích nó.

Một người bạn cần chia nhỏ một tệp pdf Sau khi tìm kiếm trên Internet, anh ấy thấy rằng pypdf2 có thể hoàn thành các thao tác này nên đã nghiên cứu thư viện này và lập một số hồ sơ. Trước hết, pypdf2 là phiên bản python3 Có thư viện pypdf tương ứng trong 2 phiên bản trước.

Bạn có thể cài đặt trực tiếp bằng pip:

pip cài đặt pypdf2 。

Tài liệu chính thức: pythonhosted.org/pypdf2/.

Chủ yếu có các loại sau:

  。

trình đọc file pdf.

Lớp này chủ yếu cung cấp các thao tác đọc tệp PDF và phương pháp xây dựng của nó là:

?
1
pdffilereader(stream, nghiêm ngặt = đúng, cảnh báo nhất = không có, ghi đè cảnh báo = ĐÚNG VẬY)

Tham số đầu tiên có thể được truyền trong luồng tệp hoặc đường dẫn tệp. Ba tham số tiếp theo được sử dụng để đặt phương thức xử lý cảnh báo, chỉ sử dụng các tham số mặc định.

Sau khi lấy phiên bản, bạn có thể thực hiện một số thao tác trên pdf. Các hoạt động chính như sau:

  • giải mã (mật khẩu): Nếu tệp pdf được mã hóa, bạn có thể sử dụng phương pháp này để giải mã nó.
  • getdocumentinfo(): Lấy một số thông tin về file pdf. Giá trị trả về là loại thông tin tài liệu Nếu xuất trực tiếp, bạn sẽ nhận được thông tin tương tự như sau:
?
1
{ '/ngày sửa đổi' : "ngày:20150310202949-07'00'" , '/tiêu đề' : ' ', ' / người sáng tạo ': ' latex với gói hyperref ', ' / ngày tạo ': "d:20150310202949-07' 00 "", / ptex.fullbanner ': ' cái này pdftex, phiên bản 3.14159265 - 2.6 - 1,40 . 15 (tex trực tiếp 2014 / macports 2014_6 ) phiên bản kpathsea 6.2 . 0 ', ' / nhà sản xuất ': ' pdftex - 1,40 . 15 ', ' / từ khóa ': ' ', ' / bị mắc kẹt ': ' / SAI ', ' / author ': ' ', ' / chủ thể ': ' '}
  • getnumpages(): Lệnh này sẽ lấy số trang trong file pdf.
  • getpage(pagenumber): sẽ lấy đối tượng trang tương ứng với số trang trong file pdf và giá trị trả về là thể hiện của pageobject. Sau khi lấy phiên bản pageobject, bạn có thể thêm, chèn và các thao tác khác.
  • getpagenumber(page): Ngược lại với phương pháp trên, bạn có thể chuyển vào phiên bản pageobject và sau đó lấy số trang của tệp pdf chứa phiên bản đó.
  • getoutlines(node=none, Outlines=none): Truy xuất các đường viền tài liệu xuất hiện trong tài liệu.
  • isencrypted: ghi lại xem pdf có được mã hóa hay không. Nếu bản thân tệp được mã hóa, true sẽ được trả về ngay cả sau khi sử dụng phương thức giải mã.
  • numpages: Tổng số trang trong pdf, tương đương với việc truy cập thuộc tính chỉ đọc của getnumpages().

trình soạn thảo pdf.

Lớp này hỗ trợ các thao tác ghi trên tệp pdf, thường sử dụng pdffilereader để đọc một số dữ liệu pdf và sau đó sử dụng lớp này để thực hiện một số thao tác.

Không có tham số nào được yêu cầu khi tạo một thể hiện của lớp này.

Các phương pháp chính là:

  • addattachment(fname, fdata): Thêm file vào pdf.
  • addblankpage(width=none, Height=none): Thêm một trang trống vào cuối pdf. Nếu kích thước không được chỉ định, kích thước của trang cuối cùng của pdf trong weiter hiện tại sẽ được sử dụng.
  • addpage(page): Thêm trang vào pdf. Thông thường, người đọc ở trên sẽ lấy được trang này.
  • appendpagesfromreader(reader, after_page_append=none): Sao chép dữ liệu trong trình đọc sang phiên bản trình ghi hiện tại và nếu after_page_append được chỉ định, cuối cùng trả về hàm và chuyển dữ liệu trong trình ghi vào đó.
  • Encrypt(user_pwd, owner_pwd=none, use_128bit=true): Mã hóa pdf. Về mặt chính thức, userpwd cho phép người dùng mở file pdf với một số quyền hạn chế. Tức là có thể có một số hạn chế khi sử dụng mật khẩu này, nhưng tôi thì không. quyền thiết lập trông giống như trong tài liệu. Ownerpwd cho phép người dùng sử dụng nó mà không bị hạn chế. Tham số thứ ba là có sử dụng mã hóa 128 bit hay không.
  • getnumpages(): Lấy số trang pdf.
  • getpage(pagenumber): Lấy trang tương ứng với số trang, là đối tượng pageobject Bạn có thể sử dụng phương thức addpage ở trên để thêm trang.
  • Insertpage(page, index=0): Thêm trang vào pdf, chỉ mục xác định vị trí được chèn.
  • write(stream): Ghi nội dung của writer này vào file.

pdffilemerger.

Lớp này được sử dụng để hợp nhất các tệp PDF. Phương thức xây dựng của lớp này có một tham số: pdffilemerger(strict=true). Lưu ý rằng các tham số ở đây sẽ được giới thiệu sau:

Các phương pháp thường được sử dụng:

  • addbookmark(title, pagenum, parent=none): Thêm dấu trang vào pdf, tiêu đề là tiêu đề của dấu trang và pagenum là trang được dấu trang trỏ đến.
  • chắp thêm(fileobj, bookmark=none, pages=none, import_bookmarks=true): Thêm tệp fileobj được chỉ định vào cuối tệp. Dấu trang trước khi các Trang có thể sử dụng (bắt đầu, dừng[, bước]) hoặc một phạm vi trang. . Đặt để thêm các trang trong phạm vi được chỉ định trong fileobj.
  • merge(position, fileobj, bookmark=none, pages=none, import_bookmarks=true): Tương tự như phương thức chắp thêm, nhưng bạn có thể sử dụng tham số vị trí để chỉ định vị trí đã thêm.
  • write(fileobj): Ghi dữ liệu vào file.

Khi sử dụng nó, bạn có thể tạo một phiên bản pdffilemerger, sau đó sử dụng chức năng chắp thêm hoặc hợp nhất để thêm các tệp pdf bạn muốn hợp nhất theo trình tự và cuối cùng sử dụng tính năng ghi để lưu nó.

?
1
2
3
4
5
6
7
8
9
10
11
12
định nghĩa hợp nhất_pdf():
   #Tạo một phiên bản để hợp nhất các tệp
   pdf_sáp nhập = pdffilemerger()
 
   # Trước tiên hãy thêm tệp week1_1.pdf
   pdf_merger.append( 'tuần1_1.pdf' )
   # Sau đó thêm file ex1.pdf vào sau trang 0
   pdf_merger. hợp nhất( 0 , 'ex1.pdf' )
   # Thêm dấu trang
   pdf_merger.addbookmark( 'Đây là một dấu trang' , 1 )
   #Viết nó vào tập tin
   pdf_merger.viết( 'merge_pdf.pdf' )

Chúng ta hãy xem tham số này trong pdffilemerger(strict=true):

Giải thích chính thức về tham số này:

strict (bool) – xác định xem người dùng có nên được cảnh báo về tất cả các vấn đề hay không và cũng khiến một số vấn đề có thể khắc phục được trở nên nghiêm trọng. mặc định là true.

Xác định xem người dùng có nên được cảnh báo về tất cả các vấn đề và cũng có thể gây ra một số vấn đề có thể khắc phục được hay không.

Lúc đầu, tôi cảm thấy rằng tham số này được sử dụng để cảnh báo người dùng về một số lỗi và tôi chỉ có thể sử dụng mặc định. Tuy nhiên, khi tôi cố gắng hợp nhất các tệp PDF với ký tự tiếng Trung, đã xảy ra lỗi sau:

?
1
2
3
4
5
6
7
8
traceback (cuộc gọi gần đây nhất cuối cùng):
  tài liệu "i:\python3.5\lib\site-packages\pypdf2\generic.py" , đường kẻ 484 , TRONG đọctừdòng
   trở lại tênđối tượng(tên.giải mã( 'utf-8' ))
unicodedecodeerror: 'utf-8' codec không thể giải mã byte 0xc8 TRONG chức vụ 10 : byte tiếp tục không hợp lệ
 
trong quá trình xử lý ngoại lệ trên, một ngoại lệ khác đã xảy ra:
 
pypdf2.utils.pdfreaderror: ký tự không hợp lệ TRONG tên sự vật

Đã xảy ra lỗi khi sử dụng giải mã utf trong gói mã nguồn. Tôi đã cố sửa đổi mã nguồn ở đây để sử dụng gbk nhưng cũng xảy ra lỗi khác. Cuối cùng, tôi thấy rằng khi nghiêm ngặt được đặt thành sai trong hàm tạo, lỗi sau sẽ được in trên bảng điều khiển:

pdfreadwarning: ký tự không hợp lệ trong tên đối tượng [generic.py:489] 。

Nhưng hai tệp đã được hợp nhất thành công và tôi đã kiểm tra nhanh rằng tệp được hợp nhất đôi khi tốt hoặc xấu. Cùng một mã được chạy nhiều lần và đôi khi nó có thể xử lý tiếng Trung bình thường, nhưng đôi khi tiếng Trung bị cắt xén.

Ngoài các phương pháp được liệt kê, còn có các phương pháp khác, chẳng hạn như thêm dấu trang, thêm liên kết, v.v. Bạn có thể tham khảo tài liệu chính thức.

Hợp nhất, phân tách và mã hóa các tệp PDF.

Các ví dụ tích hợp về mã hóa, giải mã, hợp nhất, chia tách dựa trên số trang và chia tách dựa trên số lượng bản sao:

Lưu ý khi sử dụng: Nếu là file tiếng Trung thì kết quả chạy có thể bị sai lệch nhưng nếu chạy vài lần sẽ xảy ra vấn đề tiếng Trung hiển thị bình thường. Nguyên nhân cụ thể thì không rõ ràng nhưng lại rất bí ẩn. . .

Cổng mã.

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
# @time : 2018/3/26 23:48
# @tác giả: leafage
# @tệp : handlepdf.py
# @phần mềm: pycharm
# @describe: Thực hiện các thao tác gộp, tách, mã hóa trên file pdf.
từ pypdf2 nhập khẩu pdffilereader, pdffilemerger, pdffilewriter
định nghĩa get_reader(tên tệp, mật khẩu):
   thử :
     tập tin cũ = mở (tên tệp, 'rb' )
   ngoại trừ ioerror là lỗi:
     in ( 'Mở tập tin không thành công! ' + đường (lầm))
     trở lại không có
   #Tạo phiên bản đọc
   trình đọc pdf = pdffilereader(tệp_cũ, nghiêm ngặt = SAI)
   # Hoạt động giải mã
   nếu như pdf_reader.isencrypted:
     nếu như mật khẩu không có:
       in ( '%s file được mã hóa và yêu cầu mật khẩu! ' % tên tập tin)
       trở lại không có
     khác :
       nếu như pdf_reader.decrypt(mật khẩu) ! = 1 :
         in ( '%sMật khẩu sai! ' % tên tập tin)
         trở lại không có
   nếu như tập tin cũ TRONG người dân địa phương ():
     old_file. đóng()
   trở lại trình đọc pdf
định nghĩa encrypt_pdf(tên_tệp, mật_khẩu_mới, mật_khẩu_cũ = không có, tên_tệp_được_mã_hóa = không có):
   """
   Mã hóa tệp tương ứng với tên tệp và tạo tệp mới
   :param filename: Đường dẫn tương ứng với file
   :param new_password: Mật khẩu dùng để mã hóa file
   :param old_password: Nếu file cũ được mã hóa thì cần phải có mật khẩu
   :param mã hóa_filename: Tên tệp được mã hóa, sử dụng filename_encrypted khi bỏ qua;
   :trở lại:
   """
   #Tạo một phiên bản trình đọc
   trình đọc pdf = get_reader(tên_tệp, mật_khẩu_cũ)
   nếu như trình đọc pdf không có:
     trở lại
   #Tạo một thể hiện của thao tác ghi
   pdf_writer = pdffilewriter()
   # Ghi dữ liệu từ reader trước tới writer
   pdf_writer.appendpagesfromreader(pdf_reader)
   # Mã hóa lại bằng mật khẩu mới
   pdf_writer.encrypt(mật_khẩu_mới)
   nếu như tên_tệp_đã_mã_hóa không có:
     # Sử dụng tên tệp cũ + được mã hóa thành tên tệp mới
     tên_tệp_đã_mã_hóa = "".join(tên tệp.chia tách( '.' )[: - 1 ]) + '_' + 'được mã hóa' + '.pdf'
   pdf_writer.viết( mở (tên_tệp_được_mã_hóa, 'wb' ))
định nghĩa giải mã_pdf(tên_tệp, mật khẩu, tên_tệp đã giải mã = không có):
   """
   Ngược dòng giải mã tệp được mã hóa và tạo tệp pdf không có mật khẩu
   :param filename: tệp pdf được mã hóa gốc
   :param pass: mật khẩu tương ứng
   :param decrypted_filename: tên file được giải mã
   :trở lại:
   """
   # Tạo trình đọc và trình ghi
   trình đọc pdf = get_reader(tên tệp, mật khẩu)
   nếu như trình đọc pdf không có:
     trở lại
   nếu như không pdf_reader.isencrypted:
     in ( 'Tệp không được mã hóa, không cần thực hiện hành động nào! ' )
     trở lại
   pdf_writer = pdffilewriter()
   pdf_writer.appendpagesfromreader(pdf_reader)
   nếu như tên_tệp_giải_giải_giải không có:
     tên_tệp_giải_giải_giải = "".join(tên tệp.chia tách( '.' )[: - 1 ]) + '_' + 'đã giải mã' + '.pdf'
   #Viết tập tin mới
   pdf_writer.viết( mở (tên_tệp đã giải mã, 'wb' ))
định nghĩa split_by_pages(tên tệp, trang, mật khẩu = không có):
   """
   Chia file đều theo số trang
   :param filename: tên file cần chia
   :param pages: Số trang tương ứng với mỗi file sau khi tách
   :param pass: Nếu file bị mã hóa thì cần phải giải mã
   :trở lại:
   """
   # Nhận người đọc
   trình đọc pdf = get_reader(tên tệp, mật khẩu)
   nếu như trình đọc pdf không có:
     trở lại
   # Lấy tổng số trang
   số trang = pdf_reader.numpages
   nếu như trang < = 1 :
     in ( 'Mỗi tài liệu phải lớn hơn 1 trang! ' )
     trở lại
   # Lấy số trang của mỗi file pdf sau khi chia tách
   pdf_num = số trang / / trang + 1 nếu như số trang % trang khác số nguyên (số trang / trang)
   in ( 'File pdf được chia thành %d phần, mỗi phần có %d trang! ' % (pdf_num, trang))
   # Tạo tập tin pdf theo trình tự
   tại sao_pdf_num TRONG phạm vi ( 1 , pdf_num + 1 ):
     # Tạo một instance ghi mới
     pdf_writer = pdffilewriter()
     # Tạo tên file tương ứng
     tách_tên_pdf = "".join(tên tệp)[: - 1 ] + '_' + đường (cur_pdf_num) + '.pdf'
     # Tính vị trí bắt đầu hiện tại
     bắt đầu = trang * (cur_pdf_num - 1 )
     # Tính vị trí cuối cùng. Nếu là bản sao cuối cùng, hãy trả về trực tiếp số trang cuối cùng. Nếu không, hãy sử dụng số trang trên mỗi bản sao * số lượng tệp được chia.
     kết thúc = trang * tại sao_pdf_num nếu như tại sao_pdf_num ! = pdf_num khác số trang
     # in(chuỗi(bắt đầu) + ',' + chuỗi(kết thúc))
     # Đọc theo thứ tự số trang tương ứng
     Tôi TRONG phạm vi (bắt đầu, kết thúc):
       pdf_writer.addpage(pdf_reader.getpage(i))
     #Ghi vào tập tin
     pdf_writer.viết( mở (tên_tách_pdf, 'wb' ))
định nghĩa split_by_num(tên tệp, số, mật khẩu = không có):
   """
   Chia tập tin pdf thành nhiều phần
   :param tên tệp: tên tệp
   :param nums: số phần được chia thành
   :param pass: Nếu cần giải mã thì nhập mật khẩu
   :trở lại:
   """
   trình đọc pdf = get_reader(tên tệp, mật khẩu)
   nếu như không trình đọc pdf:
     trở lại
   nếu như số < 2 :
     in ( 'Số lượng bản sao không thể ít hơn 2! ' )
     trở lại
   # Lấy tổng số trang trong pdf
   trang = pdf_reader.numpages
   nếu như trang < số:
     in ( 'Số lượng bản sao không được lớn hơn tổng số trang trong pdf! ' )
     trở lại
   # Tính xem mỗi bản sẽ có bao nhiêu trang
   mỗi_pdf = trang / / con số
   in ( 'pdf có tổng cộng %d trang, chia thành %d phần, mỗi phần có %d trang! ' % (trang, số, each_pdf))
   trong một TRONG phạm vi ( 1 , con số + 1 ):
     pdf_writer = pdffilewriter()
     # Tạo tên file tương ứng
     tách_tên_pdf = "".join(tên tệp)[: - 1 ] + '_' + đường (số) + '.pdf'
     # Tính vị trí bắt đầu hiện tại
     bắt đầu = mỗi_pdf * (trong một - 1 )
     # Tính vị trí cuối cùng. Nếu là bản sao cuối cùng, hãy trả về trực tiếp số trang cuối cùng. Nếu không, hãy sử dụng số trang trên mỗi bản sao * số lượng tệp được chia.
     kết thúc = mỗi_pdf * trong một nếu như num! = con số khác trang
     in ( đường (bắt đầu) + ',' + đường (kết thúc))
     Tôi TRONG phạm vi (bắt đầu, kết thúc):
       pdf_writer.addpage(pdf_reader.getpage(i))
     pdf_writer.viết( mở (tên_tách_pdf, 'wb' ))
định nghĩa merge_pdf(tên_tệp, tên_đã_hợp_nhất, mật khẩu = không có):
   """
   Chuyển danh sách các tệp và hợp nhất từng tệp một
   :param tên tập tin: danh sách tập tin
   :param mật khẩu: danh sách mật khẩu tương ứng
   :trở lại:
   """
   # Tính xem có bao nhiêu file
   số tập tin = chỉ một (tên tập tin)
   # Lưu ý cần sử dụng tham số false
   pdf_sáp nhập = pdffilemerger(sai)
   Tôi TRONG phạm vi (số tập tin):
     # Lấy mật khẩu
     nếu như mật khẩu không có:
       mật khẩu = không có
     khác :
       mật khẩu = mật khẩu[i]
     trình đọc pdf = get_reader(tên_tệp[i], mật khẩu)
     nếu như không trình đọc pdf:
       trở lại
     # theo mặc định, phần bổ sung được thêm vào cuối
     pdf_merger.append(pdf_reader)
   pdf_merger.viết( mở (tên đã hợp nhất, 'wb' ))
định nghĩa insert_pdf(pdf1, pdf2, insert_num, merged_name, password1 = không có, mật khẩu2 = không có):
   """
   Chèn tất cả các file của pdf2 vào trang Insert_num của pdf1
   :param pdf1: tên tệp pdf1
   :param pdf2: tên tệp pdf2
   :param Insert_num: Số trang được chèn
   :param merge_name: tên file đã hợp nhất
   :param pass1: Mật khẩu tương ứng với pdf1
   :param pass2: Mật khẩu tương ứng với pdf2
   :trở lại:
   """
   pdf1_đọc = lấy_trình_đọc(pdf1, mật khẩu1)
   pdf2_đọc = lấy_trình_đọc(pdf2, mật_khẩu2)
   # Trả lại nếu không mở được
   nếu như không pdf1_đọc hoặc không trình đọc pdf2:
     trở lại
   # Lấy tổng số trang trong pdf1
   pdf1_trang = pdf1_reader.numpages
   nếu như chèn_số < 0 hoặc chèn_số_trang > pdf1:
     in ( 'Vị trí chèn không bình thường. Số trang bạn muốn chèn là: %d. File pdf1 có tổng cộng: %d trang! ' % (insert_num, pdf1_pages))
     trở lại
   # Lưu ý cần sử dụng tham số false vì có thể xuất hiện các ký tự tiếng Trung bị cắt xén.
   m_pdf = pdffilemerger(sai)
   m_pdf.append(pdf1)
   m_pdf.merge(insert_num, pdf2)
   m_pdf.viết( mở (tên đã hợp nhất, 'wb' ))
nếu như __tên__ = = '__chủ yếu__' :
   # mã hóa_pdf('ex1.pdf', 'lá')
   # giải mã_pdf('ex1123_encrypted.pdf', 'lá')
   # chia_bởi_trang('ex1.pdf', 5)
   chia_theo_số( 'ex2.pdf' , 3 )
   # merge_pdf(['ex1.pdf', 'ex2.pdf'], 'merger.pdf')
   # insert_pdf('ex1.pdf', 'ex2.pdf', 10, 'pdf12.pdf')

Tóm tắt.

Trên đây là phần giải thích mã chi tiết về cách sử dụng pypdf2 để hợp nhất, phân tách và mã hóa các tệp PDF trong Python được trình soạn thảo giới thiệu. Nếu bạn có bất kỳ câu hỏi nào, vui lòng để lại tin nhắn cho tôi và trình soạn thảo sẽ giải thích. trả lời bạn trong thời gian. Tôi cũng xin cảm ơn mọi người đã ủng hộ trang web của tôi! .

Nếu bạn thấy bài viết này hữu ích với bạn, vui lòng đăng lại, vui lòng ghi rõ nguồn, xin cảm ơn!

Link gốc: https://juejin.im/post/5ce0eca1e51d4510774a87a6.

Cuối cùng, bài viết này về giải thích mã chi tiết về cách sử dụng pypdf2 để hợp nhất, phân tách và mã hóa các tệp PDF trong Python có ở đây. Python, vui lòng Tìm kiếm các bài viết CFSDN hoặc tiếp tục duyệt các bài viết liên quan. Tôi hy vọng bạn sẽ ủng hộ blog của tôi trong tương lai! .

28 4 0
qq735679552
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress