有的学校的论文只能在线预览,且存在水印。为保存到本地方便查阅,可以使用以下工作流进行处理:
- 用浏览器打开在线论文预览界面;
- 使用fastone capture软件截长图;
- 将论文按页数进行分割;
- 按照阈值消除浅色的背景水印;
- 整合为A4尺寸的PDF文件;
- 使用WPS将PDF转为OCR版本(可选)。
以下代码为上述流程的第三、四、五步,注释都在代码中,随取随用。
import os
from PIL import Image
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
import numpy as npdef process_image(input_image_path, output_dir="split_images", total_pages=138, watermark_threshold=230):"""处理图片并生成PDFArgs:input_image_path: 输入图片路径output_dir: 输出目录路径total_pages: 总页数watermark_threshold: 水印识别阈值"""# 创建输出文件夹if not os.path.exists(output_dir):os.makedirs(output_dir)# 打开原始图片img = Image.open(input_image_path)width, height = img.size# 计算新的高度(total_pages的整数倍)new_height = ((height + total_pages - 1) // total_pages) * total_pagesimg = img.resize((width, new_height), Image.Resampling.LANCZOS)height = new_height# 计算每份高度slice_height = height // total_pagesremaining_height = height % total_pages # 此时应该为0# 分割并保存图片image_files = []for i in range(total_pages):# 计算当前切片的位置top = i * slice_heightbottom = top + slice_heightif i == total_pages - 1: # 最后一片加上余数bottom += remaining_height# 裁剪图片slice_img = img.crop((0, top, width, bottom))# 去除水印处理img_array = np.array(slice_img)# 设置阈值来识别水印mask = np.all(img_array > watermark_threshold, axis=2)# 将水印区域替换为背景色img_array[mask] = [255, 255, 255] # 替换为白色# 转回PIL图片processed_img = Image.fromarray(img_array)# 保存处理后的切片output_file = os.path.join(output_dir, f"slice_{i+1:03d}.png")processed_img.save(output_file)image_files.append(output_file)return image_filesdef create_pdf(image_files, pdf_file="combined_output.pdf"):"""将图片合并为PDFArgs:image_files: 图片文件路径列表pdf_file: 输出PDF文件路径"""c = canvas.Canvas(pdf_file, pagesize=A4)a4_width, a4_height = A4for img_file in image_files:img = Image.open(img_file)# 计算缩放比例以适应A4纸张aspect = img.width / img.heightif aspect > A4[0] / A4[1]: # 如果图片太宽new_width = a4_widthnew_height = new_width / aspectelse: # 如果图片太高new_height = a4_heightnew_width = new_height * aspect# 居中放置图片x = (a4_width - new_width) / 2y = (a4_height - new_height) / 2# 添加图片到PDFc.drawImage(img_file, x, y, width=new_width, height=new_height)c.showPage()c.save()def main(input_image_path, output_dir="split_images", pdf_file="combined_output.pdf", total_pages=138, watermark_threshold=230):"""主函数Args:input_image_path: 输入图片路径output_dir: 输出目录路径pdf_file: 输出PDF文件路径total_pages: 总页数watermark_threshold: 水印识别阈值"""image_files = process_image(input_image_path, output_dir, total_pages, watermark_threshold)create_pdf(image_files, pdf_file)print("处理完成!")print(f"切片图片保存在: {output_dir}")print(f"PDF文件保存为: {pdf_file}")if __name__ == "__main__":# 示例使用input_path = r"C:\Users\Administrator\Desktop\test\2025-01-06_102531.png"main(input_path)
最后得到的PDF是图片格式的,可以使用WPS转为OCR版本,可以直接划取文字。