这个需求是这样;
有这样一个PDF文件
文件需要打印;
但是打印出来比较费墨;
所以需要变成白底黑字的;
我百度了一下;
没有直接能够操作PDF文字和背景的库;
当然,也许是我没找到;
怎么办呢?
思路一:
我尝试转换成WORD再修改文字及背景;
但效果让我大跌眼镜;
思路二:
先把PDF文件逐页转换成图片;
图片按顺序命名;
第二步把图片进行颜色反转;
第三步按照原顺序把图片组合成PDF文档;
这个方案可行!
代码:
把PDF文件逐页转换成图片
import os
import fitz
file_dir = 'pdf'
def get_file_name(file_dir):
'''
获取指定目录下所有文件名称
:param file_dir:指定目录
:return:返回文件名列表
'''
for root, dirs, files in os.walk(file_dir):
# return root#当前目录路径
# return dirs#当前路径下所有子目录
return files # 当前路径下所有非目录子文件
def conver_img():
for filename in filenames:
# pdf_name = os.path.splitext(pdf)[0]
print(filename)
doc = fitz.open(f'{file_dir}/{filename}')
for pg in range(doc.pageCount):
page = doc[pg]
rotate = int(0)
# 每个尺寸的缩放系数为2,这将为我们生成分辨率提高四倍的图像。
zoom_x = 2.0
zoom_y = 2.0
trans = fitz.Matrix(zoom_x, zoom_y).preRotate(rotate)
pm = page.getPixmap(matrix=trans, alpha=False)
# pm.writePNG('%s.png' % pg)
pm.writePNG(f'jpg/{pg}.jpg')
if __name__ == '__main__':
filenames = get_file_name(file_dir)
print(filenames)
conver_img()
把图片进行颜色反转
import cv2
import numpy as np
# 读取一张图片并保存
def read_img_output2save(path, num):
img = cv2.imread(path, 1) # 读取一张图片,彩色
cha = img.shape
height, width, deep = cha
dst = np.zeros((height, width, 3), np.uint8)
for i in range(height): # 色彩反转
for j in range(width):
b, g, r = img[i, j]
dst[i, j] = (255 - b, 255 - g, 255 - r)
# cv2.imshow('img', img)
# cv2.imshow('dst', dst)
cv2.imwrite(f"save/{num}.jpg", dst)
# cv2.waitKey()
for i in range(60):
path = f'jpg/{i}.jpg'
read_img_output2save(path, num=i)
print(f'保存第{i}张图片成功!')
按照原顺序把图片组合成PDF文档
from PIL import Image
import os
def combine2pdf(folderPath, pdfFilePath):
# files = os.listdir(folderPath)
pngFiles = []
sources = []
for file in range(60):
print(file)
file = f'{file}.jpg'
if 'jpg' in file:
pngFiles.append(folderPath + file)
# pngFiles.sort() # 这里不要选择排序,这种排序是按头一个数字进行排序,会打乱原有顺序
# print(pngFiles[0])
output = Image.open(pngFiles[0])
pngFiles.pop(0)
for file in pngFiles:
pngFile = Image.open(file)
if pngFile.mode == "RGB":
pngFile = pngFile.convert("RGB")
sources.append(pngFile)
output.save(pdfFilePath, "pdf", save_all=True, append_images=sources)
if __name__ == "__main__":
folder = "save/"
pdfFile = "jpg2pdf/contract.pdf"
combine2pdf(folder, pdfFile)