本帖最后由 生有涯知无涯 于 2020-3-1 12:42 编辑
PDF转曲:把可复制文字PDF文件转为不可复制的图片PDF文件,多用于印刷、出版、设计等行业,目的有增加文件安全性(版权保护)、保持文件不变性(移动到其他电脑后视觉效果不变)等。
由于工作原因,本人经常需要把word文档转为PDF,但是用office自带的“另存为pdf文件”功能得到的pdf文件文字可以复制。百度一番后发现有挺多软件有PDF转曲功能(如adobe acrobat等),但是由于需要转换的文件较多,每次用软件转比较麻烦,并且网上没搜到一键转曲的脚本,所以查资料后写了个一键转曲的python脚本,希望能帮到有类似需求的坛友。注意事项:测试前建议备份一下pdf,此脚本运行后会覆盖源pdf文件!
转换的原理比较简单,即把PDF文件转为一张张图片,然后合并为PDF文件,代码里面注释的很清楚。
看一下效果:
这个脚本效率不高,有可以优化的地方,比如把PDF转为内存中的图片后再直接转回PDF,不用把图片写入本地,这样会快很多。之前尝试过,但没成功,如果哪位做到了麻烦发一下代码,谢谢!
代码如下(此为待优化版):
[Python] 纯文本查看 复制代码 # -*- coding: UTF-8 -*-
#PDF转曲:把可复制文字PDF文件转为不可复制的图片PDF文件 by吾爱破解论坛 生有涯知无涯
import os
import fitz # 需要pip install PyMuPDF
import shutil
def copiableTocrank(zoom_x = 2.5,zoom_y = 2.5):#zoom_x和zoom_y越大,程序运行时间越长,转换后的PDF文件越清晰
full_path = os.path.join(base_path, filename) # 拼接,得到完全限定文件名
srcPDFfilelist = fitz.open(full_path) # 打开一个PDF文件,srcPDFfilelist为Document类型,是一个包含每一页PDF文件的列表
trans = fitz.Matrix(zoom_x, zoom_y)#zoom_x设置图片相对于PDF文件在X轴上的缩放比例,zoom_y设置图片相对于PDF文件在Y轴上的缩放比例
destPDFfile = fitz.open()
if not os.path.exists(temp_path):
os.mkdir(temp_path)
os.chdir(temp_path)
for pg in range(srcPDFfilelist.pageCount):
page = srcPDFfilelist[pg] # 获得第pg页
pm = page.getPixmap(matrix=trans, alpha=False) # 将其转化为光栅文件
new_name = filename[0:-4] # 获取文件名(不包括.pdf后缀)
pngfilename = new_name+str(pg)+".png"
pm.writeImage(pngfilename) # 把图片存入本地临时目录
imgdoc = fitz.open(pngfilename)
pdfbytes = imgdoc.convertToPDF()
singlePDF = fitz.open("pdf", pdfbytes)
destPDFfile.insertPDF(singlePDF)
srcPDFfilelist.close()
os.remove(full_path) #删除原PDF文件
os.chdir(base_path) #切换到其他目录,不占用待删除目录
shutil.rmtree(temp_path) #删除临时目录
destPDFfile.save(full_path) #保存PDF文件到本地
destPDFfile.close()
os.system(full_path) #打开转换后的PDF文件
base_path = "C:\\Users\\office51\\Desktop\\" # 输入要转换的PDF所在的文件夹
temp_path = "E:\\temppng\\"#存放图片的临时目录
filename = "t.pdf" #待转换的PDF文件
copiableTocrank()
2020年3月1日更新=================================
今天上午研究了一下fitz的源码,实现图片不写入本地直接在内存中转换(即PDF→Pixmap→barray→Document→PDF),使性能获得巨大提升,大家可以比较一下两个版本的代码。
代码如下(此为优化版):
[Python] 纯文本查看 复制代码 # -*- coding: UTF-8 -*-
#PDF转曲:把可复制文字PDF文件转为不可复制的图片PDF文件 by吾爱破解论坛 生有涯知无涯
import os
import fitz # 需要pip install PyMuPDF
import shutil
def copiableTocrank(zoom_x = 2.5,zoom_y = 2.5):#zoom_x和zoom_y越大,程序运行时间越长,转换后的PDF文件越清晰
full_path = os.path.join(base_path, filename) # 拼接,得到完全限定文件名
srcPDFfilelist = fitz.open(full_path) # 打开一个PDF文件,srcPDFfilelist为Document类型,是一个包含每一页PDF文件的列表
trans = fitz.Matrix(zoom_x, zoom_y)#zoom_x设置图片相对于PDF文件在X轴上的缩放比例,zoom_y设置图片相对于PDF文件在Y轴上的缩放比例
destPDFfile = fitz.open()
# if not os.path.exists(temp_path):
# os.mkdir(temp_path)
# os.chdir(temp_path)
for pg in range(srcPDFfilelist.pageCount):
page = srcPDFfilelist[pg] # 获得第pg页
pm = page.getPixmap(matrix=trans, alpha=False) # 将其转化为光栅文件
# new_name = filename[0:-4] # 获取文件名(不包括.pdf后缀)
# pngfilename = new_name+str(pg)+".png"
# pm.writeImage(pngfilename) # 把图片存入本地临时目录
# imgdoc = fitz.open(pngfilename)
imgdoc = fitz.open('png',pm.getImageData())
pdfbytes = imgdoc.convertToPDF()
singlePDF = fitz.open("pdf", pdfbytes)
destPDFfile.insertPDF(singlePDF)
srcPDFfilelist.close()
os.remove(full_path) #删除原PDF文件
# os.chdir(base_path) #切换到其他目录,不占用待删除目录
# shutil.rmtree(temp_path) #删除临时目录
destPDFfile.save(full_path) #保存PDF文件到本地
destPDFfile.close()
os.system(full_path) #打开转换后的PDF文件
base_path = "C:\\Users\\office51\\Desktop\\" # 输入要转换的PDF所在的文件夹
#temp_path = "E:\\temppng\\"#存放图片的临时目录
filename = "t.pdf" #待转换的PDF文件
copiableTocrank()
|