单页pdf直接打印-onenote-在该页右键,另存为图片即可。
多页pdf,期望保存为一张图片,直接可用的都需要money。可通过python库来完成:
import os
from pdf2image import convert_from_path
from PIL import Image, ImageDrawdef 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 pathsdef 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 = 0for 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 -= stepprint(f"图片已压缩到 {file_size / (1024 * 1024):.2f} MB")# 示例调用
compress_image_to_target_size("stitched_image_with_lines.png", "output.jpg", 2 * 1024 * 1024)