基于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
相关产品推荐
相关产品推荐

