鄭老師經(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)已有文檔,并寫(xiě)入或者修改內(nèi)容(不能是空文檔)
所以氮惯,可以先新建個(gè)word文檔(如下的muban.docx)叮雳,把頁(yè)碼啊,水印啊妇汗,標(biāo)題樣式啊帘不,一些格式上的問(wèn)題先設(shè)置好,然后杨箭,只需要向這個(gè)文檔寫(xiě)入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ù)雜一些,但肯定也是能解決的啦~~