Python+pypdf离线分割A3试卷为A4:免费、无损、可批量

发布时间:2026/10/1 12:19:32
Python+pypdf离线分割A3试卷为A4:免费、无损、可批量 打印店里一块钱就能解决一张A3但你要是常年在家给孩子打复习资料就会知道A3试卷才是真正的麻烦学校的模考卷、往年真题、期末大卷老师直接在家长群里丢一个PDF点开一看页面是A3的家里打印机进纸口只有A4宽。硬缩印吧字变成原来的七成扫描版本来就虚印出来孩子做题眉头能拧成麻花。去打印店单子太少还得等。这话题我每年考试季都在家长群里被人追着问今天就一次讲清楚怎么用一套完全免费、完全离线的方式把A3试卷干净地分割成几张A4页面字号一点不变扫描件清晰度一点不丢。目标读者就是老师和家里只有A4打印机的家长。只要电脑能跑Python或者打印机驱动自带海报打印就能直接抄作业。1. 为什么非要把A3试卷拆成A41.1 一张A3恰好等于两张A4缩印才是浪费先把尺寸关系捋明白。A3标准尺寸是297mm × 420mmA4是210mm × 297mm。你仔细看A4的长边297正好等于A3的短边A3的长边420又正好是两张A4的长边叠起来。所以一张横版A3沿长边方向对半切开出来的就是两个标准竖版A4页面数学上严丝合缝。很多人在这一步有个误解以为A3转A4就是把内容按比例缩小。打印驱动里把纸张设成A4、缩放方式选适合页面程序做的事是把297×420的完整内容塞进210×297的框线性尺寸缩小到210÷297≈0.707。也就是说本来10毫米高的字印出来变成7.07毫米。单个字你看着似乎还行但整张卷子密密麻麻的公式、图表、辅助线全挤在一起扫描件再带点噪点孩子做起题来相当费劲。这个0.707不是什么玄学一算就知道缩印有多亏。1.2 绝大多数A3卷子是两张A4拼出来的我翻过大量教研卷和真题卷发现一个规律市面上A3卷子绝大多数是横向排版的双栏卷。左边一栏、右边一栏中间留装订缝。为什么这么排因为老师做卷子时常用Word或WPS把纸张设成A3横向然后分两栏填写本质上就是把A4版面横着拼成了一张大纸。这种卷子沿中心线切切出来的每一半就是原本排版时的一整栏A4内容字号、行距、清晰度全部原样保留。也有竖版A3上下两张A4摞在一起切开以后每页是一个横向A4打印时要旋转方向这种相对少见脚本里我会把两种情况都处理掉。当然也要说个例外如果卷子是A3横向但单栏排版的大字号试卷比如小学低年级的语文写字卷直接对半切可能把句子从中间切开。这种情况更适合用缩放打印而不是分割或者先把版心处理成居中再切。这个坑我在第5节会专门讲。1.3 为什么要死磕免费离线四个字这个需求听着简单真正卡人的是免费离线。网上搜在线拆分PDF工具一抓一大把但每用一次都等于把试卷原稿传到别人服务器上。模考卷、真题卷这东西哪怕不是什么国家机密家长也不愿意满世界乱传。在线工具还有文件大小限制扫描版A3动不动二十多兆免费额度经常只能转10兆以内的转大文件就得开会员还有排队慢、压缩糊、高峰期干脆打不开的状况。离线工具就不一样脚本在自己电脑上跑不联网不注册批量处理几十份也不怕限流这才是长期能用的方案。2. 免费又离线的方案怎么选2.1 在线工具的坑我替你踩过在线分割工具看着方便实际用起来四个现实问题隐私和版权文件必须上传到第三方服务器人家拿你的试卷干什么你完全不可控有些平台明晃晃写着可能用于产品改进试卷再普通也是内容作品传上去总归不踏实。文件大小限制扫描版试卷普遍偏大免费档不够用VIP又太贵。速度不稳定遇到假期高峰期转码排队半小时很正常而你往往是第二天就要用卷子。画质损失部分工具为了转换效率会对页面做重采样切出来分辨率肉眼可见下降本来扫描件就娇贵再压一轮更没法看。我不是说所有在线工具都这样但这一行你很难提前判断倒入一个PDF再下载一个PDF中间发生了什么你根本看不见。2.2 付费软件不是不行是不划算AdAdobe Acrobat Pro有能力做页面拆分甚至能按固定尺寸进行裁剪但它是订阅制一年下来真不便宜只为偶尔打几份试卷这笔账怎么算都不划算。其他一些PDF专业编辑器也有裁剪功能但把一个独立页面裁成两个新页面这种操作绝大多数免费版是锁着的要么给输出加水印要么只能用几天试用期。走了一圈你会发现真正的长期归宿还是下面这两个免费路子。2.3 首选方案Python加pypdf本地坐标级切割我长期自用的是Python pypdf这套组合。pypdf是开源纯Python库专门读写和操作PDF。它能在PDF坐标层面按任意矩形裁剪页面把裁剪结果写成新页面不需要联网、不需要注册也不产生费用。脚本写好后以后只要把PDF往文件夹一丢回车一次几十份卷子全切完。优点放在明面上说100%本地处理文件不进任何服务器切割精度到PDF坐标单位1/72英寸不存在打印之后才发现切歪的情况支持批量处理不受在线工具那种单文件限制不重新压缩任何页面内容扫描件原始清晰度完整保留缺点也有需要装一次Python环境。不过也就装一次的事对完全没用过命令行的朋友来说前十分钟可能有点别扭之后就是复制粘贴的事。2.4 应急方案打印机驱动自带的海报打印如果手头电脑还没装Python又不想为了一两份卷子折腾环境另一个办法是白嫖打印机驱动大部分家用打印机驱动都自带海报打印Poster Printing。这功能本来是用来把一张大图分成多张纸打印、方便拼贴的恰好可以用来把A3横版自动拆成左右两张A4输出。整个过程不传文件、不装额外软件完全是打印机驱动本地的能力。缺点是驱动在两张纸交界处通常会留一小段重叠边方便拼接所以打印出来的左右两页各带一条重复内容要动一下裁纸刀。这个方案的详细步骤放到第4节。2.5 一张表看明白四个方案方案是否免费是否离线隐私安全清晰度上手难度在线分割工具基础免费高级功能收费否文件需上传服务器可能被二次压缩最低Adobe Acrobat Pro订阅制偏贵可以高本地处理无损低但钱包疼Python pypdf脚本完全免费完全离线最高纯本地无损中一次性装环境打印机海报打印免费驱动自带离线高纯本地无明显损失最低但看驱动心情提示想长期批量处理直接选Python方案。打印机驱动里如果有海报打印急用时先救急。两条腿走路任何时候都不慌。3. 实操Python脚本三分钟跑通分割3.1 环境准备装Python、装pypdf不需要你系统学编程三步搞定去Python官网下载Windows安装包安装时记得勾选最下面的Add Python to PATH这步别漏否则命令行找不到python命令。按WinR输入cmd回车打开命令行运行python --version能看到版本号就说明装好了。安装pypdf库执行pip install pypdf看到类似Successfully installed pypdf-4.x.x就是成功了。Mac用户也一样装好Python后用pip3 install pypdf。Linux用户一般自带Python3按发行版装就行。3.2 核心脚本一条条给你拆明白把下面的代码存成split_a3.py放在和你要处理的PDF同一个文件夹里import copy from pypdf import PdfReader, PdfWriter from pypdf.generic import RectangleObject input_pdf input.pdf # 换成你的A3文件名 output_pdf output.pdf # 切割后的新文件名 reader PdfReader(input_pdf) writer PdfWriter() for page in reader.pages: # 读取页面尺寸单位是磅1磅1/72英寸 w float(page.mediabox.width) h float(page.mediabox.height) if w h: # 横版页面左右切成两张A4 left copy.copy(page) left.mediabox RectangleObject((0, 0, w / 2, h)) left.cropbox RectangleObject((0, 0, w / 2, h)) writer.add_page(left) right copy.copy(page) right.mediabox RectangleObject((w / 2, 0, w, h)) right.cropbox RectangleObject((w / 2, 0, w, h)) writer.add_page(right) else: # 竖版页面上下切成两张横版A4 top copy.copy(page) top.mediabox RectangleObject((0, h / 2, w, h)) top.cropbox RectangleObject((0, h / 2, w, h)) writer.add_page(top) bottom copy.copy(page) bottom.mediabox RectangleObject((0, 0, w, h / 2)) bottom.cropbox RectangleObject((0, 0, w, h / 2)) writer.add_page(bottom) with open(output_pdf, wb) as f: writer.write(f) print(切割完成新文件, output_pdf)逐行说几个关键点mediabox是页面的物理尺寸cropbox是可视区域。我把两个都设成切割后的矩形保证PDF阅读器、打印机都能正确识别新页面大小。copy.copy(page)是复制一份页面对象避免修改影响原对象。新版pypdf也可以用page.clone(reader)效果类似。横版页面切左右竖版页面切上下判断条件就是宽和高谁大谁小。运行python split_a3.py打开生成的output.pdf原本一页A3已经变成两页A4内容完整、字号不变。3.3 更实用的批量脚本整个文件夹一次切完一次切一份太屈才。下面这个版本会遍历当前文件夹下所有PDF并在输出时自动跳过已经生成的A4结果import copy import os from pypdf import PdfReader, PdfWriter from pypdf.generic import RectangleObject for filename in os.listdir(.): if not filename.lower().endswith(.pdf): continue if filename.startswith(a4_): continue reader PdfReader(filename) writer PdfWriter() for page in reader.pages: w float(page.mediabox.width) h float(page.mediabox.height) short min(w, h) # A4短边约595磅A3短边约842磅 # 短边小于700磅的页面当作A4原样保留避免把A4答案页误切成两半 if short 700: writer.add_page(page) continue if w h: left copy.copy(page) left.mediabox RectangleObject((0, 0, w / 2, h)) left.cropbox RectangleObject((0, 0, w / 2, h)) writer.add_page(left) right copy.copy(page) right.mediabox RectangleObject((w / 2, 0, w, h)) right.cropbox RectangleObject((w / 2, 0, w, h)) writer.add_page(right) else: top copy.copy(page) top.mediabox RectangleObject((0, h / 2, w, h)) top.cropbox RectangleObject((0, h / 2, w, h)) writer.add_page(top) bottom copy.copy(page) bottom.mediabox RectangleObject((0, 0, w, h / 2)) bottom.cropbox RectangleObject((0, 0, w, h / 2)) writer.add_page(bottom) out_name a4_ filename with open(out_name, wb) as f: writer.write(f) print(已处理, filename, -, out_name)这个容错我觉得特别实用因为复习资料文件夹里经常混着A4答案页、A4讲义页直接粗暴切割会把它们拦腰折断。加一个短边判断A4页面原样保留A3页面才切割文件夹乱一点也不怕。3.4 切割完怎么检查输出文件生成后做三件事打开PDF看每页尺寸是不是变成了A4。阅读器里按CtrlD看文档信息页宽约595磅、页高约842磅就是标准A4。确认第一页是原A3左半内容第二页是右半内容。图片版PDF也是一样页面里嵌的大图会被自动裁剪不会给你切成两半图。滚动翻一遍确认没有空白页、没有方向颠倒的页面。如果发现方向有问题往下看第5.2节大概率是扫描件自带旋转标记。4. 实操不装软件用打印机海报打印应急4.1 海报打印的原理海报打印本来是打印店操作把一张海报大图拆成4张、6张甚至更多张纸打印出来以后拼成超大画面。驱动在处理时会把当前页面的光栅图像切成N块每块输出到一张A4纸上。这个机制拿来处理A3试卷只要设成2×1驱动就把A3横向页面切成左右两块分别打在两张A4上。整个处理过程在打印机驱动内部完成不上传、不联网。4.2 不同驱动里的设置路径不同品牌设置入口不太一样我按常见驱动给你指个方向HP打印机打印首选项 → 布局 → 多页 → 海报打印然后设2×1。爱普生打印机打印首选项 → 多页 → 海报打印有的驱动支持仅打印第1页预览。佳能打印机打印首选项 → 页面设置 → 海报打印设置纵横分割数。兄弟、联想等选项名可能是Poster或2页×1页本质一样。如果驱动里翻遍了都找不到说明这台机器的驱动不带这个选项直接回到第3节用Python脚本别死磕。设置时注意三点页面方向保持和卷子一致A3横版就选横向。有重叠边距设置的话尽量改成0或最小值减少重复区域。先打第一页预览确认方向、内容都对再整份打印。4.3 海报打印的局限性海报打印的产物不是PDF意义上的两个A4页面而是两张物理A4纸每张印着A3的一半。驱动为了让人方便拼接往往在交界处留一小段重叠内容。我实际操作中的处理方式拿到两张纸以后用裁纸刀沿重叠区中间裁掉多余的重叠部分两边各留一个干净边缘左右对齐就可以用了。如果你只是自己看题、做题甚至不裁也问题不大重叠区基本都在页边距那边不影响正文。一句话总结脚本分割得到的是干净的电子版PDF海报打印得到的是直观的纸质件。前者适合长期存档和发家长群后者适合手边没电脑时救急。5. 常见问题与翻车现场5.1 切出来的页面一边宽一边窄中间还压字原始试卷如果是严格左右双栏沿中线切不会有问题。但如果原始排版是左栏内容多、右栏内容少或者卷子本身有出题老师在原文件上手写批注把内容挤偏了直接切中线就会把右边的字压到左页边缘。解决方法是给切割点加一个偏移量。在脚本里把切割点从w / 2改成w / 2 offset_ptoffset以磅为单位正数向右偏负数向左偏。1毫米约等于2.8磅如果发现右页总缺半行字就把offset设成-10向左偏约3.5毫米重试一次。这个参数我一般从±6开始试基本一两轮就调准了。5.2 切出来的页面横七竖八方向全乱了扫描版PDF有时候带/Rotate旋转标记在电脑上看着正的一旦修改medibox裁剪输出就乱套。排查方法是在循环里加一行print(page.get(/Rotate))输出90或270就说明该页面带旋转标记。这种情况在切割前先执行一次旋转修正if page.get(/Rotate): page.transfer_rotation_to_content()transfer_rotation_to_content()是pypdf较新版本提供的方法能把旋转标记直接合并进页面内容再去改mediabox就不会错位。如果你的pypdf版本报错先执行pip install -U pypdf升级。5.3 扫描歪斜怎么办手机拍出来的试卷特别容易拍歪整张卷子在画框里斜一个角度。直接切割切出来可能一边内容多、一边内容少或者边缘出现大片空白。这种情况不是切分割线能解决的得先在源头校正拍摄时正对试卷、四角拍进画面光线均匀。用扫描类App手机自带的文件扫描功能也行先做一次自动纠偏。如果卷子已经合并成一个PDF且歪得厉害建议重新扫描或者用OpenCV做透视校正但那对普通用户太折腾。我自己的原则是源文件不干净后面所有工序都是给垃圾数据搬家。扫描阶段多花十秒钟比事后再修省太多时间。5.4 页码顺序乱了怎么办一份4页的A3卷子切割后会变成8页A4顺序是第1页左、第1页右、第2页左、第2页右……这个顺序对阅读来说是最自然的。如果你交给打印店做正反面打印师傅会让你按正面左页、反面右页的方式理好顺序这时候可能需要调整脚本的写入顺序先把所有原A3的左半页全部输出再输出所有右半页。实际改动就是把writer.add_page的调用顺序重排一下懂得列表操作的朋友自己就能改。5.5 图片版PDF切割后会变糊吗不会。脚本只是修改页面可视区域没有对页面内容做任何重采样。页面里嵌的扫描图片原来是多少分辨率切出来还是多少分辨率因为它只是一张整图被裁切显示而已。这也正是我坚持用pypdf而不是找截图重排工具的原因。5.6 Mac和手机上怎么处理Mac上装Python跑脚本流程和Windows一样只是安装包格式不同命令行用pip3代替pip。手机上就不太推荐了除非你有Termux这类Linux终端环境。应急的话可以先用WPS或某些PDF工具看看有没有页面裁剪功能但多数这类App是会员功能而且有些会走在线处理。我的建议手机只是接收端真正要分割还是发到电脑上跑一次脚本五分钟的事。5.7 常见问题速查表现象可能原因解决办法切割点压到题目文字左右栏宽度不一致给分割点加正负偏移每次约3毫米微调输出页面方向乱PDF带Rotate旋转标记用transfer_rotation_to_content()合并旋转切出来出现大半空白页面宽高比本身不是A3双栏确认原文件版式或改用整体缩放混在文件夹里的A4页被切了脚本误判用批量脚本版本短边小于700磅的页面自动保留运行脚本报错pypdf版本过旧执行pip install -U pypdf打印出来字有重影打印机设置或纸张受潮检查驱动缩放设置选择实际大小打印5.8 打印时最后一道防线这里再补一个只有踩过坑的人才会说的细节分割好的PDF在打印时驱动对话框里的缩放选项一定要选实际大小Actual Size不要选适合页面Fit to Page。很多打印驱动默认就是适合页面会把你的A4页面再缩放一圈切了半天等于白切。我见过不少朋友拿着切好的PDF去打印回来发现字又小了一圈还以为脚本有问题其实罪魁祸首是驱动。6. 写在最后这套流程我用了两个学期从去年开始我基本每个复习阶段都用这套脚本处理几十份A3卷子。文件夹里PDF统统一拖跑一次输出文件自动带a4_前缀打开直接用阅读器打印从没在试卷格式上再操过心。有一次临时在外地手边没电脑找到在线工具想应急结果扫描件太大传不上去最后只能缩印将就。回家以后我痛定思痛把脚本封装成一个双击运行的批处理后来又把Mac版做成了Automator快捷操作谁都能一键处理整个文件夹。如果你要把A3卷子转成A4发给家长我额外再分享一个小经验记得把切好的PDF文件名写清楚比如数学期末模拟卷_A4版.pdf或者直接在文件里加一页说明文字本文件由A3原卷分割可直接打印。很多家长拿到A3源文件后根本不知道要分割第一反应就是缩印结果字糊成一团。最后再说一次我踩过最深的坑检查输出结果的时候一定要肉眼翻一遍所有页面再开始打印尤其是用批量脚本跑几十个文件的时候。来源乱、尺寸杂、带旋转标记、混着白边的文件都可能有机器不会判断内容好坏但你会。花一分钟翻完省下的是一整包废纸。