a3如何打印双面小册子_A3折叠成为小册子
如何 成为 打印 折叠 小册子 a3 双面
2023-06-13 09:13:42 时间
程序功能: 用python将小册子打印扫描的A3幅面双页乱码的PDF文件转换A4幅面顺码的PDF文件 问题:A3幅面的双面打印的在中间用骑马钉装订成小册子, 拆开中间装订的订书钉由复印机一次性扫描成PDF文件。 阅读不方便:页码错乱,A3幅面,左右两页。 本程序将扫描的A3幅面的PDF文件转换成理顺页码单面的A4幅面的PDF文件。 编程思路: PDF文件==>页面png(图片文件)(用到:pdf2image,poppler中的 pdftommp.exe ) ==>图片文件A3大小切分成2个A4幅面的图片文件 (用到:PIL中的Image) ==>图片文件组成PDF文件(用到:img2pdf中的img2pdf.convert(pngList)
import os,sys
import img2pdf
'''
程序功能: 用python将小册子打印扫描的A3幅面双页乱码的PDF文件转换A4幅面顺码的PDF文件
问题:A3幅面的双面打印的在中间用骑马钉装订成小册子, 拆开中间装订的订书钉由复印机一次性扫描成PDF文件。
阅读不方便:页码错乱,A3幅面,左右两页。
本程序将扫描的A3幅面的PDF文件转换成理顺页码单面的A4幅面的PDF文件。
编程思路: PDF文件==>页面png(图片文件)(用到:pdf2image,oppler中的 pdftommp.exe )
==>图片文件A3大小切分成2个A4幅面的图片文件 (用到:PIL中的Image)
==>图片文件组成PDF文件(用到:img2pdf中的img2pdf.convert(pngList)
附注:实测中使用png格式的形成的A4幅面的PDF较小。
重要事项:
(1) 程序安装在d:盘(或e:)的d:\leader
(2) 解压poppler-0.68.0_x86后得到的bin目录下的文件安装到 d:\leader\bin;
并将d:\leader\bin加入到windows的path变量中。(下面的批处理文件已经解决这个问题)
(3) 批处理文件可以如下:
rem main.cmd
path d:\leader\bin;%path%
d:
cd \leader
python main.prg %1
(4) 运行时,可以: main d:\A3pdf目录
也可以: 直接main运行。不添加命令行参数使用缺省A3PDF目录为: d:\leader\pdf
使用时只需将要转换的A3pdf文件copy到 d:\leader\pdf之下即可。
转换完成的文件在 d:\leader\pdf\A4子目录下。
中间转换时产生的图片文件在 d:\leader\pdf\PNG 子目录下。这些图片文件可以删除。
版本 0.1
版本 01,使用全局变量,各个函数均在一个文件中。
程序使用了几个库:
pip install pillow
pip install PyPdf3
pip install pdf2image
pip install img2pdf
程序还使用了 poppler-0.68.0_x86
pdf2image是包装器,poppler是转换过程真正需要的。
编程 叶照清 363992124@qq.com
日期 2021.01.25
=============
Poppler for Windows
I have been using the Poppler library for some time, over a series of various projects. It’s an open source set of libraries and command line tools, very useful for dealing with PDF files. Poppler is targeted primarily for the Linux environment, but the developers have included Windows support as well in the source code. Getting the executables (exe) and/or dlls for the latest version however is very difficult on Windows. So after years of pain, I jumped on oDesk and contracted Ilya Kitaev, to both compile with Microsoft Visual Studio, and also prepare automated tools for easy compiling in the future. Update: MSVC isn’t very well supported, these days the download is based off MinGW.
So now, you can run the following utilities from Windows!
PDFToText – Extract all the text from PDF document. I suggest you use the -Layout option for getting the content in the right order.
PDFToHTML – Which I use with the -xml option to get an XML file listing all of the text segments’ text, position and size, very handy for processing in C#
PDFToCairo – For exporting to images types, including SVG!
Many more smaller utilities
Download
Latest binary : poppler-0.68.0_x86
http://blog.alivate.com.au/wp-content/uploads/2018/10/poppler-0.68.0_x86.7z
'''
from pdf2image.exceptions import (
PDFInfoNotInstalledError,
PDFPageCountError,
PDFSyntaxError
)
from pdf2image import convert_from_path
import os,sys,PyPDF3
from PIL import Image
def pdf2img(pdf_file):
basename=os.path.basename(pdf_file)[:-4]
try:
images = convert_from_path(pdf_file)
for idx, img in enumerate(images):
path=path_png+rf'\{basename}_{idx:02d}.png'
img.save(path)
except Exception as e:
print(e)
def pic_half(filename1,No,MaxPage):
basename=os.path.basename(filename1)[:-3]
basefileName= path_png+'\\'+basename
MaxPage+=1
img = Image.open(filename1+'.png')
size = img.size
#print(size)
# 准备将图片切割成2张小图片
weight = int(size[0] // 2)
height = int(size[1] // 1)
# 切割后的小图的宽度和高度
#print(weight, height)
for j in range(1):
for i in range(2):
box = (weight * i, height * j, weight * (i + 1), height * (j + 1))
#print(box)
imgHalf = img.crop(box)
if No%2==1:
if i==0:
fsave= basefileName+f'_A4_{(MaxPage-No):02d}.png'
else:
fsave= basefileName+f'_A4_{No:02d}.png'
else:
if i==1:
fsave= basefileName+f'_A4_{(MaxPage-No):02d}.png'
else:
fsave= basefileName+f'_A4_{No:02d}.png'
## print('\t'+fsave)
imgHalf.save(fsave)
img.close()
def one_pdf(pdf_file1):
## '''
## A3.pdf 总页数 测试的是10页==》对折20页
## '''
## try:
## pdf_stream = open(pdf_file1,'rb')
## pdf = PyPDF3.PdfFileReader(pdf_stream)
## except:
## print(f"{pdf_file1} 不是合法的PDF文件!")
## exit(1)
##
## maxP=pdf.numPages
## pdf_stream.close()
## del pdf
pdf2img(pdf_file1)
basename=os.path.basename(pdf_file1)[:-4]
for i in range(1,maxP+1):
A3_png=path_png+f'\\{basename}_{i-1:02d}'
print(A3_png)
No=i
pic_half(A3_png,No,maxP*2)
def doImg2Pdf(fileName):
bb=pdf_b_name[:-4]
with open(f"{A4_dir}\\{bb}_A4.pdf", "wb") as f:
#fileList = os.listdir(fileName)
#print(fileList)
pngList = []
for ii in range(1,maxP*2+1):
pngName =f'{bb}_A4_{ii:02d}.png'
print('\t'+pngName)
pngList.append(pngName)
pfn_bytes = img2pdf.convert(pngList)
f.write(pfn_bytes)
print(f"{A4_dir}\\{bb}_A4.pdf 转换完成。\n")
################################
root = os.path.abspath(os.path.dirname(__file__))
dd=''
if root.find(":") == 1:
print(__file__)
dd=root[:2]
path =dd+r'\LEADER\PDF'
path_a4 = path+r'\A4'
path_png = path+r'\PNG'
PDF_list=[]
maxP=10
if len(sys.argv)>1:
path = sys.argv[1]
if os.path.isdir(path):
path_a4 = path+'\\A4'
path_png = path+'\\PNG'
if not os.path.exists(path_a4) : os.makedirs(path_a4)
if not os.path.exists(path_png): os.makedirs(path_png)
Dir_l = os.listdir(path)
for ff in Dir_l[:]:
if ff.find('.pdf') == -1:
Dir_l.remove(ff)
print("需转换的文件列表:")
for i in range(len(Dir_l)):
print(f'{i:04d}\t{Dir_l[i]}')
PDF_list = Dir_l
print(f"\n需转换的文件总数:{i+1:04d}")
else:
print( f'{path} :非法目录')
exit(1)
if len(PDF_list) == 0 : print("无PDF文件!");exit(0)
#Main_loop
for pdf_file in PDF_list:
full_fileName = path+'\\'+pdf_file
print(f'{full_fileName} 转换中。。。')
try:
pdf_stream = open(full_fileName,'rb')
pdf = PyPDF3.PdfFileReader(pdf_stream)
except:
print(f"{Full_fileName} 不是合法的PDF文件!")
exit(1)
maxP=pdf.numPages
pdf_stream.close()
del pdf
one_pdf(full_fileName)
pdf_file = full_fileName #"e:\TEST\叶照清.pdf"
png_dir = os.path.dirname(pdf_file)+'\\PNG'
A4_dir = os.path.dirname(pdf_file)+'\\A4'
pdf_b_name = os.path.basename(pdf_file)
os.chdir(png_dir)
doImg2Pdf(png_dir)
#eof
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
相关文章
- 当科技成为潮流,下一个新十年的未来应该如何畅想?
- 【说站】python如何读取不同格式文件
- 面试官问你:日亿万级请求日志收集如何不影响主业务?你怎么回复
- 如何成为优秀的UI设计师
- 如何成为优秀工程师之软技能篇
- 回归测试如何确定测试范围?
- 如何成为一名优秀的架构师 | ArchSummit
- 加好友怎么提高通过率?加微信好友时如何打招呼更容易通过?
- 如何成为顶尖架构师?
- MySQL Status Ndb_api_trans_close_count 数据库状态作用意思及如何正确
- 导弹是如何在飞行中修正航线的?
- 如何做好Oracle数据库的备份工作(c备份oracle数据库)
- DevOps 专业人员如何成为网络安全拥护者
- 深度 | 做到这些值4亿美元:看 Nervana 如何利用深度学习实现数据革命
- 如何设置MySQL主键——25字教你成为专业数据库管理师(mysql主键设置)
- Linux C程序中如何调用命令(linuxc调用命令)
- MySQL季:如何成为一名高效的数据库管理员(mysql季)
- 如何在Oracle数据库中添加记录?25个简单步骤!(oracle添加记录)
- 实现自我提升:如何利用Linux自学网成为技术专家(linux自学网)
- 如何成为一个高效、快乐、健康的程序员
- 密码如何改变MSSQL数据库密码(如何改mssql)
- 深入了解微擎如何利用Redis 加速网站(微擎如何打开redis)
- 深谙MySQL如何成为1206年的贤者(1206 mysql)
- 不用redis,广联达如何实现高效缓存(不用redis 广联达)
- MySQL一周之内的数据备份,如何做到高效又安全(mysql 一周之内)
- 如何提升Redis性能,实现极致体验(如何提高redis性能)
- 如何成为一个成功的Oracle代理商(oracle代理商好做吗)
- 继美国之后,加拿大如何成为下一个人工智能金矿?
- 如何获取JQUERYAJAX返回的JSON结果集实现代码