electron開發pdf合併工具(三)

  • 2019 年 10 月 29 日
  • 筆記

本文目錄:

前言python打包python代碼vue中調用python打包後程序遺留問題一番今日

前言

上一篇我們實現了electron中nodejs端的邏輯功能。但nodejs調用打包後的python以及python合併功能、python日誌保存還沒有做,今天就補充上來這些內容。

python打包

用pyinstall打包python程序為exe文件。首先我們需要給系統安裝pyinstall工具。

pip install pyinstall  

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

"build-python": "pyinstaller ./py/api.py --clean --distpath ./pydist"  

執行該命令成功後,便可以在工程根目錄下找到pydist目錄,裏面就有打包好的python可執行程序。

python代碼

python里我們還是用pyPDF2庫來實現pdf合併,並用logging和traceback模塊實現日誌保存。

logging模塊里主要實現代碼里的打印信息保存。traceback模塊通過try和loggging的方式實現程序執行中產生的錯誤的保存。這樣便可以定位到所有python執行中的問題了。

裏面涉及到一些文件路徑處理和編解碼問題,在代碼可以看到有做特殊處理。

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里的調用方式。

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安裝包中