本文同步发表于小弟自架网站(非钓鱼也无广告,纯分享):
微确幸资讯站
这篇来分享将pdf档案的页首与页尾批次删除!!
有关使用python程式删除pdf档案的页首和页尾,
google了不少网页,一直没办法找到正确可供执行的程式。
经过尝试了不少程式码,再自己改写后,有了以下的分享:
首先有个重要的资讯要先声明:
程式码可以正确运作,来自于文件版面的页首和页尾的位置必须是一样的位置。
因为程式码是以类似图像的方式读取pdf档案,
读取的pdf文件再透过裁切后(也就是裁切页首或页尾后)回写pdf档。
了解这个限制后,如果你有兴趣阅读,再往下观看。
word档案中的页首和页尾,在转成pdf后,
用pdf编辑器打开,是找不到pdf定义的页首和页尾的。
也就是你没办法用pdf编辑器一键删除所有原先在word中产生的页首和页尾。
很多时候我收到别人的pdf档,这些档案很多是用word打好后,再转成pdf档。
这些档案很多都有他们自己加的页首和页码,
但对于彙整资料的人来说,这就很痛苦了。
因为彙整资料的人,要把这些页首、页尾的资料先移除,
才能製作自己的页首与页尾。
目标文件的pdf档案为直式与横式页面组合而成,
这个pdf是我用word档加入页首和页尾资料做成的示範档案。
示範档案下载位置:
https://drive.google.com/file/d/1ihwjwFC2NoG6k62KhuwB6Cek0N876TuR/view?usp=sharing
直式页面:
横式页面:
程式码已考虑直式或横式页面的判断,
这个判断在PyPDF2中的rotate资料中是有分的,
比如说直式的rotate是0, 文件向右转90度变成横式时,则rotate是90,
文件再持续向右转90度,又变成头上脚下的直式文件,这时rotate是108。
这次示範的档案是直式rotate=0和横式rotate=90的页面所组合而成的pdf档案。
接下来就用程式来处理了:
import PyPDF2def remove_header_or_footer(input_path, output_path): with open(input_path, 'rb') as file: reader = PyPDF2.PdfReader(file) writer = PyPDF2.PdfWriter() for page_num in range(len(reader.pages)): page = reader.pages[page_num] media_box = page.mediabox header = 35 # 如果不移除页首,则设为0 footer = 35 # 如果不移除页尾,则设为0 print(f'PDF档案第{page_num}页') #print(f'PDF档案第{page}页') # 这边的代码是查看每一页的文件资讯 print(f"文件旋转角度:{page.get('/Rotate')}") print(f'文件左下角座标:{media_box.lower_left}') print(f'文件左上角座标:{media_box.upper_left}') print(f'文件右下角座标:{media_box.lower_right}') print(f'文件右上角座标:{media_box.upper_right}') print('----------------------------') # 文件为直式 if page.get('/Rotate') == 0: # 文件扣除页首或页尾的座标定位 media_box.lower_left = (media_box.lower_left[0], media_box.lower_left[1]+footer) # 设定页面左下角座标 media_box.upper_left = (media_box.upper_left[0], media_box.upper_left[1]-header) # 设定页面左上角座标 media_box.lower_right = (media_box.lower_right[0], media_box.lower_right[1]+footer) # 设定页面右下角座标 media_box.upper_right = (media_box.upper_right[0], media_box.upper_right[1]-header) # 设定页面右上角座标 # 文件为横式 elif page.get('/Rotate') == 90: # 旋转90度的文件扣除页首或页尾的座标定位 media_box.lower_left = (media_box.lower_left[0]+header, media_box.lower_left[1]) # 设定页面左下角座标 media_box.upper_left = (media_box.upper_left[0]+header, media_box.upper_left[1]) # 设定页面左上角座标 media_box.lower_right = (media_box.lower_right[0]-footer, media_box.lower_right[1]) # 设定页面右下角座标 media_box.upper_right = (media_box.upper_right[0]-footer, media_box.upper_right[1]) # 设定页面右上角座标 writer.add_page(page) with open(output_path, 'wb') as output_file: writer.write(output_file)# 指定输入和输出档案路径input_file = 'D:\\temp\\test\\Word示範文件_组合.pdf'output_file = 'D:\\temp\\test\\output.pdf'# 执行移除页首或页尾操作remove_header_or_footer(input_file, output_file)print('所有页面移除页首或页尾已完成。')print('----------------------------')
程式执行结果:
pdf档处理后的页面,确实有将页首和页尾的资料给删除了:
仔细看处理后的页面可以发现上、下都被裁切了!!
虽然文件被裁切,但用pdf编辑器打开后,再以列印式存成pdf档,
是可以再回复成A4的页面大小的。
但有一点比较奇怪的是存档后原先是横式页面却会变成直式页面储存。
以上就完成这次的分享!!