目录
给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)
加水印前:

加水印后:

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张图片

- # 将图片文件前后顺序用数字命名
- 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开始命名


- # 合并多个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