如何在 Electron BrowserWindow 中查看 PDF?

2024-04-16

所以我有这个 Electron 应用程序,在一个 .html 文件中,我链接了另一个脚本,该脚本为程序提供了一些实用功能,其中之一是:

function openPDF(filePath){
    let pdfWindow = new electron.remote.BrowserWindow({
        icon: './build/icon.png',
        width: 1200,
        height: 800,
        webPreferences: {
            plugins: true
        }
    });

    pdfWindow.loadURL(url.format({
        pathname: filePath,
        protocol: 'file:',
        slashes: true
    }));

    pdfWindow.setMenu(null);

    pdfWindow.on("closed", function () {
        pdfWindow = null
    });
}

因此,这应该使用 Electron 的集成 PDF-Viewer(使用 Chromium)在新窗口中打开 PDF。我用的是臭名昭著的plugins: true,我尝试了大部分您可以为浏览器窗口定义数千个首选项 https://github.com/electron/electron/blob/master/docs/api/browser-window.md但它总是打开窗口,然后开始下载文件而不是显示它。

我三次检查了文件路径、“导入”等,更新了所有内容,但我似乎找不到问题。 Electron 本身就支持这一点,因为1.6.4 https://github.com/electron/electron/releases/tag/v1.6.4但这对我不起作用。

帮助我,Stack Overflow,你是我唯一的希望。


2020 年更新:

@karthick correctly pointed out that this is a bug that disables the plugins despite plugins: true. The Issue https://github.com/electron/electron/issues/12337 exists since 3.0.0 https://electronjs.org/blog/electron-3-0#other-notes (September 18, 2018) and remains to be fixed today has finally been fixed in Version 9!

使用以下命令将您的电子版本更新到 9.X.X 或更高版本以启用该功能:

npm update electron

您可以检查devDependencies in the package.json应该可以在您的项目文件夹中找到。它应该看起来像这样:

"devDependencies": {
    "electron": "^9.0.0"
},

旧答案:

由于长期存在的 GitHub 问题往往会变得相当混乱,我将根据开发的要点更新这个答案。您还可以在答案末尾找到三种解决方法。

Updates:

  1. 3 月 19 日:修复正在进行中 https://github.com/electron/electron/pull/17163.
  2. 5 月 19 日:上述修复目前处于搁置状态 等待更好的扩展支持 https://github.com/electron/electron/pull/17440.
  3. 6 月 28 日:更好的 扩展支持 https://github.com/electron/electron/pull/17440预计不会很快到达那里。
  4. 7 月 16 日:The fix https://github.com/electron/electron/pull/17163不再积极开展工作。引用 开发商:

我在尝试通过 Chromium 的查看器进行移植时遇到的主要问题是它对 Chromium 扩展系统的依赖。 Electron 仅支持该系统的一部分,这使得集成查看器变得困难。

  1. 7月25日:项目取得重大进展改进扩展支持 https://github.com/electron/electron/pull/17440合并后的一个后续跟踪问题 https://github.com/electron/electron/issues/19447被创建。这增加了继续开展相关工作的可能性the fix https://github.com/electron/electron/pull/17163.

  2. 8 月 28 日:目前没有人致力于修复。你可以在 BountySource 上悬赏解决此问题 https://www.bountysource.com/issues/56240517-enable-pdf-viewer如果您想更快地解决这个问题。

  3. 11 月 19 日:The fix https://github.com/electron/electron/pull/17163已关闭并删除了分支。开发商报价:

我们仍然打算有一天恢复 PDF 查看器,但这依赖于我们首先迁移到使用 Chrome 的扩展库而不是我们自己的填充程序,因为 Chromium 中的 PDF 查看器是作为扩展实现的。

  1. 1 月 2 日:尽管如此,仍然没有人在做这件事BountySource 上的赏金超过 1,600 美元 https://www.bountysource.com/issues/56240517-enable-pdf-viewer

  2. 1月21日:扩展支持持续完善(追踪问题 https://github.com/electron/electron/issues/19447) and a new fix https://github.com/electron/electron/pull/21794已被介绍。

  3. 2 月 13 日:新的修复 https://github.com/electron/electron/pull/21794已合并,问题已关闭。看起来这个问题将在 Electron 10 中得到解决!开发商报价:

这应该准备好在下一个 10.x 每晚进行测试。我也希望向后移植到 9.x,尽管如果它导致问题,它最终可能不会坚持下去。

解决方法:

  1. 您可以通过降级到最新的 2.X.X 来使其工作。为此,请使用以下命令:

     npm install electron@"<3.0.0" --save-dev
    

但请记住,Electron 团队仅支持最新的三个稳定主要版本 https://github.com/electron/electron/blob/master/docs/tutorial/support.md意思是2.X.X 不再接收安全补丁.

  1. 或者,您可以调用系统来打开文件。它将选择分配给 PDF 的默认程序:

     shell.openItem(fullPath);
    

只需确保路径 (fullPath)总是可以用类似的方法正确解决path.resolve(app.getAppPath(), filePath)因为当您构建应用程序时它可能会发生变化。

  1. 另一种解决方法是使用类似的东西PDF.js https://github.com/mozilla/pdf.js/它并没有完全提供 Chrome PDF 查看器的完整功能集(例如缺少字段完成),但对于大多数应用程序来说可能已经足够好了。下面是一个示例实现,它捕获下载事件并将其路由到 PDF.js-viewer:

     const { BrowserWindow, session } = require('electron')
     session.defaultSession.on('will-download', (event, item, webContents) => {
         if (item.getMimeType() === 'application/pdf' && item.getURL().indexOf('blob:file:') != 0) {
             event.preventDefault();
             new BrowserWindow().loadFile(path.resolve(__dirname, `pdfjs/web/viewer.html?file=${item.getURL()}`));
         }
     })
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Electron BrowserWindow 中查看 PDF? 的相关文章

  • 在 Angular 中使用多个模块有什么好处?

    我是 Angular Js 的熟悉者 最近我发现在一些项目中 在主模块中创建并组装了多个 Angular 模块 代码看起来像 angular module main main sub1 main sub2 main sub2 angular
  • 仅隐藏输入字段的内容

    我有一个与输入字段重叠的跨度 当您在输入字段中键入内容时 它会更新其内容 尽管我将跨度完美地定位在输入文本上 但您仍然可以看到文本更加粗体并且字母更粗 field nr 1 with span nr 2 without 我尝试隐藏整个输入字
  • 带层的 NodeJS Lambda - 如何防止打字稿在构建中包含层

    我正在用打字稿编写一个 NodeJs lambda 函数 它依赖于 Lambda 层才能工作 我在项目文件夹中创建了一个包含示例层的目录 然后使用 tsconfig 文件中的路径选项以便在本地测试它 然而 这工作得很好 当我构建代码来编译
  • 函数默认参数有些问题?

    看到这个 let foo outer function bar func x gt foo let foo inner console log func bar outer 我想知道为什么输出是 外部 而不是 内部 我知道 JavaScri
  • AJAX 以渐进方式读取数据,而不仅仅是在完成时读取数据

    我喜欢为我的 ajax 调用创建一个进度条 为此 我可以使我的服务器端脚本返回其进度状态 所以我需要 JavaScript 来读取这个进度级别并显示它 有可能吗还是我走错了路 你可以尝试这样的事情 一些伪代码 假设是 jQuery 因为你已
  • jQuery 中如何查找具有特定 id 的 div 是否存在?

    我有一个附加一个函数 div 到单击时的元素 该函数获取单击元素的文本并将其分配给名为的变量name 然后将该变量用作 div id附加元素的 我需要看看是否 div id with name在我追加元素之前已经存在 但我不知道如何找到它
  • 在 Twitter Bootstrap 轮播中显示下一张和上一张图像

    我正在寻找一种在 Twitter Bootstrap 轮播中显示下一张和上一张幻灯片图像的方法 默认情况下 它只显示当前图像 如果我删除 display none css 属性 则轮播中的每个项目都在彼此下方 我尝试过使用 CSS 但还没有
  • 使用 jQuery 的 $.get 和 GMail API 时出现 401(未经授权)错误

    我试图在用户使用 javascript 使用 G API 登录后运行 jQuery 的 get 但在浏览器控制台中收到 401 未经授权 错误 这是我请求的 url 的格式 https www googleapis com gmail v1
  • Linux 上的 Chrome - 查询浏览器以查看打开了哪些选项卡?

    我在 Ubuntu Linux 上运行 Chromium 开源 chrome 版本 我可以编写一个程序来查看我打开了哪些选项卡吗 我想编写一个程序来监控我在事情上花费了多少时间 是否有命令行程序 某种调用 chromium browser
  • Safari 不设置 cookie,但 Chrome 和 Firefox 会设置

    我正在将请求从本地主机发送到第三方服务器以使用 REST API 获取数据 后端使用cookies JSESSIONID 来了解是否发送数据 在 Chrome 中一切正常 我可以在 Chrome 浏览器的 应用程序 选项卡中看到 Cooki
  • 如何使用 toLocaleTimeString 12 小时时间而不使用 AM/PM 缩写?

    我想以 12 小时格式显示时间而不使用AM and PM 例如3 45仅且不3 45 PM or 3 45 AM 我该如何修改toLocaleTimeString 不显示PM AM但12位数字格式 var minsToAdd 45 var
  • 如何从对象文字数组中切片数组?

    我有这个数组 其中每个索引都包含一个对象文字 所有对象字面量都具有相同的属性 某些对象文字对于给定属性具有相同的值 我想创建一个包含only那些对象文字 我的想法是对数组进行排序 并将其切片成一个新数组 这是数组 var arr arr 0
  • 带有 Form 和 $setPristine 的 Angular 1.5 组件

    我正在尝试在 Angular 1 5 的组件中使用表单 我的表单可以正常工作 因为我有模型绑定并且可以在提交时获取数据 所以我已经完成了 90 的目标 缺少的是能够使用 setPristine 正确重置表单 我尝试了几种方法 第一种方法是将
  • 通过NVM为特定项目(文件夹)设置不同的节点版本

    我知道我可以通过以下方式更改节点版本nvm useCLI 命令 但是 我想为某个项目 文件夹 设置不同的特定节点版本 它已更改为nvm use命令但它恢复为default version每当我重新启动terminal or webstorm
  • grunt jasmine-node 测试运行两次

    我设置 grunt 来运行 node js 茉莉花测试 由于某种原因 使用此配置 结果总是显示双倍的测试 这是我的配置 我在用着茉莉花节点 https github com jasmine contrib grunt jasmine nod
  • 按位置获取元素?

    我正在研究 SVG 脚本 有 getElementById 或 getElementsByTagName 但我找不到任何方法来按位置获取元素 比如获取位置为x 10 y 10的元素 有什么办法可以实现这个目标吗 var yourElemen
  • 如何在firebase云函数中添加时间戳

    我正在尝试添加Timestamp在有关 Firebase Cloud 功能的 Firestore 文档中 我曾尝试过firestore Timestamp fromDate new Date 但它不起作用 const functions r
  • 致命错误:CALL_AND_RETRY_LAST 分配失败 - JavaScript 堆内存不足错误

    我运行时收到此错误ng 构建 prod 92 块资产优化 4136 0155D210 443646 ms 标记 扫描 703 5 770 3 gt 703 6 759 8 MB 2162 2 0 0 ms 自标记开始以来 0 0 ms 0
  • 无法使用 Node npm 安装任何包

    我正在尝试通过 npm 安装一些节点包 但它不会安装 我已经尝试安装 卸载 更新节点 但似乎没有任何效果 我正在使用 ubuntu 12 04 以下是我尝试安装软件包的方式 npm install underscore npm http G
  • jquery:卸载还是卸载之前?

    当用户从当前页面导航时 我想向服务器发布一条消息 我现在正在使用 unload 但结果不可靠 即使在其文档中也是如此 卸载事件的准确处理 各个版本都有所不同 浏览器 例如 某些版本 Firefox 的触发事件当 链接已被跟踪 但当 窗口已关

随机推荐

  • Firefox 中的 Html 5 日期选择器

    有什么方法可以设置在带有 HTML 5 的 firefox 版本 21 中启用日期选择器 我不想使用基于 jQuery 的日期选择器 因为将在使用该网站的浏览器中禁用 javascript 日期选择器在 Chrome 上运行良好 因此 如果
  • 删除命名管道.NET

    我使用以下代码列出我的命名管道 private IEnumerable
  • C++/SFML 显示故障,通过鼠标单击更改精灵成员

    我正在学习 C SFML 作为练习 我正在制作一个小程序 在窗口中显示 64x64 像素方形棕色精灵的 10x10 网格 该程序允许您使用键盘选择绿色 黄色 蓝色 灰色 棕色方形精灵 并用该选定的精灵替换所述网格上的任何图块 游戏循环如下
  • 无法将必备组件放在与我的应用程序相同的位置

    我使用 VS 2013 我希望 sql server 2012 express localdb 与我创建安装程序时的应用程序位于同一位置 因此 在项目属性 gt 发布 gt 先决条件中 我选择第二个选项 从与我的应用程序相同的位置下载先决条
  • 块局部变量的语法

    我对定义块局部变量的良好风格感到困惑 选择是 选择A method that calls block v w puts v w 选项B method that calls block v w puts v w 当我希望本地块具有默认值时 混
  • 分离 CodeIgniter 配置文件 Git 以便公开发布

    我即将启动一个基于 CodeIgniter 的项目 并计划使用 Git 作为我们的 DVCS 我将与其他一些开发人员合作 中央 原始 服务器是私人托管的 但我也想开源它 稍后将代码发布到Github 我的问题是 有没有办法在 Git 中分离
  • 轻量级加密密钥交换协议

    我有一个嵌入式系统通过 HTTP 将数据发布到 JSON REST 服务 我目前正在使用 HMAC SHA1 进行身份验证 方式与亚马逊AWS http docs amazonwebservices com AWSSimpleQueueSe
  • 为什么 Facebook 不合并它的 CSS/JS 文件?

    我很好奇为什么 Facebook 开发人员选择不将他们的脚本和样式表合并到单个文件中 相反 它们通过 CDN 按需加载 Facebook 显然是一个非常复杂的应用程序 我可以理解这种模块化如何使 Facebook 更易于维护 但是通常的优化
  • Python:将目录及其子目录中的所有文件名写入文本文件

    我的问题如下 我想列出目录及其子目录中的所有文件名 并将输出打印在 txt 文件中 现在这是我到目前为止的代码 import os for path subdirs files in os walk Users user Desktop T
  • 文件正在被分配一个 //# sourceMappingURL 但已经有一个

    我只是注意到 Firefox 控制台为我的项目中的每个 js coffee 文件 甚至是包 输出以下错误 file is being assigned a sourceMappingURL but already has one Chrom
  • 在 R 中将数字时间转换为日期时间 POSIXct 格式

    我有一个数据框 其中包含已读入 R 的日期时间列 时间值显示为数字时间 如下面的数据示例所示 我想将它们转换为日期时间 POSIXct 或 POSIXlt 格式 以便可以查看日期和时间 tdat lt c 974424L 974430L 9
  • LinkedIn 分享 API-v2 返回炒股

    我对 LinkedIn Shares API 的逻辑完全感到困惑 因为我从有关共享的文档中读到的内容LinkedIn API 共享文档 https developer linkedin com docs guide v2 shares sh
  • javascript正则表达式验证范围内的年份

    我有年份的输入字段 我需要一个正则表达式来验证它 我有这样的代码 12 d d d 但我只想允许验证特定范围内的年份 例如 1990 2010 我该怎么做 编辑 范围必须是 1950 2050 尝试这个 1990 2010 199 d 20
  • 如何使用 Selenium 和 C# 将 Cookie 保存为字符串?

    到目前为止 我使用以下代码实现了获取网站的所有 cookie 我想要的 我不需要也不想要特定的 cookie var cookies driver Manage Cookies AllCookies write full path txt
  • 将 Aiohttp 与代理一起使用

    我正在尝试使用异步从 url 列表 由 ids 标识 中获取 HTML 我需要使用代理 我正在尝试将 aiohttp 与代理一起使用 如下所示 import asyncio import aiohttp from bs4 import Be
  • OpenCV 2.4.2 中的错误“OpenCV 错误:错误标志”

    我刚刚开始尝试使用 OpenCV 并根据一本书编写了一个非常简单的小程序 问题是当我尝试编译它时 出现此错误 我会给你我所掌握的所有信息 我使用 Mac OS X 10 7 的 homebrew 安装了 openCV include
  • PHP找不到tmp目录

    我在 tmp 目录中创建文件的函数遇到问题 例如tmpfile and tempnam 他们似乎都无法写入 tmp 并返回 false upload tmp dir在 php ini 中设置 文件上传工作正常 在调试这个错误时我发现sys
  • 在文本矩阵中使用多个 CGAffineTransform

    我正在使用 Quartz 显示文本 这是我的代码 CGContextRef myContext UIGraphicsGetCurrentContext CGContextSelectFont myContext Helvetica 12 k
  • Assertj:如何按对象内容比较2个对象列表?

    给出以下 快速且缺失的 代码 class Pair int x int y List l1 Arrays asList new Match 1 2 new Match 1 3 new Match 2 3 List l2 Arrays asL
  • 如何在 Electron BrowserWindow 中查看 PDF?

    所以我有这个 Electron 应用程序 在一个 html 文件中 我链接了另一个脚本 该脚本为程序提供了一些实用功能 其中之一是 function openPDF filePath let pdfWindow new electron r