目录
1. 加水印
给pdf文件加自定义水印
代码中 msyn.ttf 需要下载下来,然后在代码中指向存放的位置
import os,datetime,fitz
# fitz ==> pip install PyMuPDF==1.18.9
from PyPDF2 import PdfFileReader,PdfFileWriter
from reportlab.lib.units import cm
from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
pdfmetrics.registerFont(TTFont('msyh','./msyh.ttf'))
以上是python操作pdf需要用到的包
创建水印的代码:
# 创建水印
# content: 字符串列表
def create_watermark00(pre_dir,content):
print(content)
'''创建水印'''
# 默认大小为 21cm*29.7cm
file_name = pre_dir+'mark.pdf'
c = canvas.Canvas(file_name,pagesize=(30*cm,30*cm))
# 移动坐标原点(坐标系左下为(0,0))
c.translate(10*cm,5*cm)
# 设置字体
c.setFont('msyh',20)
# 指定描边的颜色
c.setStrokeColorRGB(0,0,0)
# 指定填充颜色
c.setFillColorRGB(0,0,0,0.2)
# 旋转45度,坐标系被旋转
c.rotate(30)
# 画几个文本,注意坐标系旋转的影响
for i in range(5):
for j in range(10):
a = 20*(i-1)
b = 5*(j-2)
for item_i,item_txt in enumerate(content):
c.drawString((a+item_i)*cm,(b-item_i)*cm,item_txt)
# c.drawString(a*cm,b*cm,content)
c.setFillAlpha(0.1)
c.save()
return file_name
添加水印的代码:
# 给pdf添加水印
def add_watermark(pdf_file_in,pdf_file_mark,pdf_file_out):
pdf_output = PdfFileWriter()
input_stream = open(pdf_file_in,'rb')
pdf_input = PdfFileReader(input_stream,strict=False)
# 获取pdf文件的页数
pageNum = pdf_input.getNumPages()
# 读入水印pdf文件
pdf_watermark = PdfFileReader(open(pdf_file_mark,'rb'),strict=False)
# 给每一页打水印
for i in range(pageNum):
page = pdf_input.getPage(i)
page.mergePage(pdf_watermark.getPage(0))
page.compressContentStreams()
pdf_output.addPage(page)
pdf_output.write(open(pdf_file_out,'wb'))
pass
使用:
if __name__ == '__main__':
pdf_file_in = r'E:/temp003/牧原股份_分析.pdf'
pdf_file_out = r'E:/temp003/temp_mark.pdf'
w_list = ['人生若只如初见','何事秋风悲画扇']
pdf_file_mark = create_watermark00(r'E:/temp003/',w_list)
add_watermark(pdf_file_in,pdf_file_mark,pdf_file_out)
加水印前:
加水印后:
2. 将pdf转成一张张图片
pdf有多少页就转成多少张图片
# 将pdf转成图片
def pdf_2_imgs(pdfPath, imagePath):
startTime_pdf2img = datetime.datetime.now() # 开始时间
print("imagePath=" + imagePath)
pdfDoc = fitz.open(pdfPath)
for pg in range(pdfDoc.pageCount):
page = pdfDoc[pg]
rotate = int(0)
# 每个尺寸的缩放系数为1.3,这将为我们生成分辨率提高2.6的图像。
# 此处若是不做设置,默认图片大小为:792X612, dpi=96
zoom_x = 1.33333333 # (1.33333333-->1056x816) (2-->1584x1224)
zoom_y = 1.33333333
mat = fitz.Matrix(zoom_x, zoom_y).preRotate(rotate)
pix = page.getPixmap(matrix=mat, alpha=False)
if not os.path.exists(imagePath): # 判断存放图片的文件夹是否存在
os.makedirs(imagePath) # 若图片文件夹不存在就创建
pix.writePNG(imagePath + '/' + 'images_%s.png' % pg) # 将图片写入指定的文件夹内
endTime_pdf2img = datetime.datetime.now() # 结束时间
print('pdf2img时间=', (endTime_pdf2img - startTime_pdf2img).seconds)
使用:
if __name__ == '__main__':
pdf_path = r'E:/temp003/temp_mark.pdf'
pic_dir = r'E:/temp003/pic/'
pdf_2_imgs(pdf_path,pic_dir)
pdf有42页内容
转成42张图片
3. 多张图片转成一个pdf
# 将图片文件前后顺序用数字命名
def imgs_2_pdf(source_folder,pdfPath):
doc = fitz.open()
file_list = os.listdir(source_folder)
file_map = {}
for item in file_list:
item_arr = item.split('.')
file_map[item_arr[0]] = item
pass
for i in range(len(file_list)):
img = source_folder + file_map[str(i)]
imgdoc = fitz.open(img) # 打开图片
pdfbytes = imgdoc.convertToPDF() # 使用图片创建单页的 PDF
imgpdf = fitz.open("pdf", pdfbytes)
doc.insertPDF(imgpdf) # 将当前页插入文档
doc.save(pdfPath) # 保存pdf文件
doc.close()
使用:
if __name__ == '__main__':
img_dir = r'E:/temp003/pic/'
pdf_path = r'E:/temp003/pic_after.pdf'
imgs_2_pdf(img_dir,pdf_path)
图片的名称需要按照前后顺序从0开始命名
4. 多个pdf合并成一个pdf
# 合并多个pdf文件成一个文件
def merge_pdfs_2_one(file_path,out_file):
output = PdfFileWriter()
outputPages = 0
pdf_fileName = getFileName(file_path)
if pdf_fileName:
for pdf_file in pdf_fileName:
# 读取源pdf文件
input = PdfFileReader(open(pdf_file,'rb'))
pageCount = input.getNumPages()
outputPages += pageCount
# 分别将page添加到输出output中
for iPage in range(pageCount):
output.addPage(input.getPage(iPage))
pass
print('合并后总页数',outputPages)
# 写入到目标pdf文件
outputStream = open(os.path.join(file_path,out_file),'wb')
output.write(outputStream)
outputStream.close()
else:
print('没有可以合并的pdf文件')
pass
pass
# 使用os模块的walk函数,搜索出指定目录下的全部PDF文件
# 获取同一目录下的所有PDF文件的绝对路径
def getFileName(filedir):
file_list = [os.path.join(root, filespath) \
for root, dirs, files in os.walk(filedir) \
for filespath in files \
if str(filespath).endswith('pdf')
]
return file_list if file_list else []
使用:
if __name__ == '__main__':
file_path = r'E:/temp003/temp/'
out_file_name = r'E:/temp003/merge_example.pdf'
merge_pdfs_2_one(file_path,out_file_name)
pass
合并前:
合并后:
附加
msyh.ttf下载地址
链接:https://pan.baidu.com/s/1IBVyKi4prejEtHFbMCuVhw
提取码:urfi