You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Python的Streamlit文件转换应用PDF页面重排功能求助

PDF页面重排功能实现(Streamlit + 最新PDF处理库)

方案一:使用最新版PyPDF2

PyPDF2已更新API替代旧版的PdfFileReader/PdfFileWriter,现在使用PdfReader和PdfWriter即可实现页面重排。

首先升级安装最新版:

pip install --upgrade PyPDF2

完整Streamlit实现代码:

import streamlit as st
from PyPDF2 import PdfReader, PdfWriter
import re

def parse_page_range(input_str):
    # 解析用户输入的页码/范围,转为0索引的页码列表
    pages = []
    for part in input_str.split(','):
        part = part.strip()
        if '-' in part:
            start, end = map(lambda x: int(x.strip())-1, part.split('-'))
            pages.extend(range(start, end+1))
        else:
            pages.append(int(part.strip())-1)
    return pages

st.title("PDF页面重排工具")

# 上传PDF文件
uploaded_file = st.file_uploader("上传PDF文件", type="pdf")

if uploaded_file is not None:
    reader = PdfReader(uploaded_file)
    total_pages = len(reader.pages)
    st.info(f"上传的PDF共{total_pages}页(页码从1开始)")

    # 获取用户输入的页面顺序
    page_order = st.text_input(
        "输入页面顺序(示例:3,1,2,4-6)",
        placeholder="用逗号分隔单个页码或页码范围(如1-5)"
    )

    if st.button("生成重排PDF"):
        if not page_order:
            st.error("请输入页面顺序")
        else:
            try:
                selected_pages = parse_page_range(page_order)
                # 校验页码合法性
                invalid_pages = [p+1 for p in selected_pages if p <0 or p >= total_pages]
                if invalid_pages:
                    st.error(f"页码{','.join(map(str, invalid_pages))}超出范围,允许输入1-{total_pages}")
                else:
                    writer = PdfWriter()
                    for p in selected_pages:
                        writer.add_page(reader.pages[p])
                    
                    # 生成可下载的字节流
                    output_bytes = writer.write_bytes()
                    st.success("重排完成!")
                    st.download_button(
                        label="下载重排后的PDF",
                        data=output_bytes,
                        file_name="重排后的文件.pdf",
                        mime="application/pdf"
                    )
            except ValueError:
                st.error("输入格式错误,请按示例输入(如3,1,2,4-6)")

方案二:使用PyMuPDF(fitz)

若需处理大PDF文件,PyMuPDF(基于C++)的处理速度远快于PyPDF2,适合高性能场景。

安装依赖:

pip install pymupdf

完整Streamlit实现代码:

import streamlit as st
import fitz  # PyMuPDF
import re

def parse_page_range(input_str):
    pages = []
    for part in input_str.split(','):
        part = part.strip()
        if '-' in part:
            start, end = map(lambda x: int(x.strip())-1, part.split('-'))
            pages.extend(range(start, end+1))
        else:
            pages.append(int(part.strip())-1)
    return pages

st.title("PDF页面重排工具")

uploaded_file = st.file_uploader("上传PDF文件", type="pdf")

if uploaded_file is not None:
    doc = fitz.open(stream=uploaded_file.read(), filetype="pdf")
    total_pages = len(doc)
    st.info(f"上传的PDF共{total_pages}页(页码从1开始)")

    page_order = st.text_input(
        "输入页面顺序(示例:3,1,2,4-6)",
        placeholder="用逗号分隔单个页码或页码范围(如1-5)"
    )

    if st.button("生成重排PDF"):
        if not page_order:
            st.error("请输入页面顺序")
        else:
            try:
                selected_pages = parse_page_range(page_order)
                invalid_pages = [p+1 for p in selected_pages if p <0 or p >= total_pages]
                if invalid_pages:
                    st.error(f"页码{','.join(map(str, invalid_pages))}超出范围,允许输入1-{total_pages}")
                else:
                    new_doc = fitz.open()
                    for p in selected_pages:
                        new_doc.insert_pdf(doc, from_page=p, to_page=p)
                    
                    output_bytes = new_doc.write()
                    new_doc.close()
                    doc.close()
                    st.success("重排完成!")
                    st.download_button(
                        label="下载重排后的PDF",
                        data=output_bytes,
                        file_name="重排后的文件.pdf",
                        mime="application/pdf"
                    )
            except ValueError:
                st.error("输入格式错误,请按示例输入(如3,1,2,4-6)")

说明

  • 两种方案均支持单个页码(如3)和连续页码范围(如4-6)的混合输入
  • 输入页码以1为起始,代码内部自动转为0索引适配PDF库的API
  • 方案一适合小文件,无需额外依赖;方案二适合大文件,处理效率更高

内容的提问来源于stack exchange,提问作者Ravi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 21:13:18