这个需求是这样;
有这样一个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)
最终效果

© 版权声明
文章版权归作者所有,未经允许请勿转载。如内容涉嫌侵权,请在本页底部进入<联系我们>进行举报投诉!
THE END


















暂无评论内容