前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >electron开发pdf合并工具(三)

electron开发pdf合并工具(三)

作者头像
efonfighting
发布2019-10-29 14:29:20
1.3K0
发布2019-10-29 14:29:20
举报
文章被收录于专栏:一番码客

本文目录:

前言python打包python代码vue中调用python打包后程序遗留问题一番今日

前言

上一篇我们实现了electron中nodejs端的逻辑功能。但nodejs调用打包后的python以及python合并功能、python日志保存还没有做,今天就补充上来这些内容。

python打包

用pyinstall打包python程序为exe文件。首先我们需要给系统安装pyinstall工具。

代码语言:javascript
复制
pip install pyinstall

然后再package.json中加入python打包命令。

代码语言:javascript
复制
"build-python": "pyinstaller ./py/api.py --clean --distpath ./pydist"

执行该命令成功后,便可以在工程根目录下找到pydist目录,里面就有打包好的python可执行程序。

python代码

python里我们还是用pyPDF2库来实现pdf合并,并用logging和traceback模块实现日志保存。

logging模块里主要实现代码里的打印信息保存。traceback模块通过try和loggging的方式实现程序执行中产生的错误的保存。这样便可以定位到所有python执行中的问题了。

里面涉及到一些文件路径处理和编解码问题,在代码可以看到有做特殊处理。

代码语言:javascript
复制
import sys, os, logging
import traceback
from PyPDF2 import PdfFileReader, PdfFileWriter

def MergePDF():
    outfile = os.path.abspath('out.pdf')
    filepath = ''
    output = PdfFileWriter()
    outputPages = 0

    for each_file in open("filepaths.txt", 'r' ,encoding='utf-8'): # 防止gtk解码问题
        each_file=each_file.replace('\n','')
        filepath = os.path.dirname(each_file)
        logging.info(filepath)
        logging.info(each_file)
        # 读取源pdf文件
        input = PdfFileReader(open(each_file, "rb"))

        # 如果pdf文件已经加密,必须首先解密才能使用pyPdf
        if input.isEncrypted == True:
            input.decrypt("map")

        # logging.info(each_file[:-4])

        # 获得源pdf文件中页面总数
        pageCount = input.getNumPages()
        outputPages += pageCount
        #logging.info("%s has %d pages" % (each_file, pageCount))

        # 分别将page添加到输出output中
        for iPage in range(pageCount):
            output.addPage(input.getPage(iPage))

        # 添加书签
        output.addBookmark(
            title=each_file[:-4].replace(filepath+'\\',''), pagenum=outputPages - pageCount)

    logging.info("All Pages Number: " + str(outputPages))
    # 最后写pdf文件
    outputStream = open(outfile, "wb")
    output.write(outputStream)
    outputStream.close()
    logging.info("finished")


def main():
    logging.info("hello efonmark.")
    MergePDF()


if __name__ == '__main__':
    logging.basicConfig(level=logging.DEBUG,#控制台打印的日志级别
                    filename='new.log',
                    filemode='w',##模式,有w和a,w就是写模式,每次都会重新写日志,覆盖之前的日志
                    #a是追加模式,默认如果不写的话,就是追加模式
                    format=
                    '%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s'
                    #日志格式
                    )
    try:
        main()
    except Exception:
        logging.error(traceback.format_exc()) 

vue中调用python打包后程序

这里我们用以一个局部变量来控制是调用python的exe打包文件还是调用pyhton命令。因为用户电脑不一定安装了python命令运行环境,因此我们需要将python打包成exe并修改js里的调用方式。

代码语言:javascript
复制
pdfmerge: function () {
    const fs = require('fs')
    fs.writeFile('filepaths.txt', this.paths)
    let pycmd = ''
    const NODE_ENV = 'production'
    // const NODE_ENV = 'development'
    if (NODE_ENV === 'development') {
        pycmd = 'python py/api.py'
        require('child_process').spawn(pycmd, {
            stdio: 'inherit',
            shell: process.platform === 'win32'
        })
    } else {
        pycmd = 'pydist/api/api.exe'
        require('child_process').execFile(pycmd)
    }

遗留问题

  • 菜单栏需要添加
  • python可执行文件打包到electron安装包中
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-10-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 一番码客 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • python打包
  • python代码
  • vue中调用python打包后程序
  • 遗留问题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档