吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 23758|回复: 335
上一主题 下一主题
收起左侧

[原创工具] 单面扫描正反面文件后合并

    [复制链接]
跳转到指定楼层
楼主
911061873 发表于 2022-2-9 18:22 回帖奖励
本帖最后由 911061873 于 2022-2-11 17:22 编辑

更新

鉴于有人回复说合成的PDF打开报错,我测试了下都是不正确的使用导致的。于是我更新了下代码并附上新版下载地址。

import os
import ntpath
import sys

import PyPDF2

class File:
    def __init__(self, path: str):
        if not ntpath.exists(path):
            print('文件不存在')
            raise FileNotFoundError
        self.abspath = ntpath.abspath(path)
        self.filetype = ntpath.splitext(self.abspath)[1]
        self.filename = ntpath.splitext(ntpath.basename(self.abspath))[0]
        self.dirpath = ntpath.dirname(self.abspath) + '\\'

def merge(file1, file2):
    a = File(file1)
    b = File(file2)
    if a.filetype != '.pdf' or b.filetype != '.pdf':
        print('文件类型错误')
        os.system('pause')
        exit(1)
    f1 = open(a.abspath, 'rb')
    f2 = open(b.abspath, 'rb')
    reader1 = PyPDF2.PdfFileReader(f1)
    reader2 = PyPDF2.PdfFileReader(f2)
    writer = PyPDF2.PdfFileWriter()
    if reader1.numPages != reader2.numPages:
        print('页数不相等')
        os.system('pause')
        exit(2)
    for i in range(reader1.numPages):
        writer.addPage(reader1.getPage(i))
        writer.addPage(reader2.getPage(-(i + 1)))
    newf = open(a.dirpath + a.filename + '+' + b.filename + '.pdf', "wb")
    writer.write(newf)
    f1.close()
    f2.close()
    newf.close()

def print_help():
    help_str = '''
    帮助:
    把要合并的文件选中拖到软件图标上打开即可。

    软件用途:适用于 单面扫描仪 扫描 双面文件 产生的 两个PDF文件 的合并。

    详细帮助:
    假设,文件为3页的双面文件,使用单面扫描仪扫描出来的两个PDF文件分别为A.PDF和B.PDF。
    其中A文件中的页数为1、3、5。B文件中的页数为6、4、2.
    把A、B两个文件同时选中,拖动到本程序图标上即可,显示“用正反面扫描合并打开”时松开鼠标。
    '''
    print(help_str)
    os.system('pause')

def main():
    args: list = sys.argv[1:]
    i = len(args)
    if i >= 2 and i % 2 == 0:
        args.sort()
        for j in range(0, i, 2):
            merge(args[j], args[j + 1])
    else:
        print_help()
    exit(0)

if __name__ == '__main__':
    main()

下载地址

起因

上次有一份很多页的正反面文件需要扫描,但是公司打印机只支持单面扫描,所以就自己研究了这个小工具。

原理

假设一个文件有3张纸6页,A1 A2 B1 B2 C1 C2
使用打印机单面进纸器扫描正面,第一个文件包含页数分别为A1 B1 C1
然后把文件反过来扫描背面,此时文档顺序是反的。所以第二个文件包含的页数为 C2 B2 A2
用python处理PDF实现合并。

import PyPDF2

fileName1 = "f1.pdf"
fileName2 = "f2.pdf"
newFileName = "new.pdf"

with open(fileName1, 'rb') as f1, open(fileName2, 'rb') as f2, open(newFileName, "wb") as newf:
    reader1 = PyPDF2.PdfFileReader(f1)
    reader2 = PyPDF2.PdfFileReader(f2)
    writer = PyPDF2.PdfFileWriter()
    if reader1.numPages != reader2.numPages:
        print('页数不相等')
        exit(1)
    for i in range(reader1.numPages):
        writer.addPage(reader1.getPage(i))
        writer.addPage(reader2.getPage(-(i + 1)))
    writer.write(newf)

后续

今天有个同事有十几份正反面文件要扫描,为了降低使用门槛,我更新了代码并且用pyinstaller进行了封装

import os
import ntpath
import sys

import PyPDF2

def merge(file1, file2):
    if not (file1.endswith(".pdf") and file2.endswith(".pdf")):
        print('文件类型错误')
        raise FileExistsError
    if not (ntpath.exists(file1) and ntpath.exists(file2)):
        print('文件不存在')
        raise FileNotFoundError
    with open(file1, 'rb') as f1, \
            open(file2, 'rb') as f2, \
            open(ntpath.dirname(file1) + "\\" + ntpath.splitext(ntpath.basename(file1))[0] + "+" + ntpath.splitext(
                ntpath.basename(file2))[0] + ".pdf",
                 "wb") as newf:
        reader1 = PyPDF2.PdfFileReader(f1)
        reader2 = PyPDF2.PdfFileReader(f2)
        writer = PyPDF2.PdfFileWriter()
        if reader1.numPages != reader2.numPages:
            print('页数不相等')
            raise FileExistsError
        for i in range(reader1.numPages):
            writer.addPage(reader1.getPage(i))
            writer.addPage(reader2.getPage(-(i + 1)))
        writer.write(newf)

def print_help():
    help_str = '''
帮助信息:
可双击打开后手动输入路径
也可以把要合并的文件路径以参数形式传入(数量必须为偶数)
合并是以文件名排序的
'''
    print(help_str)

def main():
    args: list = sys.argv[1:]
    args.sort()
    if len(args) == 0:
        file_a = input('第一个文件')
        file_b = input('第二个文件')
        merge(file_a, file_b)
    elif len(args) == 1:
        print_help()
        # if args[0] in ['-h', '--help', '/?']:
        #     print_help()
        # else:
        #     print_help()
    elif len(args) % 2 == 0:
        for i in range(0, len(args), 2):
            merge(args[i], args[i + 1])
        print('合并完成')
    else:
        print_help()
    os.system('pause')

if __name__ == '__main__':
    main()

效果

免费评分

参与人数 81吾爱币 +77 热心值 +74 收起 理由
小鹿有小犄角 + 1 + 1 谢谢@Thanks!
13428970337 + 1 + 1 我很赞同!
qq12044 + 1 + 1 谢谢@Thanks!
dongsuo52499 + 1 + 1 福昕高级PDF编辑器了解一下
madaleo + 1 + 1 非常重要的功能!我就是同款单面扫描仪,需要这个东西。
nxwuzu + 1 + 1 谢谢@Thanks!
wsabenzhu + 1 谢谢@Thanks!
jerry9801 + 1 热心回复!
cszssj + 1 + 1 谢谢@Thanks!
woailiyibiu + 1 + 1 谢谢@Thanks!
zhzng + 1 + 1 谢谢@Thanks!
tydx0259 + 1 + 1 谢谢@Thanks!
半岛0205 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
SwIIInG + 1 谢谢@Thanks!
lvjs99999 + 1 + 1 谢谢@Thanks!
ccspace + 1 我很赞同!
Sinaan + 1 热心回复!
hotsky999 + 1 我很赞同!
maiwens + 1 + 1 谢谢@Thanks!
KylinYang + 1 + 1 我很赞同!
happyzss + 1 + 1 谢谢@Thanks!
yx69 + 1 + 1 热心回复!
小单单大蛋蛋 + 1 复印身份证用是不是最好不过
benmagic + 1 谢谢@Thanks!
天空的板砖fly + 1 + 1 谢谢@Thanks!
lbwnba + 1 + 1 谢谢@Thanks!
qilinzi + 1 + 1 谢谢@Thanks!
狂笑一君 + 1 + 1 谢谢@Thanks!
zhongyihaitun + 1 谢谢@Thanks!
mikezhql + 1 + 1 谢谢@Thanks!
RobinMaas + 2 + 1 用心讨论,共获提升!
我无聊路过1989 + 1 热心回复!
woaigaoqing + 1 谢谢@Thanks!
tev331 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
liguibin + 2 + 1 我很赞同!
minyun + 1 + 1 谢谢@Thanks!
心随情走 + 1 + 1 鼓励转贴优秀软件安全工具和文档!
louxilouxi + 1 + 1 谢谢@Thanks!
alxir + 1 + 1 我很赞同!
梦雨年华 + 1 + 1 谢谢@Thanks!
weizhuqiang + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
bugof52pj + 1 + 1 谢谢@Thanks!
雷林凡 + 1 + 1 谢谢@Thanks!
ma4907758 + 1 + 1 谢谢@Thanks!
yjn866y + 1 + 1 热心回复!
ws001980 + 1 + 1 谢谢@Thanks!
igll + 1 + 1 谢谢@Thanks!
fengbolee + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
风之暇想 + 7 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
lyslxx + 1 + 1 我很赞同!
lxg2002202 + 1 + 1 我很赞同!
chao8709 + 1 + 1 谢谢@Thanks!
Mountainranges + 1 + 1 谢谢@Thanks!
铭扬 + 1 + 1 谢谢@Thanks!
haonanyxp + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
redppj + 1 + 1 鼓励转贴优秀软件安全工具和文档!
小小牛 + 1 + 1 热心回复!
夜雨霖铃 + 1 我很赞同!
z7138910 + 1 + 1 热心回复!
rxnwin + 1 + 1 早点看到这个就能省几千打印机钱了。支持双面扫的都贵
shalj + 1 + 1 热心回复!
luosh668 + 1 + 1 谢谢@Thanks!
zhang189 + 1 谢谢@Thanks!
liuhong111 + 1 + 1 热心回复!
jiangsg + 1 + 1 谢谢@Thanks!
dpr1028 + 1 我很赞同!
明月相照 + 1 + 1 谢谢@Thanks!
大肉骨头 + 1 + 1 鼓励转贴优秀软件安全工具和文档!
15235109295 + 1 + 1 我很赞同!
追逐飞翔 + 1 + 1 我很赞同!
fyz2007 + 1 + 1 谢谢@Thanks!
wlzhgszgf + 1 + 1 谢谢@Thanks!
夜狼自大 + 1 效果不该是18+30,24+36吗?
Ys7765321 + 1 + 1 热心回复!
ouiazrael + 1 + 1 谢谢@Thanks!
ysy2001 + 1 + 1 谢谢@Thanks!
娟然俊逸 + 1 + 1 谢谢@Thanks!
pinpo + 1 + 1 谢谢@Thanks!
yanglinman + 1 谢谢@Thanks!
liyitong + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
Gandalf + 1 谢谢@Thanks!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

来自 #
 楼主| 911061873 发表于 2022-2-11 17:22 |楼主
蓝奏网盘下载地址 https://wwi.lanzout.com/iTQT9zwvc7c

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
yaan + 1 + 1 我很赞同!

查看全部评分

推荐
百年抉择 发表于 2022-2-9 19:00

为了方便大家给大家弄个蓝盘
https://wwi.lanzouw.com/itON5zte3vc

免费评分

参与人数 12吾爱币 +13 热心值 +10 收起 理由
ind + 1 + 1 谢谢@Thanks!
zgz890920 + 1 + 1 热心回复!
fyz2007 + 1 + 1 谢谢@Thanks!
CCZ_ + 1 + 1 谢谢@Thanks!
peak207 + 1 + 1 我很赞同!
jsh007 + 2 + 1 谢谢@Thanks!
yanglinman + 1 谢谢@Thanks!
liyitong + 1 我很赞同!
GXW1693 + 1 + 1 热心回复!
立竿见影 + 2 + 1 谢谢@Thanks!
cqbao + 1 谢谢@Thanks!
sun51000 + 1 + 1 我很赞同!

查看全部评分

推荐
Jack-NASA 发表于 2022-2-13 10:16
%C3%F7%B0%D7%C2%A5%D6%F7%B5%C4%D2%E2%CB%BC%C1%CB%A3%AC%C2%A5%D6%F7%D3%D0%C4%C7%D6%D6%C9%A8%C3%E8%C7%FD%B6%AF%C2%F0%A3%BF%D4%DA%B5%E7%C4%D4%C9%CF%BE%CD%C4%DC%BF%B4%B5%BD%C9%A8%B3%F6%C0%B4%B5%C4%D3%B0%CF%F1
3#
doglove 发表于 2022-2-9 18:29
好贵呀,算了,。
4#
一丝风 发表于 2022-2-9 18:42
还分三个文档?
5#
花葬 发表于 2022-2-9 18:47
要这么多CB干嘛用?
6#
百年抉择 发表于 2022-2-9 18:54
压缩包分卷3
7#
hjnhjn1118 发表于 2022-2-9 18:58
感谢分享               
8#
wychashe 发表于 2022-2-9 19:15
参考一下。。。
9#
cqbao 发表于 2022-2-9 19:25
        有 点 贵
10#
senlly 发表于 2022-2-9 19:38
感谢楼主无私分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-26 08:54

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表