基于ElectronEgg&Python,从零开始打造一款免费的PDF桌面工具

简介: 基于ElectronEgg&Python,从零开始打造一款免费的PDF桌面工具

昨天给大家介绍了 ElectronEgg 这款开源桌面应用开发框架。那么我们能不能搭配使用Python语言开发一套自己的工具箱呢!


这个毋庸置疑,接下来我们看看通过 ElectronEgg&Python 实现一个PDF工具箱。


前言


我们经常在使用一些好用的工具上,体验不是特别友好,很多采用命令行的方式。想有一个 GUI 界面,这样操作更方便,也便于其他不懂技术的同事使用。


现在市面上完全免费的PDF工具较少,要么收费,要么功能有诸多限制,在线的pdf工具也是一样的情况,有的在线是免费的,但是有些文档不便于上传到其他的服务器(安全敏感)。


预期实现的功能


  •  PDF合并
  •  PDF分割
  • PDF提取图片
  •  PDF提取文本
  •  PDF转图片
  •  PDF加密
  •  PDF解密
  •  PDF添加水印
  •  PDF删除页面


技术选型


后端Python:


首先Python操作PDF的第三方API采用的是 pymupdf 库实现的。这个具体使用方法可以自行搜索,或者后续小编另写一篇文章进行介绍。


当然有条件有能力的朋友也可以使用纯Python独有的GUI库实现,比如近期文章中介绍的nicegui 开发一个界面很方便,不依赖ElectronEgg框架也是可以的。


使用Python实现功能之后,然后通过 nuitkaPython 文件打包成一个可执行文件,通过 ElectronEgg 进行调用。


前端ElectronEgg


前端GUI页面主要使用 Electron + Vue3 实现,前端和后端的通信主要使用 Node 中的 child_process 实现, 前端页面的通信使用 IPC 实现。


主要使用技术有

  • nodejs
  • electron
  • vue
  • vue-router
  • pinia
  • naiveui
  • python
  • pymupdf
  • nuitkia 打包工具


IPC通信


ElectronEgg 中为了安全问题,不可以直接在渲染进程中调用 Nodejs中的相关操作。 默认情况下,渲染器进程没有权限访问 Node.js 和 Electron 模块。 作为应用开发者,您需要使用 contextBridge API 来选择要从预加载脚本中暴露哪些 API。


例:通过系统的默认应用打开浏览PDF文件


渲染器进程到主进程(单向)


单向通信只是渲染进程发消息到主进程,不需要主进程的返回信息。


1、在主线程中通过 ipcMain.on 监听事件


index.ts 主进程中加载脚本,设置事件监听

import { app, dialog, ipcMain, shell } from 'electron';
function createWindow () {  
    const mainWindow = new BrowserWindow({  
        webPreferences: {  
            preload: path.join(__dirname, 'preload.js')  
        }  
    })  
    mainWindow.loadFile('index.html')  
}
const openLocalPath = async (path:string) => {
   shell.openPath(path);
};
app.whenReady().then(() => {  
    ipcMain.on('shell:openPath', openLocalPath)  
    createWindow()  
})

2、通过预加载脚本暴露 ipcRenderer.send

要将消息发送到上面创建的监听器,您可以使用 ipcRenderer.send API。在您的预加载脚本中添加以下代码,向渲染器进程暴露一个全局的 window.electronAPI 变量。

const { contextBridge, ipcRenderer } = require('electron')
contextBridge.exposeInMainWorld('electronAPI', {
  openLocalPath: (path) => ipcRenderer.send('openLocalPath', path)
})

3、在渲染进程中调用

const setButton = document.getElementById('btn')
setButton.addEventListener('click', () => {
  window.electronAPI.openLocalPath(path)
})

例:打开文件夹获取里面的文件


渲染器进程到主进程(双向)


1、在主线程中通过 ipcMain.handle 监听事件

const openDirectory = async (): Promise<string> => {
    const { canceled, filePaths } = await dialog.showOpenDialog()
      if (!canceled) {
        return filePaths[0]
      }
};
    
ipcMain.handle(IPC_EVENT.EVENT_DIALOG_OPENFILE, async () =>  openDirectory(type));

2、通过预加载脚本暴露 ipcRenderer.invoke

contextBridge.exposeInMainWorld('electronAPI', {
  openDirectory: async (): Promise<string> => ipcRenderer.invoke(IPC_EVENT.EVENT_DIALOG_OPENFILE)
})

3、在渲染进程中调用

const handleOpenFile = async () => {
    const res = await window.electronAPI.openDirectory()
    // 获取打开的文件夹路径
}

例:主进程的错误信息发送给渲染进程,通过界面显示出来


主进程到渲染器进程


将消息从主进程发送到渲染器进程时,消息需要通过其 WebContents 实例发送到渲染器进程。 此 WebContents 实例包含一个 send方法,其使用方式与 ipcRenderer.send 相同。


1、在主线程中通过 mainWindow.webContents.send 发送事件

// 发送主进程的错误信息给渲染进程
mainWindow.webContents.send(IPC_EVENT.EVENT_PROCESS_ERROR, result)

2、通过预加载脚本暴露 ipcRenderer.on

export const listenError = (callback: (e: IpcRendererEvent, result: ProcessResult) => void) =>
    ipcRenderer.on(IPC_EVENT.EVENT_PROCESS_ERROR, callback);

3、在渲染进程中设置监听

onBeforeMount(() => {
    listenSuccess((__: IpcRendererEvent, _: ProcessResult) => {
        store.updateLoading(false);
        notification.success({ duration: 1500, content: '操作成功' });
    });
})

后端 和 前端 通信


通信的格式主要使用 json 字符串,通过 Nodejs 中的 child_process 调用 命令行,监听命令行的控制台的输出信息

import { spawn } from 'child_process';
//获取命令行的路径
const resourceUrl = join(dirname(app.getPath('exe')), '/resources/toolkit/');
//调用命令,传递相关的参数
child = spawn('toolkit', [cmd, config_json], {  cwd: resourceUrl });
//设置监听
child.stdout.on('data', (data) => {
    // 处理返回的数据
})
child.stderr.on('data', (data) => {
    // 错误信息
})
child.on('exit', (code) => {
    // 退出信息
})

python中主要向控制台输出信息

def process_done(cmd):
    print(json.dumps({'cmd': cmd, 'status': 'done'}))

打包可执行文件


主要是使用 nuitka 工具把 Python 文件打包成一个可执行文件

nuitka --standalone --output-dir=static toolkit.pyt

自动更新功能实现


软件的自动更新主要使用 electron-updater,主要的逻辑代码,在打包的配置文件中设置自己的更新服务器,将打包之后的文件放在自己的服务器中。

publish: [
      {
        provider: 'generic',
        url: 'https://www.examle.com/apps/pdf-toolkit',
      },
    ],

自动更新主要的监听事件

export const initUpdate = (win: BrowserWindow) => {
    autoUpdater.autoDownload = false;
    autoUpdater.autoInstallOnAppQuit = false;
      // 主进程监听检查更新事件
  ipcMain.on(IPC_EVENT.EVENT_UPDATE_CHECKFORUPDATE, () => {
    autoUpdater.checkForUpdates();
  });
  // 主进程监听开始下载事件
  ipcMain.on(IPC_EVENT.EVENT_UPDATE_DOWNLOADUPDATE, () => {
    autoUpdater.downloadUpdate();
  });
  // 检测到有可用的更新
  autoUpdater.on(IPC_EVENT.EVENT_UPDATE_UPDATEAVAILABLE, (info: UpdateInfo) => {
    win.webContents.send(IPC_EVENT.EVENT_UPDATE_UPDATEAVAILABLE, info);
  });
  // 下载更新进度
  autoUpdater.on(IPC_EVENT.EVENT_UPDATE_DOWNLOADPROGRESS, (progressObj: ProgressInfo) => {
    win.webContents.send(IPC_EVENT.EVENT_UPDATE_DOWNLOADPROGRESS, progressObj);
  });
  // 下载完成并安装
  autoUpdater.on(IPC_EVENT.EVENT_UPDATE_UPDATEDOWNLOADED, () => {
    autoUpdater.quitAndInstall();
    win.webContents.send(IPC_EVENT.EVENT_UPDATE_UPDATEDOWNLOADED);
  });
};

效果展示


相关文章
|
4月前
|
JavaScript 前端开发 Android开发
【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
145 13
【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
|
2月前
|
人工智能 自然语言处理 算法
科研论文翻译神器!BabelDOC:开源AI工具让PDF论文秒变双语对照,公式图表全保留
BabelDOC 是一款专为科学论文设计的开源AI翻译工具,采用先进的无损解析技术和智能布局识别算法,能完美保留原文格式并生成双语对照翻译。
1255 67
科研论文翻译神器!BabelDOC:开源AI工具让PDF论文秒变双语对照,公式图表全保留
|
24天前
|
人工智能 自然语言处理 安全
CodeBuddy 开发本地 PDF 转图工具
市场上的 PDF 转图片工具存在收费昂贵、功能有限、隐私安全风险等痛点,而使用 CodeBuddy 实现的本地 PDF 批量转图片工具可以有效解决这些问题。CodeBuddy 的强大编程能力让我们可以快速开发出满足需求的工具,而且工具可以在本地运行,保证了文件的隐私安全。此外,工具还支持批量处理和自定义功能,提高了工作效率。如果你也有 PDF 转图片的需求,不妨尝试使用 CodeBuddy 来实现一个属于自己的工具。
56 11
|
24天前
|
人工智能 算法 安全
使用CodeBuddy实现批量转换PPT、Excel、Word为PDF文件工具
通过 CodeBuddy 实现本地批量转换工具,让复杂的文档处理需求转化为 “需求描述→代码生成→一键运行” 的极简流程,真正实现 “技术为效率服务” 的目标。感兴趣的快来体验下把
59 10
|
20天前
|
人工智能 Shell 开发者
Python项目管理工具 PDM
PDM(Python Development Master)是一款现代化的Python包管理工具,基于PEP 582标准,无需虚拟环境即可实现依赖隔离。它支持PEP 621声明项目元数据,告别`setup.py`,并具备快速安装、简洁依赖管理和内置脚本系统等优势。通过简单命令如`pdm init`、`pdm add`和`pdm run`,用户可轻松完成项目初始化、依赖管理和运行。适合希望简化依赖管理、追求现代工具体验的开发者,尤其对传统工具如`pipenv`或`poetry`不满意的用户。
|
2月前
|
存储 监控 算法
基于 Python 哈希表算法的局域网网络监控工具:实现高效数据管理的核心技术
在当下数字化办公的环境中,局域网网络监控工具已成为保障企业网络安全、确保其高效运行的核心手段。此类工具通过对网络数据的收集、分析与管理,赋予企业实时洞察网络活动的能力。而在其运行机制背后,数据结构与算法发挥着关键作用。本文聚焦于 PHP 语言中的哈希表算法,深入探究其在局域网网络监控工具中的应用方式及所具备的优势。
85 7
|
2月前
|
文字识别 BI
【工具教程】批量PDF和图片OCR识别指定区域文字自动改图片名字,多个区域一次性批量识别改名批量重命名
本内容介绍了一款用于企业档案、医院病历及办公文件管理的图片和PDF文字识别工具。通过框选识别区域,软件可批量提取关键信息,实现文件重命名或导出为表格,极大提升管理效率。支持图片与PDF两种模式,操作简单,适用于合同、病历、报告等场景。提供详细步骤指导,包含区域设置、文件导入、批量处理及结果校验等功能。
236 8
|
5月前
|
测试技术 数据库 Python
Python装饰器实战:打造高效性能计时工具
在数据分析中,处理大规模数据时,分析代码性能至关重要。本文介绍如何使用Python装饰器实现性能计时工具,在不改变现有代码的基础上,方便快速地测试函数执行时间。该方法具有侵入性小、复用性强、灵活度高等优点,有助于快速发现性能瓶颈并优化代码。通过设置循环次数参数,可以更准确地评估函数的平均执行时间,提升开发效率。
171 61
Python装饰器实战:打造高效性能计时工具
|
2月前
|
文字识别 程序员 UED
Python + 腾讯云,多页PDF发票识别一键搞定!
程序员晚枫团队推出了基于Python和腾讯云的多页PDF发票识别功能!通过一行代码即可实现整本PDF发票的高效识别,并直接导出为Excel文件,极大提升工作效率。此次更新修复了仅识别第一页的bug,支持多页PDF完整识别。未来还将拓展更多票据类型、优化速度并加强平台合作。欢迎用户体验并提出建议,共同推动开源项目poocr的成长与进化!
|
4月前
|
人工智能 文字识别 安全
Stirling-PDF:51.4K Star!用Docker部署私有PDF工作站,支持50多种PDF操作,从此告别在线工具
Stirling-PDF 是一款基于 Docker 的本地化 PDF 编辑工具,支持 50 多种 PDF 操作,包括合并、拆分、转换、压缩等,同时提供多语言支持和企业级功能,满足个人和企业用户的多样化需求。
322 6
Stirling-PDF:51.4K Star!用Docker部署私有PDF工作站,支持50多种PDF操作,从此告别在线工具

热门文章

最新文章

推荐镜像

更多
下一篇
oss创建bucket