electron-vite 配合python

要实现的功能

  1. pdf转化和doc
  2. doc转换为pdf
  3. pdf的合并

Q:为什么不直接使用node?

复制代码
 只想尝试electron是否能和其他的程序相互配合
  1. 构建工具 yarn | npm 不要选择pnpm
  2. electron框架选择 electron-vite
  3. 转换功能选择 python库
bash 复制代码
  from pdf2docx import Converter
  import docx2pdf
  from PyPDF2 import  PdfMerger

electron-vite要怎么嵌入python

可看csdn这篇文章

项目结构


所有的python代码都要放到resources文件夹下面

注意点1

js 复制代码
import pdf2docPathAddress from '../../resources/pythonCode/pdf2doc.py?asset'
import pythonPathAddress from '../../resources/python/python-3.13.5-embed-amd64/python.exe?asset'
import pdfMergePathAddress from '../../resources/pythonCode/PdfFileMerger.py?asset'
复制代码
上述代码导入的时候一定要写?asset,让electron-vite知道这是静态文件,
否则打包的时候会将python代码位置放错

注意点2

js 复制代码
const scriptPath = is.dev
  ? pdf2docPathAddress
  : pdf2docPathAddress.replace('app.asar', 'app.asar.unpacked')

const pythonPath = is.dev
  ? pythonPathAddress
  : pythonPathAddress.replace('app.asar', 'app.asar.unpacked')

const pdfMergePath = is.dev
  ? pdfMergePathAddress
  : pdfMergePathAddress.replace('app.asar', 'app.asar.unpacked')
复制代码
 必须这么做,打包之后静态文件,也就是python代码会在app.asar.unpacked文件下面! 
 如果不更改那么在使用spawn的时候,不能找到python.exe

为什么静态文件会放到resources下面?

yml 复制代码
asarUnpack:
  - resources/**
因为electron-builder.yml中配置,你可自己手动更改,但不建议

贴出所有pdf转换为doc代码剩余都类似

js 复制代码
ipcMain.handle('convert-pdf-to-docx', async (_, pdfPath) => {
  const docxPath = pdfPath.replace(/\.pdf$/, '.docx')
  return new Promise((resolve, reject) => {
    const py = spawn(pythonPath, [scriptPath, pdfPath, docxPath, 'convert-pdf-to-docx'])
    py.on('close', (code) => {
      if (code === 0) {
        resolve(docxPath)
        // 系统弹窗
        dialog
          .showMessageBox({
            type: 'info',
            title: '转换成功',
            message: '文件已成功转换为 DOCX 格式'
          })
          .then(() => {
            // 打开文件所在目录
            shell.showItemInFolder(docxPath)
            // 打开文件
            shell.openPath(docxPath)
          })
      } else {
        // 系统弹窗
        dialog
          .showMessageBox({
            type: 'error',
            title: '转换失败',
            message: `转换失败,退出码: ${code}`
          })
          .then(() => {
            reject(new Error(`转换失败,退出码: ${code}`))
          })
      }
    })

    py.on('error', (error) => {
      reject(new Error(`启动 Python 失败: ${error.message}`))
    })
  })
})
python 复制代码
import sys
import os

# pdf和world相互转换

# 自动注入嵌入式 python site-packages 路径
def inject_site_packages():
  base_dir = os.path.dirname(os.path.abspath(__file__))
  # 适配你的嵌入式目录结构(根据实际路径调整)
  python_lib = os.path.abspath(os.path.join(base_dir, '..', 'python', 'python-3.13.5-embed-amd64', 'Lib', 'site-packages'))
  if python_lib not in sys.path:
    sys.path.insert(0, python_lib)
inject_site_packages()

from pdf2docx import Converter
import docx2pdf
from pathlib import Path

def pdf_to_docx(pdf: Path, docx: Path):
  try:
    cv = Converter(str(pdf))
    cv.convert(str(docx), start=0, end=None)
    cv.close()
    print(f"文件 {pdf} 已成功转换为 {docx}")
    return True
  except Exception as e:
    print(f"转换过程中出错: {e}")
    raise

def docx_to_pdf(docx: Path, pdf: Path):
    try:
        # 确保目标目录存在
        out_dir = pdf.parent
        out_dir.mkdir(parents=True, exist_ok=True)
        docx2pdf.convert(str(docx), str(pdf))
        print(f"文件 {docx} 已成功转换为 {pdf}")
        return True
    except Exception as e:
        print(f"docx 转 pdf 过程中出错: {e}")
        return False

if __name__ == '__main__':
  pdf_path = sys.argv[1]
  docx_path = sys.argv[2]
  action = sys.argv[3]
  if action == 'convert-pdf-to-docx':
    pdf = Path(pdf_path)
    docx = Path(docx_path)
    pdf_to_docx(pdf, docx)
  elif action == 'convert-docx-to-pdf':
    docx = Path(docx_path)
    pdf = Path(pdf_path)
    docx_to_pdf(docx, pdf)

页面展示



相关推荐
2603_965148115 小时前
如何解析JSON数据?API返回的商品信息处理教程
开发语言·数据库·python·自动化·json·api
万少5 小时前
给 DeepSeek Harness 装个"应用商店":一条命令,595 个插件随你逛
前端·javascript·后端
jufeng13077 小时前
【系列:手搓自主 AI Agent:Hermes 架构原理剖析 · 第 8 篇】
python·ai agent·配置系统
circuitsosk7 小时前
跨境电商智能化实战:AI如何赋能客服自动回复、广告智能投放与供应链预测
大数据·人工智能·python·langchain·智能客服
小爬的老粉丝7 小时前
JavaScript 纯前端预览 WPS:先识别容器,再路由解析器
前端·javascript·wps
2601_956319888 小时前
2026年零基础学量化:从看懂示例到写清条件和动作
人工智能·python
过期的秋刀鱼!8 小时前
LangChain-D1-模型的工作流程
人工智能·python·langchain
萤火工厂目视化设计8 小时前
智能制造与企业文化目视化浪潮下:中小工厂的机遇与挑战
python·制造
满栀5859 小时前
状态管理:Redux、Vuex、Pinia 核心区别
前端·javascript·typescript
DeepVisionary9 小时前
从GPT-5.6 Sol的Ultrafast模式看推理速度竞赛:750 token/秒背后,Cerebras的晶圆级生意
python·自动化