【Python】论文长截图、页面分割、水印去除、整合PDF

有的学校的论文只能在线预览,且存在水印。为保存到本地方便查阅,可以使用以下工作流进行处理:

  1. 用浏览器打开在线论文预览界面;
  2. 使用fastone capture软件截长图;
  3. 将论文按页数进行分割;
  4. 按照阈值消除浅色的背景水印;
  5. 整合为A4尺寸的PDF文件;
  6. 使用WPS将PDF转为OCR版本(可选)。

以下代码为上述流程的第三、四、五步,注释都在代码中,随取随用。

python 复制代码
import os
from PIL import Image
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
import numpy as np

def process_image(input_image_path, output_dir="split_images", total_pages=138, watermark_threshold=230):
    """
    处理图片并生成PDF
    
    Args:
        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_pages
    img = img.resize((width, new_height), Image.Resampling.LANCZOS)
    height = new_height

    # 计算每份高度
    slice_height = height // total_pages
    remaining_height = height % total_pages  # 此时应该为0

    # 分割并保存图片
    image_files = []
    for i in range(total_pages):
        # 计算当前切片的位置
        top = i * slice_height
        bottom = top + slice_height
        if 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_files

def create_pdf(image_files, pdf_file="combined_output.pdf"):
    """
    将图片合并为PDF
    
    Args:
        image_files: 图片文件路径列表
        pdf_file: 输出PDF文件路径
    """
    c = canvas.Canvas(pdf_file, pagesize=A4)
    a4_width, a4_height = A4

    for img_file in image_files:
        img = Image.open(img_file)
        # 计算缩放比例以适应A4纸张
        aspect = img.width / img.height
        if aspect > A4[0] / A4[1]:  # 如果图片太宽
            new_width = a4_width
            new_height = new_width / aspect
        else:  # 如果图片太高
            new_height = a4_height
            new_width = new_height * aspect
        
        # 居中放置图片
        x = (a4_width - new_width) / 2
        y = (a4_height - new_height) / 2
        
        # 添加图片到PDF
        c.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版本,可以直接划取文字。

相关推荐
wjs20243 分钟前
AngularJS HTML DOM
开发语言
取个名字真难呐17 分钟前
随机置矩阵列为0[矩阵乘法pytorch版]
pytorch·python·矩阵
易雪寒22 分钟前
Java大厂面试题之10种分布式ID的生成方案
java·开发语言·分布式
panxin80136 分钟前
矩阵和向量点乘叉乘元素乘
python·矩阵·numpy
树不懒42 分钟前
【js引擎】quickjs 中的两个 proto
开发语言·javascript·原型模式
明天不吃。1 小时前
【JMM】Java 内存模型
java·开发语言
Jackson@ML1 小时前
2025最新版Python 3.13.1安装使用指南
开发语言·python
ByteBlossom6661 小时前
Elixir语言的学习路线
开发语言·后端·golang
Anlici1 小时前
魔搭 AI 框架开发与 LangChain 的结合
人工智能·python·开源