<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
pip install PyPDF2
import os from PyPDF2 import PdfFileReader as pr from PyPDF2 import PdfFileWriter as pw def write_watermark(watermark_pdf_path: str, target_pdf_path: str): result_pdf = pw() pdf_file_name = os.path.basename(target_pdf_path) f_target = open(target_pdf_path, 'rb') f_watermark = open(watermark_pdf_path, 'rb') target_pdf = pr(f_target) watermark_page = pr(f_watermark).getPage(0) for page in range(target_pdf.getNumPages()): try: # 這一段try except是一個讓我超級麻煩的bug,讓我解決了一天。 target_pdf.getPage(page).mergePage(watermark_page) result_pdf.addPage(target_pdf.getPage(page)) except Exception as e: result_pdf.addPage(watermark_page) if not os.path.exists("output"): os.makedirs("output") result_pdf.write(open("output/已新增水印_" + pdf_file_name, 'wb')) f_target.close() f_watermark.close() def folder_pdf_files(folder: str) -> list[str]: # 一個資料夾裡面有多少pdf檔案 file_list = [] for a, b, c in os.walk(folder): if b == []: for filename in c: if filename[-3:].lower() == 'pdf': file_path = os.path.join(a, filename) file_list.append(file_path) print(folder, ": 有", len(file_list), "個pdf檔案") return file_list def group_write_watermark(path_array: list[str], watermark_pdf_path: str): # 一組pdf檔案新增水印 for pdf_path in path_array: print(pdf_path, "新增水印中...") write_watermark(watermark_pdf_path, pdf_path) print("完成") if __name__ == '__main__': watermark_pdf_path = "水印檔案.pdf" folder_pdf = "目錄" # 需要新增水印的pdf的目錄 pdf_list = folder_pdf_files(folder_pdf) group_write_watermark(pdf_list, watermark_pdf_path)
UnicodeEncodeError: ‘latin-1’ codec can’t encode characters in position 8-9: ordinal not in range(256)
如果出現該錯誤,可以參考以下內容。
報錯資訊
‘latin-1’ codec can’t encode characters in position 8-11: ordinal not in range(256)
通常這情況是出現了中文字元編碼問題
以下是使用pypdf2複製 pdf 時報錯資訊
//報錯資訊 <ipython-input-1-4f7e1b354328> in <module>() 14 output.addPage(p) 15 with open('D:\Program Files\2.pdf', 'wb') as f: ---> 16 output.write(f) D:Program Files (x86)anacondalibsite-packagesPyPDF2pdf.py in write(self, stream) 499 md5_hash = md5(key).digest() 500 key = md5_hash[:min(16, len(self._encrypt_key) + 5)] --> 501 obj.writeToStream(stream, key) 502 stream.write(b_("nendobjn")) 503 D:Program Files (x86)anacondalibsite-packagesPyPDF2generic.py in writeToStream(self, stream, encryption_key) 547 key.writeToStream(stream, encryption_key) 548 stream.write(b_(" ")) --> 549 value.writeToStream(stream, encryption_key) 550 stream.write(b_("n")) 551 stream.write(b_(">>")) D:Program Files (x86)anacondalibsite-packagesPyPDF2generic.py in writeToStream(self, stream, encryption_key) 470 471 def writeToStream(self, stream, encryption_key): --> 472 stream.write(b_(self)) 473 474 def readFromStream(stream, pdf): D:Program Files (x86)anacondalibsite-packagesPyPDF2utils.py in b_(s) 236 return s 237 else: --> 238 r = s.encode('latin-1') 239 if len(s) < 2: 240 bc[s] = r UnicodeEncodeError: 'latin-1' codec can't encode characters in position 8-11: ordinal not in range(256)
1、修改pypdf2包中的generic.py檔案
由於我使用的是anaconda,路徑為anacondaLibsite-packagesPyPDF2generic.py
generic.py檔案第488行原文
try: return NameObject(name.decode('utf-8')) except (UnicodeEncodeError, UnicodeDecodeError) as e: # Name objects should represent irregular characters # with a '#' followed by the symbol's hex number if not pdf.strict: warnings.warn("Illegal character in Name Object", utils.PdfReadWarning) return NameObject(name) else: raise utils.PdfReadError("Illegal character in Name Object")
改成
try: return NameObject(name.decode('utf-8')) except (UnicodeEncodeError, UnicodeDecodeError) as e: try: return NameObject(name.decode('gbk')) except (UnicodeEncodeError, UnicodeDecodeError) as e: # Name objects should represent irregular characters # with a '#' followed by the symbol's hex number if not pdf.strict: warnings.warn("Illegal character in Name Object", utils.PdfReadWarning) return NameObject(name) else: raise utils.PdfReadError("Illegal character in Name Object")
2、修改pypdf2包中的utils.py檔案
utils.py238行原文
r = s.encode('latin-1') if len(s) < 2: bc[s] = r return r
修改為
try: r = s.encode('latin-1') if len(s) < 2: bc[s] = r return r except Exception as e: print(s) r = s.encode('utf-8') if len(s) < 2: bc[s] = r return r
問題解決
此程式碼的創新點在於可以實現資料夾遍歷新增水印。
其實第一點也沒有什麼,我感覺我最有成功感的就是write_watermark函數裡那段try except語句處,這個一段程式碼解決pdf空白頁而傳送的錯誤。解決了一天,網路上都沒有解決方法。我摸著石頭過河。
有一個問題就是,這個程式碼對於圖片pdf的水印效果不好,因為圖片pdf的也頁面大小比普通的文字pdf大一些,難以控制水印的位置。我想的是在建立水印pdf的時候就把pdf的大小放大。
到此這篇關於Python實現為pdf新增水印功能的文章就介紹到這了,更多相關Python pdf水印內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45