【Python实战】生成图片式不可复制的pdf文件

ocean-3605547_1920.jpg

郑老师经常要整理一些文档资料发给学生学习,资料都是郑老师辛辛苦苦整理的,也不希望被滥用,所以,每次发给学生的时候又是加水印,又是转pdf,又是加密,又是希望文本内容不可复制。

以前,都是找各种软件手动点点点弄完的。但是,一旦文档多了,这种手动点点点就显得有些低效了。

借着这次整理的资料,实现了上述需求的代码化,以后多少文档都可以批量实现了。

具体来说,在我的熏陶下,郑老师养成了用excel整理资料的习惯,知道给不同信息内容添加字段来归类整理。这样的话,总结这次的整理需求就是:

  1. 将excel的内容转成带有水印的word;
  2. 将word转为pdf;
  3. 将可编辑的pdf转为图片式不可复制的pdf;
  4. 给pdf加密;

代码参考来源:
python-docx 0.8.10 文档:osgeo.cn/python-docx/

python自动化办公——python操做Excel、Word、PDF集合大全:shangmayuan.com/a/9b82fb31500e473f83f46372.html#jump51

【Python】pdf2image模块+poppler将PDF转换为图片:blog.csdn.net/sinat_37967865/article/details/102477235

使用Python把Word文档转换为图片式不可修改的PDF文件:sohu.com/a/363087337_797291

1. 将excel内容转成带有水印的word

这个其实挺好实现的,用到pandaspython-docx包。

python-docx可以新建文档,也可以打开已有文档,并写入或者修改内容(不能是空文档)

所以,可以先新建个word文档(如下的muban.docx),把页码啊,水印啊,标题样式啊,一些格式上的问题先设置好,然后,只需要向这个文档写入excel数据就行。

以其中一个文档为例:

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')
# 添加标题
document.add_heading('口语Taks2阅读及听力文稿',0)
# 按行读取excel内容
for n,i in T2.iterrows():
    source = i['来源'].replace('TPO','套题')
    rtitle = '阅读文稿'
    reading = i['阅读']
    ltitle = '听力文稿'
    listening = i['听力文稿']
    # 删除文本中的空行
    lls = listening.split('\n')
    while '' in lls:
        lls.remove('')
    while ' ' in lls:
        lls.remove(' ')
    listening = '\n'.join(lls)
    
    # 添加一级标题
    document.add_heading(source, level = 1)
    # 添加二级标题
    document.add_heading(rtitle, level = 2)
    # 添加文本
    reading = document.add_paragraph(reading)
    # 添加二级标题
    document.add_heading(ltitle, level = 2)
    # 添加文本
    document.add_paragraph(listening)
    # 除了最后一页,新建一页
    if n >= 0 and n <= 69:
        document.add_page_break()
# 保存文档
document.save('Task2.docx')

最后生成文档如下图所示:

excel2word.png

2. 将word转为pdf

将word转为pdf就很好解决了,安装个包docx2pdf就行~

from docx2pdf import convert

# word转pdf
convert("Task2.docx")

3. 将可编辑的pdf转为图片式不可复制的pdf

这个步骤就稍微复杂一些,好在前人栽树,后人乘凉,改改别人的代码就行。

主要就是先把pdf文件按照每页一张,拆分成图片;然后,将这些图片又合并为1个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图片,每页一张
def pdf2jpgs(file):
    # 路径和文件名
    dstDir, pdfFn = split(file)
    # 当前目录
    if not dstDir:
        dstDir = pdfFn[:-4]
    else:
        dstDir = join(dstDir, pdfFn[:-4])
    # 创建同名文件夹
    if not isdir(dstDir):
        mkdir(dstDir)
    # 转换图片,图片像素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,'已经保存')
        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()
    # 临时文件
    temp_pdf = 'temp.pdf'

    # 依次转pdf,再合并pdf
    for fn in jpg_files:
        # 转pdf,portrait纵向页面,landscape横向页面
        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)
    # 保存结果
    result_pdf.write(jpgpath+'.pdf')
    result_pdf.close
    remove(temp_pdf)

if __name__ == '__main__':
    # 转图片
    pdf2jpgs('Task2.pdf')
    # 图片合并成pdf
    merge_jpg2pdf(r'自己的文件路径\Task2')

生成的图片保存在以pdf文件名为名的文件夹里:

pdf2jpg.png

生成的图片式pdf,不可以复制,但是,需要注意,文档的大小同时也增加了,原来可能就600k的文档,转成图片pdf后,就有90M左右了。

当然,可以降低下图片的像素dpi来减小文件大小。

jpg2pdf.png

4. 给pdf加密

最后,就是给pdf加密了,使用PyPDF2包就可以。

如果是可复制的文字版的pdf,加密起来很快,但如果是图片不可复制的pdf,时间就会长些了。

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开始加密')
    add_encrypt('Task2.pdf',password)

结果如图所示:

encrypt.png

当然,这次的文档内容主要是文字,如果有表格或者图片,可能会更复杂一些,但肯定也是能解决的啦~~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,264评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,549评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,389评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,616评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,461评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,351评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,776评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,414评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,722评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,760评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,537评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,381评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,787评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,030评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,304评论 1 252
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,734评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,943评论 2 336