单页pdf直接打印-onenote-在该页右键,另存为图片即可。
多页pdf,期望保存为一张图片,直接可用的都需要money。可通过python库来完成:
import os
from pdf2image import convert_from_path
from PIL import Image, ImageDraw
def pdf_to_images(pdf_path, img_path):
# 转换 PDF 文件为图片
images = convert_from_path(pdf_path)
# 遍历图片列表并保存
paths = []
for i, image in enumerate(images):
filePath = os.path.join(img_path, f"page_{i + 1}.jpg")
if not os.path.exists(img_path):
os.mkdir(img_path)
image.save(filePath, "JPEG")
paths.append(filePath)
return paths
def stitch_images_vertically(image_paths, output_path, line_color="black", line_height=2):
"""
将多张图片垂直拼接为一张长图,并在每页末尾添加分割线
:param image_paths: 图片路径列表
:param output_path: 输出图片的路径
:param line_color: 分割线的颜色,默认为黑色
:param line_height: 分割线的高度,默认为2像素
"""
# 打开所有图片并获取宽度和高度
images = [Image.open(img) for img in image_paths]
widths, heights = zip(*(img.size for img in images))
# 确定拼接后的图片宽度(取最大宽度)和总高度(包括分割线)
total_width = max(widths)
total_height = sum(heights) + line_height * (len(images) - 1)
# 创建一个新的长图
new_image = Image.new('RGB', (total_width, total_height), (255, 255, 255))
draw = ImageDraw.Draw(new_image)
# 将每张图片粘贴到长图中,并在每页末尾添加分割线
y_offset = 0
for img in images[:-1]: # 不在最后一张图片后添加分割线
new_image.paste(img, (0, y_offset))
y_offset += img.height
# 绘制分割线
draw.line([(0, y_offset), (total_width, y_offset)], fill=line_color, width=line_height)
y_offset += line_height
# 粘贴最后一张图片
new_image.paste(images[-1], (0, y_offset))
# 保存长图
new_image.save(output_path)
# 示例调用
image_paths = pdf_to_images("a.pdf", "./outputs")
output_path = "stitched_image_with_lines.png" # 替换为输出图片路径
stitch_images_vertically(image_paths, output_path)
若保存的图片过大,可压缩下。比如:
def compress_image_to_target_size(input_image_path, output_image_path, target_size, step=5):
"""
将图片压缩到指定大小
:param input_image_path: 输入图片路径
:param output_image_path: 输出图片路径
:param target_size: 目标大小(单位:字节)
:param step: 质量调整步长
"""
quality = 95 # 初始质量
while True:
with Image.open(input_image_path) as img:
# 保存图片并调整质量
img.save(output_image_path, quality=quality)
# 检查文件大小
file_size = os.path.getsize(output_image_path)
if file_size <= target_size or quality <= 0:
break
# 调整质量
quality -= step
print(f"图片已压缩到 {file_size / (1024 * 1024):.2f} MB")
# 示例调用
compress_image_to_target_size("stitched_image_with_lines.png", "output.jpg", 2 * 1024 * 1024)