【Python實(shí)戰(zhàn)】生成圖片式不可復(fù)制的pdf文件

ocean-3605547_1920.jpg

鄭老師經(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é)這次的整理需求就是:

  1. 將excel的內(nèi)容轉(zhuǎn)成帶有水印的word;
  2. 將word轉(zhuǎn)為pdf歇盼;
  3. 將可編輯的pdf轉(zhuǎn)為圖片式不可復(fù)制的pdf舔痕;
  4. 給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)的,用到pandaspython-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')

最后生成文檔如下圖所示:

excel2word.png

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文件名為名的文件夾里:

pdf2jpg.png

生成的圖片式pdf,不可以復(fù)制验懊,但是擅羞,需要注意,文檔的大小同時(shí)也增加了义图,原來(lái)可能就600k的文檔减俏,轉(zhuǎn)成圖片pdf后,就有90M左右了碱工。

當(dāng)然娃承,可以降低下圖片的像素dpi來(lái)減小文件大小。

jpg2pdf.png

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é)果如圖所示:

encrypt.png

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末竖共,一起剝皮案震驚了整個(gè)濱河市蝙叛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌公给,老刑警劉巖借帘,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蜘渣,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡肺然,警方通過(guò)查閱死者的電腦和手機(jī)蔫缸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)际起,“玉大人拾碌,你說(shuō)我怎么就攤上這事〗滞” “怎么了校翔?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)灾前。 經(jīng)常有香客問(wèn)我防症,道長(zhǎng),這世上最難降的妖魔是什么哎甲? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任告希,我火速辦了婚禮,結(jié)果婚禮上烧给,老公的妹妹穿的比我還像新娘燕偶。我一直安慰自己,他們只是感情好础嫡,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布指么。 她就那樣靜靜地躺著,像睡著了一般榴鼎。 火紅的嫁衣襯著肌膚如雪伯诬。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 48,970評(píng)論 1 284
  • 那天巫财,我揣著相機(jī)與錄音盗似,去河邊找鬼。 笑死平项,一個(gè)胖子當(dāng)著我的面吹牛赫舒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播闽瓢,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼接癌,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了扣讼?” 一聲冷哼從身側(cè)響起缺猛,我...
    開(kāi)封第一講書(shū)人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后荔燎,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體耻姥,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年有咨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了咏闪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡摔吏,死狀恐怖鸽嫂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情征讲,我是刑警寧澤据某,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站诗箍,受9級(jí)特大地震影響癣籽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜滤祖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一筷狼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧匠童,春花似錦埂材、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至扬绪,卻和暖如春竖独,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背挤牛。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工莹痢, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人墓赴。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓竞膳,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親竣蹦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子顶猜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345