PYTHON:PYQT5 实现 pdf 合并与分割

前言

        在工作合生活中,会遇到处理pdf的时候,尤其pdf分割与合并时束手无策,下面就利用python实现pdf分割和合并,并且利用pyqt5来实现图形化展示。

        将多个PDF文件合并成一个PDF文件的合并工具。PDF合并工具简单易用,用户只需将要合并的PDF文档添加至工具内,任意调整PDF文档的合并顺序后,稍等几秒,便可实现合并,同样分割只需要导入PDF,分割页码与PDF分割保存的文件名即可。

界面效果

pyqt5 实现

刚刚接触 python 以及 pyqt5  可能代码写的比较乱,望各位大佬见谅,小弟一直在努力学习中,如有问题烦请指教,也欢迎一起学习,一起进步!

关键代码如下

利用 pyqt5 实现图形化界面

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'pdf.ui'
#
# Created by: PyQt5 UI code generator 5.13.0
#
# WARNING! All changes made in this file will be lost!


from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QHeaderView, QTableWidgetItem, QAbstractItemView, QTableView


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1028, 613)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.gridLayout_3 = QtWidgets.QGridLayout(self.centralwidget)
        self.gridLayout_3.setObjectName("gridLayout_3")
        self.tabWidget = QtWidgets.QTabWidget(self.centralwidget)
        self.tabWidget.setEnabled(True)
        self.tabWidget.setBaseSize(QtCore.QSize(100, 100))
        font = QtGui.QFont()
        font.setFamily("宋体")
        font.setPointSize(16)
        font.setBold(False)
        font.setWeight(50)
        font.setStyleStrategy(QtGui.QFont.PreferAntialias)
        self.tabWidget.setFont(font)
        self.tabWidget.setObjectName("tabWidget")
        self.tab = QtWidgets.QWidget()
        self.tab.setObjectName("tab")
        self.gridLayout_7 = QtWidgets.QGridLayout(self.tab)
        self.gridLayout_7.setObjectName("gridLayout_7")
        self.gridLayout_2 = QtWidgets.QGridLayout()
        self.gridLayout_2.setObjectName("gridLayout_2")
        self.pushButton_5 = QtWidgets.QPushButton(self.tab)
        self.pushButton_5.setMaximumSize(QtCore.QSize(200, 200))
        font = QtGui.QFont()
        font.setFamily("宋体")
        font.setPointSize(16)
        font.setBold(False)
        font.setWeight(50)
        font.setStyleStrategy(QtGui.QFont.PreferAntialias)
        self.pushButton_5.setFont(font)
        self.pushButton_5.setObjectName("pushButton_5")
        self.gridLayout_2.addWidget(self.pushButton_5, 0, 2, 1, 1)
        self.lineEdit_3 = QtWidgets.QLineEdit(self.tab)
        self.lineEdit_3.setEnabled(True)
        font = QtGui.QFont()
        font.setFamily("宋体")
        font.setPointSize(16)
        font.setBold(False)
        font.setWeight(50)
        font.setStyleStrategy(QtGui.QFont.PreferAntialias)
        self.lineEdit_3.setFont(font)
        self.lineEdit_3.setObjectName("lineEdit_3")
        self.gridLayout_2.addWidget(self.lineEdit_3, 0, 0, 1, 1)
        self.pushButton_3 = QtWidgets.QPushButton(self.tab)
        self.pushButton_3.setObjectName("pushButton_3")
        self.gridLayout_2.addWidget(self.pushButton_3, 0, 3, 1, 1)
        self.gridLayout_7.addLayout(self.gridLayout_2, 0, 0, 1, 1)
        self.tableWidget_2 = QtWidgets.QTableWidget(self.tab)
        font = QtGui.QFont()
        font.setFamily("宋体")
        font.setPointSize(15)
        font.setBold(False)
        font.setWeight(50)
        font.setStyleStrategy(QtGui.QFont.PreferAntialias)
        self.tableWidget_2.setFont(font)
        self.tableWidget_2.setObjectName("tableWidget_2")
        self.tableWidget_2.setColumnCount(4) # 设置 列数
        self.tableWidget_2.setRowCount(11) # 设置 行数
        self.tableWidget_2.setHorizontalHeaderLabels(['文件名','      文件路径      ','文件大小','文件页码'])
        # self.tableWidget_2.setStyleSheet("background-color:transparent;")
        self.tableWidget_2.horizontalHeader().setStyleSheet(
            "QHeaderView::section{background-color:rgb(155, 194, 230);color: black;};")
        self.tableWidget_2.verticalHeader().setVisible(False) # 隐藏表头
        self.tableWidget_2.setSelectionBehavior(QAbstractItemView.SelectRows)
        self.tableWidget_2.setEditTriggers(QTableView.NoEditTriggers)
        self.tableWidget_2.resizeColumnsToContents() # 设置列宽高按照内容自适应
        self.tableWidget_2.resizeRowsToContents() # # 设置行宽和高按照内容自适应
        self.tableWidget_2.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) # # 所有列自动拉伸,充满界面
        #self.tableWidget.horizontalHeader().setSectionResizeMode(0, QHeaderView.ResizeToContents)
        self.tableWidget_2.horizontalHeader().setSectionResizeMode(1, QHeaderView.ResizeToContents)
        #self.tableWidget_2.horizontalHeader().setSectionResizeMode(2, QHeaderView.ResizeToContents)
        #self.tableWidget.horizontalHeader().setSectionResizeMode(3, QHeaderView.ResizeToContents)
        self.gridLayout_7.addWidget(self.tableWidget_2, 1, 0, 1, 1)
        self.gridLayout_5 = QtWidgets.QGridLayout()
        self.gridLayout_5.setObjectName("gridLayout_5")
        self.lineEdit_2 = QtWidgets.QLineEdit(self.tab)
        font = QtGui.QFont()
        font.setPointSize(16)
        self.lineEdit_2.setFont(font)
        self.lineEdit_2.setObjectName("lineEdit_2")
        self.gridLayout_5.addWidget(self.lineEdit_2, 0, 0, 1, 1)
        self.pushButton_6 = QtWidgets.QPushButton(self.tab)
        font = QtGui.QFont()
        font.setFamily("宋体")
        font.setPointSize(16)
        font.setBold(False)
        font.setWeight(50)
        font.setStyleStrategy(QtGui.QFont.PreferDefault)
        self.pushButton_6.setFont(font)
        self.pushButton_6.setIconSize(QtCore.QSize(51, 50))
        self.pushButton_6.setObjectName("pushButton_6")
        self.gridLayout_5.addWidget(self.pushButton_6, 0, 2, 1, 1)
        self.pushButton_4 = QtWidgets.QPushButton(self.tab)
        self.pushButton_4.setObjectName("pushButton_4")
        self.gridLayout_5.addWidget(self.pushButton_4, 0, 1, 1, 1)
        self.gridLayout_7.addLayout(self.gridLayout_5, 2, 0, 1, 1)
        self.tabWidget.addTab(self.tab, "")
        self.tab_2 = QtWidgets.QWidget()
        self.tab_2.setObjectName("tab_2")
        self.gridLayout_8 = QtWidgets.QGridLayout(self.tab_2)
        self.gridLayout_8.setObjectName("gridLayout_8")
        self.gridLayout = QtWidgets.QGridLayout()
        self.gridLayout.setObjectName("gridLayout")
        self.pushButton = QtWidgets.QPushButton(self.tab_2)
        font = QtGui.QFont()
        font.setFamily("宋体")
        font.setPointSize(16)
        font.setBold(False)
        font.setWeight(50)
        font.setStyleStrategy(QtGui.QFont.PreferAntialias)
        self.pushButton.setFont(font)
        self.pushButton.setObjectName("pushButton")
        self.gridLayout.addWidget(self.pushButton, 0, 1, 1, 1)
        self.lineEdit = QtWidgets.QLineEdit(self.tab_2)
        font = QtGui.QFont()
        font.setFamily("宋体")
        font.setPointSize(16)
        font.setBold(False)
        font.setWeight(50)
        font.setStyleStrategy(QtGui.QFont.PreferAntialias)
        self.lineEdit.setFont(font)
        self.lineEdit.setObjectName("lineEdit")
        self.gridLayout.addWidget(self.lineEdit, 0, 0, 1, 1)
        self.pushButton_8 = QtWidgets.QPushButton(self.tab_2)
        self.pushButton_8.setObjectName("pushButton_8")
        self.gridLayout.addWidget(self.pushButton_8, 0, 2, 1, 1)
        self.gridLayout_8.addLayout(self.gridLayout, 0, 0, 1, 2)
        self.tableWidget = QtWidgets.QTableWidget(self.tab_2)
        font = QtGui.QFont()
        font.setFamily("宋体")
        font.setPointSize(15)
        font.setBold(False)
        font.setWeight(50)
        font.setStyleStrategy(QtGui.QFont.PreferAntialias)
        self.tableWidget.setFont(font)
        self.tableWidget.setObjectName("tableWidget")
        self.tableWidget.setColumnCount(4) # 设置 列数
        self.tableWidget.setRowCount(11) # 设置 行数
        self.tableWidget.setHorizontalHeaderLabels(['文件名','      文件路径      ','文件大小','文件页码'])
        self.tableWidget.horizontalHeader().setStyleSheet(
            "QHeaderView::section{background-color:rgb(155, 194, 230);color: black;};")
        self.tableWidget.verticalHeader().setVisible(False) # 隐藏表头
        self.tableWidget.setSelectionBehavior(QAbstractItemView.SelectRows)
        self.tableWidget.setEditTriggers(QTableView.NoEditTriggers)
        self.tableWidget.resizeColumnsToContents() # 设置列宽高按照内容自适应
        self.tableWidget.resizeRowsToContents() # # 设置行宽和高按照内容自适应
        self.tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) # # 所有列自动拉伸,充满界面
        self.tableWidget.horizontalHeader().setSectionResizeMode(1, QHeaderView.ResizeToContents)
        self.gridLayout_8.addWidget(self.tableWidget, 1, 0, 1, 2)
        self.gridLayout_4 = QtWidgets.QGridLayout()
        self.gridLayout_4.setObjectName("gridLayout_4")
        self.label_3 = QtWidgets.QLabel(self.tab_2)
        font = QtGui.QFont()
        font.setPointSize(16)
        self.label_3.setFont(font)
        self.label_3.setObjectName("label_3")
        self.gridLayout_4.addWidget(self.label_3, 0, 0, 1, 1)
        self.lineEdit_5 = QtWidgets.QLineEdit(self.tab_2)
        self.lineEdit_5.setObjectName("lineEdit_5")
        self.lineEdit_5.setPlaceholderText("分割页码:1-20")
        self.gridLayout_4.addWidget(self.lineEdit_5, 0, 1, 1, 1)
        self.gridLayout_8.addLayout(self.gridLayout_4, 2, 0, 1, 1)
        self.gridLayout_6 = QtWidgets.QGridLayout()
        self.gridLayout_6.setObjectName("gridLayout_6")
        self.lineEdit_4 = QtWidgets.QLineEdit(self.tab_2)
        font = QtGui.QFont()
        font.setPointSize(16)
        self.lineEdit_4.setFont(font)
        self.lineEdit_4.setObjectName("lineEdit_4")
        self.gridLayout_6.addWidget(self.lineEdit_4, 0, 0, 1, 1)
        self.pushButton_7 = QtWidgets.QPushButton(self.tab_2)
        self.pushButton_7.setObjectName("pushButton_7")
        self.gridLayout_6.addWidget(self.pushButton_7, 0, 1, 1, 1)
        self.pushButton_2 = QtWidgets.QPushButton(self.tab_2)
        font = QtGui.QFont()
        font.setFamily("宋体")
        font.setPointSize(16)
        font.setBold(False)
        font.setWeight(50)
        font.setStyleStrategy(QtGui.QFont.PreferAntialias)
        self.pushButton_2.setFont(font)
        self.pushButton_2.setObjectName("pushButton_2")
        self.gridLayout_6.addWidget(self.pushButton_2, 0, 2, 1, 1)
        self.gridLayout_8.addLayout(self.gridLayout_6, 2, 1, 1, 1)
        self.tabWidget.addTab(self.tab_2, "")
        self.gridLayout_3.addWidget(self.tabWidget, 0, 0, 1, 1)
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        self.tabWidget.setCurrentIndex(0)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def size_format(self, size):
        if size < 1000:
            return '%i' % size + 'Byte'
        elif 1000 <= size < 1000000:
            return '%.1f' % float(size/1000) + 'KB'
        elif 1000000 <= size < 1000000000:
            return '%.1f' % float(size/1000000) + 'MB'
        elif 1000000000 <= size < 1000000000000:
            return '%.1f' % float(size/1000000000) + 'GB'
        elif 1000000000000 <= size:
            return '%.1f' % float(size/1000000000000) + 'TB'


    def newItem_showinfo_cut_pdf(self, i, name, num):
        newItem = QTableWidgetItem(name)
        newItem.setTextAlignment(Qt.AlignHCenter| Qt.AlignVCenter) # 文字上下及左右都居中
        self.tableWidget.setItem(i, num, newItem)
        

    def newItem_showinfo_merge_pdf(self, i, name, num):
        newItem = QTableWidgetItem(name)
        newItem.setTextAlignment(Qt.AlignHCenter| Qt.AlignVCenter)
        self.tableWidget_2.setItem(i, num, newItem)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "PDF 合并及分割工具"))
        self.pushButton_5.setText(_translate("MainWindow", "添加"))
        self.pushButton_3.setText(_translate("MainWindow", "清空表格"))
        self.pushButton_6.setText(_translate("MainWindow", "合并"))
        self.pushButton_4.setText(_translate("MainWindow", "导出地址"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("MainWindow", "PDF 合并"))
        self.pushButton.setText(_translate("MainWindow", "添加"))
        self.pushButton_8.setText(_translate("MainWindow", "清空表格"))
        self.label_3.setText(_translate("MainWindow", "分割页码"))
        self.pushButton_7.setText(_translate("MainWindow", "导出地址"))
        self.pushButton_2.setText(_translate("MainWindow", "分割"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("MainWindow", "PDF 分割"))

分割与合并基本功能实现

#!/usr/bin/env python
# coding=utf-8
# ----- ----- ----- ----
# @Author       : Guoke324
# @Date         : 2021-03-16 15:57:49
# @Email        : querysoft2019@outlook.com
# @LastEditTime : 2021-07-19 14:45:10


import sys,os
import PyPDF2
from pdfui import Ui_MainWindow
from PyQt5 import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import QHeaderView, QTableWidgetItem, QHBoxLayout

merge_list = []
cut_list = []
class MainUI(Ui_MainWindow, QMainWindow):

    def __init__(self, parent=None):
        super(MainUI, self).__init__(parent)
        self.setupUi(self)
        self.pushButton_6.clicked.connect(self.merge_pdf) #实现按钮点击功能
        self.pushButton_2.clicked.connect(self.cut_pdf) #实现按钮点击功能
        self.pushButton_5.clicked.connect(self.showinfo_merge_pdf)
        self.pushButton.clicked.connect(self.showinfo_cut_pdf)
        self.pushButton_3.clicked.connect(self.clear_merge_data)
        self.pushButton_4.clicked.connect(self.merge_save_event)
        self.pushButton_8.clicked.connect(self.clear_cut_data)
        self.pushButton_7.clicked.connect(self.cut_save_event)



    def Error_tips(self,tips, text):
        return QMessageBox.warning(self, tips, text, QMessageBox.Yes | QMessageBox.Yes)


    def open_pdf(self, who_list, files_name, pdfName):
        try:
            print(who_list,12312312)
            if os.path.splitext(files_name)[1] == ".pdf":
                Reader = PyPDF2.PdfFileReader(open(pdfName, 'rb'))  # 打开pdf文件 Reader = PdfFileReader(readFile)
                NumPages = Reader.getNumPages()
                print(NumPages)
            else:
                who_list.pop()
                self.Error_tips("错误", "文件不是 pdf 文件,请重新选择!")
                print("文件不是 pdf 文件,请重新选择!")
                print(NumPages)
            return NumPages
        except Exception as e:
            pass

    def clear_merge_data(self):
        print("clear_merge_data")
        # self.tableWidget_2.clear()   #清除所有数据--包括标题头
        self.tableWidget_2.clearContents()  # 清除所有数据--不包括标题头

    def clear_cut_data(self):
        print("clear_cut_data")
        self.tableWidget.clearContents()

    def merge_save_event(self):
        # global merge_save_path
        _translate = QtCore.QCoreApplication.translate
        fileName2, ok2 = QFileDialog.getSaveFileName(None, "文件保存", "", "PDF Files(*pdf)")
        print(fileName2)  # 打印保存文件的全部路径(包括文件名和后缀名)
        self.lineEdit_2.setText(fileName2)

    def cut_save_event(self):
        # global merge_save_path
        _translate = QtCore.QCoreApplication.translate
        fileName2, ok2 = QFileDialog.getSaveFileName(None, "文件保存", "", "PDF Files(*pdf)")
        print(fileName2)  # 打印保存文件的全部路径(包括文件名和后缀名)
        self.lineEdit_4.setText(fileName2)


    def showinfo_merge_pdf(self):
        try:
            pdfName, imgType = QFileDialog.getOpenFileName(self, "添加 PDF", "", "All Files(*)") #打开文件夹选择文件
            self.lineEdit_3.setText(pdfName) # lineEdit 设置文本框内容
            # self.textEdit.append(pdfName) # textEdit 追加字符创
            print(pdfName,234234234 )
            if pdfName:
                if pdfName in merge_list:
                    print(merge_list,1)
                    self.Error_tips("错误", "PDF 文件已选择,请勿重复选择!")
                    print(merge_list)
                else:
                    merge_list.append(pdfName)
                    # print(len(test_list))
                    # print(test_list)
                    files_name = os.path.basename(pdfName) # 获取文件名
                    size = self.size_format(os.path.getsize(pdfName))
                    i = len(merge_list)-1
                    print(i)
                    NumPages = self.open_pdf(merge_list, files_name, pdfName)
                    if NumPages:
                        self.newItem_showinfo_merge_pdf(i, files_name,0)
                        self.newItem_showinfo_merge_pdf(i, pdfName,1)
                        self.newItem_showinfo_merge_pdf(i, size,2)
                        self.newItem_showinfo_merge_pdf(i, "1 - " + str(NumPages),3)
                        print(merge_list)
                        print("[{},{},{},{}]".format(files_name,pdfName,size,NumPages))
                    else:
                        pass
        except Exception as e:
            self.Error_tips("错误", "请选择文件")


    def showinfo_cut_pdf(self):
        try:
            pdfName, imgType = QFileDialog.getOpenFileName(self, "添加 PDF", "", "All Files(*)") #打开文件夹选择文件
            self.lineEdit.setText(pdfName) # lineEdit 设置文本框内容
            # self.textEdit.append(pdfName) # textEdit 追加字符创
            print(pdfName, )
            if pdfName:
                if pdfName in cut_list:
                    self.Error_tips("错误", "PDF 文件已已选择,请勿重复选择!") 
                else:
                    cut_list.append(pdfName)
                    # print(len(test_list))
                    # print(test_list)
                    files_name = os.path.basename(pdfName) # 获取文件名
                    size = self.size_format(os.path.getsize(pdfName))
                    i = len(cut_list)-1
                    if i == 0:
                        NumPages = self.open_pdf(cut_list, files_name, pdfName)
                        if NumPages:
                            self.newItem_showinfo_cut_pdf(i, files_name,0)
                            self.newItem_showinfo_cut_pdf(i, pdfName,1)
                            self.newItem_showinfo_cut_pdf(i, size,2)
                            self.newItem_showinfo_cut_pdf(i, "1 - " + str(NumPages),3)
                            print(cut_list)
                            print("[{},{},{},{}]".format(files_name,pdfName,size,NumPages))
                        else:
                            pass
                    else:
                        self.Error_tips("错误", "PDF 文件分割只支持一个文件!") 
        except Exception as e:
            print(e)
            self.Error_tips("错误", "请选择文件!")
            # files_name = os.path.basename(pdfName) # 获取文件名
            # size = self.size_format(os.path.getsize(pdfName)) # 获取文件大小
            # self.newItem_showinfo_cut_pdf(files_name,0) # 输出显示
            # self.newItem_showinfo_cut_pdf(pdfName,1)
            # self.newItem_showinfo_cut_pdf(size,2)
            # print(test_list)
            # print(pdfName,type(pdfName))


    def cut_pdf(self):
        if len(cut_list) != 0:
            input_pdf = cut_list[0]
            print("分割 PDF 为:", input_pdf)
            Reader = PyPDF2.PdfFileReader(open(input_pdf, 'rb'))
            PdfFileWriter = PyPDF2.PdfFileWriter() # 获取一个 PdfFileWriter 对象
            print(self.lineEdit_5.text())
            Numlist = self.lineEdit_5.text().split("-")
            outpdf = self.lineEdit_4.text()
            if outpdf:
                if len(Numlist) == 2:
                    Num = int(Numlist[0].strip()) - 1
                    print(Num)
                    try:
                        for i in range(Num,int(Numlist[1].strip())):
                            PdfFileWriter.addPage(Reader.getPage(i)) # 将一个 PageObject 加入到 PdfFileWriter 中
                            PdfFileWriter.write(open(outpdf, 'wb'))  # 输出到 outpdf 文件中
                        cut_list.clear()
                        self.Error_tips("提示", "PDF 文件已分割完成!")
                    except Exception as e:
                        self.Error_tips("提示", "PDF 文件未能成功分割,请检查!")
                else:
                    self.Error_tips("提示", "PDF 文件分割页码有误,请检查!") 
            else:
                self.Error_tips("提示", "请输入 PDF 导出路径及文件名,谢谢!") 
        else:
             self.Error_tips("提示", "请输入添加要分割的pdf文件,谢谢!") 


    def merge_pdf(self):
        # 合并 pdf
        # print(self.textEdit.toPlainText()) # 读取 textEdit 的内容
        if len(merge_list) != 0:
            outpdf = self.lineEdit_2.text()
            print("输出 PDF 文件名为",outpdf)
            if outpdf:
                try:
                    PdfFileWriter = PyPDF2.PdfFileWriter()
                    for files in merge_list:
                        Reader = PyPDF2.PdfFileReader(open(files, 'rb'))
                        Pages = Reader.getNumPages()
                        for index in range(0,Pages):
                            pageObj = Reader.getPage(index)
                            PdfFileWriter.addPage(pageObj)
                    PdfFileWriter.write(open(outpdf, 'wb'))
                    merge_list.clear()
                    self.Error_tips("提示", "PDF 文件合并完成!") 
                except Exception as e:
                    self.Error_tips("提示", "PDF 文件未能成功合并,请检查!")
            else:
                self.Error_tips("提示", "请输入 PDF 导出路径及文件名,谢谢!") 
        else:
            self.Error_tips("提示", "请输入添加要合成的pdf文件,谢谢!") 





    def closeEvent(self, event):       
        reply = QMessageBox.question(self, '提示',
            "你确认退出吗?", QMessageBox.Yes | 
            QMessageBox.No, QMessageBox.No)
        if reply == QMessageBox.Yes:
            event.accept()
        else:
            event.ignore()     

if __name__ == "__main__":
    app = QApplication(sys.argv)
    main = MainUI()
    main.show()
    sys.exit(app.exec_())

后记

        我也利用打包程序对其进行了打包,如果对python不感兴趣,可以直接下载工具使用,下载地址:https://download.csdn.net/download/qq_22690543/34684889

也可以在github进行自行下载,地址为:GitHub - Guoke324/pdf_merge_cut: pdf_merge_cuticon-default.png?t=L9C2https://github.com/Guoke324/pdf_merge_cut

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值