
鄭老師經(jīng)常要整理一些文檔資料發(fā)給學(xué)生學(xué)習(xí),資料都是鄭老師辛辛苦苦整理的,也不希望被濫用,所以,每次發(fā)給學(xué)生的時(shí)候又是加水印,又是轉(zhuǎn)pdf,又是加密,又是希望文本內(nèi)容不可復(fù)制。
以前,都是找各種軟件手動(dòng)點(diǎn)點(diǎn)點(diǎn)弄完的。但是,一旦文檔多了,這種手動(dòng)點(diǎn)點(diǎn)點(diǎn)就顯得有些低效了。
借著這次整理的資料,實(shí)現(xiàn)了上述需求的代碼化,以后多少文檔都可以批量實(shí)現(xiàn)了。
具體來(lái)說(shuō),在我的熏陶下,鄭老師養(yǎng)成了用excel整理資料的習(xí)慣,知道給不同信息內(nèi)容添加字段來(lái)歸類整理。這樣的話,總結(jié)這次的整理需求就是:
- 將excel的內(nèi)容轉(zhuǎn)成帶有水印的word;
- 將word轉(zhuǎn)為pdf;
- 將可編輯的pdf轉(zhuǎn)為圖片式不可復(fù)制的pdf;
- 給pdf加密;
代碼參考來(lái)源:
python-docx 0.8.10 文檔:osgeo.cn/python-docx/python自動(dòng)化辦公——python操做Excel、Word、PDF集合大全:shangmayuan.com/a/9b82fb31500e473f83f46372.html#jump51
【Python】pdf2image模塊+poppler將PDF轉(zhuǎn)換為圖片:blog.csdn.net/sinat_37967865/article/details/102477235
使用Python把Word文檔轉(zhuǎn)換為圖片式不可修改的PDF文件:sohu.com/a/363087337_797291
1. 將excel內(nèi)容轉(zhuǎn)成帶有水印的word
這個(gè)其實(shí)挺好實(shí)現(xiàn)的,用到pandas和python-docx包。
python-docx可以新建文檔,也可以打開(kāi)已有文檔,并寫入或者修改內(nèi)容(不能是空文檔)
所以,可以先新建個(gè)word文檔(如下的muban.docx),把頁(yè)碼啊,水印啊,標(biāo)題樣式啊,一些格式上的問(wèn)題先設(shè)置好,然后,只需要向這個(gè)文檔寫入excel數(shù)據(jù)就行。
以其中一個(gè)文檔為例:
import pandas as pd
from docx import Document
from docx.shared import Inches
# 讀取excel
T2 = pd.read_excel('自己的文檔.xlsx', sheet_name = 'Task2')
# Task2.docx
# 讀取模板muban文檔
document = Document('muban.docx')
# 添加標(biāo)題
document.add_heading('口語(yǔ)Taks2閱讀及聽(tīng)力文稿',0)
# 按行讀取excel內(nèi)容
for n,i in T2.iterrows():
source = i['來(lái)源'].replace('TPO','套題')
rtitle = '閱讀文稿'
reading = i['閱讀']
ltitle = '聽(tīng)力文稿'
listening = i['聽(tīng)力文稿']
# 刪除文本中的空行
lls = listening.split('\n')
while '' in lls:
lls.remove('')
while ' ' in lls:
lls.remove(' ')
listening = '\n'.join(lls)
# 添加一級(jí)標(biāo)題
document.add_heading(source, level = 1)
# 添加二級(jí)標(biāo)題
document.add_heading(rtitle, level = 2)
# 添加文本
reading = document.add_paragraph(reading)
# 添加二級(jí)標(biāo)題
document.add_heading(ltitle, level = 2)
# 添加文本
document.add_paragraph(listening)
# 除了最后一頁(yè),新建一頁(yè)
if n >= 0 and n <= 69:
document.add_page_break()
# 保存文檔
document.save('Task2.docx')
最后生成文檔如下圖所示:

2. 將word轉(zhuǎn)為pdf
將word轉(zhuǎn)為pdf就很好解決了,安裝個(gè)包docx2pdf就行~
from docx2pdf import convert
# word轉(zhuǎn)pdf
convert("Task2.docx")
3. 將可編輯的pdf轉(zhuǎn)為圖片式不可復(fù)制的pdf
這個(gè)步驟就稍微復(fù)雜一些,好在前人栽樹(shù),后人乘涼,改改別人的代碼就行。
主要就是先把pdf文件按照每頁(yè)一張,拆分成圖片;然后,將這些圖片又合并為1個(gè)pdf文件就行。
這里涉及到需要下載并安裝配置poppler,可以參考:blog.csdn.net/sinat_37967865/article/details/102477235
from PyPDF2 import PdfFileReader, PdfFileWriter, PdfFileMerger
from os import remove, listdir, mkdir
from os.path import join, isdir, split, splitext, basename
from reportlab.lib.pagesizes import A4, landscape, portrait
from reportlab.pdfgen import canvas
from pdf2image import convert_from_path
from win32com.client import constants, gencache
# 把pdf文件拆成jpg圖片,每頁(yè)一張
def pdf2jpgs(file):
# 路徑和文件名
dstDir, pdfFn = split(file)
# 當(dāng)前目錄
if not dstDir:
dstDir = pdfFn[:-4]
else:
dstDir = join(dstDir, pdfFn[:-4])
# 創(chuàng)建同名文件夾
if not isdir(dstDir):
mkdir(dstDir)
# 轉(zhuǎn)換圖片,圖片像素dpi為480
images = convert_from_path(pdfFn, dpi = 480, fmt = 'JPEG',
thread_count = 4,
poppler_path = r'D:\path\poppler0680\bin')
# 保存圖片
for index, image in enumerate(images):
print(index,'已經(jīng)保存')
image.save('{}\{}.jpg'.format(dstDir,index))
# 把jpg圖片合并為pdf文件
def merge_jpg2pdf(jpgpath):
# 要合并的圖片
jpg_files = [join(jpgpath, fn) for fn in listdir(jpgpath)
if fn.endswith('.jpg')]
jpg_files.sort(key = lambda fn: int(splitext(basename(fn))[0]))
result_pdf = PdfFileMerger()
# 臨時(shí)文件
temp_pdf = 'temp.pdf'
# 依次轉(zhuǎn)pdf,再合并pdf
for fn in jpg_files:
# 轉(zhuǎn)pdf,portrait縱向頁(yè)面,landscape橫向頁(yè)面
c = canvas.Canvas(temp_pdf, pagesize = portrait(A4))
c.drawImage(fn, 0 , 0, *portrait(A4))
c.save()
# 合并
with open(temp_pdf, 'rb') as fp:
pdf_reader = PdfFileReader(fp)
result_pdf.append(pdf_reader)
# 保存結(jié)果
result_pdf.write(jpgpath+'.pdf')
result_pdf.close
remove(temp_pdf)
if __name__ == '__main__':
# 轉(zhuǎn)圖片
pdf2jpgs('Task2.pdf')
# 圖片合并成pdf
merge_jpg2pdf(r'自己的文件路徑\Task2')
生成的圖片保存在以pdf文件名為名的文件夾里:

生成的圖片式pdf,不可以復(fù)制,但是,需要注意,文檔的大小同時(shí)也增加了,原來(lái)可能就600k的文檔,轉(zhuǎn)成圖片pdf后,就有90M左右了。
當(dāng)然,可以降低下圖片的像素dpi來(lái)減小文件大小。

4. 給pdf加密
最后,就是給pdf加密了,使用PyPDF2包就可以。
如果是可復(fù)制的文字版的pdf,加密起來(lái)很快,但如果是圖片不可復(fù)制的pdf,時(shí)間就會(huì)長(zhǎng)些了。
from PyPDF2 import PdfFileReader, PdfFileWriter
# pdf加密
def add_encrypt(file,password):
pdf_reader = PdfFileReader(file)
pdf_writer = PdfFileWriter()
for page in range(pdf_reader.getNumPages()):
pdf_writer.addPage(pdf_reader.getPage(page))
# 添加密碼
pdf_writer.encrypt(password)
with open(file, "wb") as out:
pdf_writer.write(out)
if __name__ == '__main__':
# 加密pdf
password = 'xueweiguizhengshun'
print('Task2開(kāi)始加密')
add_encrypt('Task2.pdf',password)
結(jié)果如圖所示:

當(dāng)然,這次的文檔內(nèi)容主要是文字,如果有表格或者圖片,可能會(huì)更復(fù)雜一些,但肯定也是能解決的啦~~