使用 Electron JS 打印 PDF 文件

新手上路,请多包涵

我正在尝试创建一个用于打印字母大小 PDF 的 Electron JS 应用程序。

这是我的打印代码片段:

 win = new BrowserWindow({
  width: 378,
  height: 566,
  show: true,
  webPreferences: {
    webSecurity: false,
    plugins: true
  }
});

// load PDF
win.loadURL('file://' + __dirname + '/header1_X_BTR.pdf');

// if pdf is loaded start printing
win.webContents.on('did-finish-load', () => {
  win.webContents.print({silent: true, printBackground:true});
});

我的问题是:如果我有 print({silent:true}) 我的打印机打印空白页。如果我有 print({silent:false}) ,打印机的打印方式与屏幕截图相同,包括标题、控件等。

在此处输入图像描述

我需要静默打印 PDF 内容,但好几天都做不到。有没有人在 Electron 上遇到过同样的事情?

原文由 Grig Dodon 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

如果您已经拥有 pdf 文件或在打印“我假设它是”之前保存了 pdf,那么您可以获取文件位置,然后您可以使用外部进程使用 child_process 进行打印。

您可以使用 lp commandPDFtoPrinter for windows

 const ch = require('os');

switch (process.platform) {
    case 'darwin':
    case 'linux':
        ch.exec(
            'lp ' + pdf.filename, (e) => {
                if (e) {
                    throw e;
                }
            });
        break;
    case 'win32':
        ch.exec(
            'ptp ' + pdf.filename, {
                windowsHide: true
            }, (e) => {
                if (e) {
                    throw e;
                }
            });
        break;
    default:
        throw new Error(
            'Platform not supported.'
        );
}

我希望它有所帮助。

编辑: 您也可以使用 SumatraPDF for windows https://github.com/sumatrapdfreader/sumatrapdf

原文由 zer09 发布,翻译遵循 CC BY-SA 4.0 许可协议

最简单的方法是使用 PDF.js 将 PDF 页面渲染到页面上的各个画布元素,然后调用打印。

我修复了 这个要点 以使用它设计的 PDF.js 版本 (v1),这可能是一个很好的起点。

这本质上是 electron/chrome pdf 查看器正在做的,但现在您可以完全控制布局!

 <html>
<body>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/1.10.90/pdf.js"></script>
<script type="text/javascript">
function renderPDF(url, canvasContainer, options) {
    var options = options || { scale: 1 };

    function renderPage(page) {
        var viewport = page.getViewport(options.scale);
        var canvas = document.createElement('canvas');
        var ctx = canvas.getContext('2d');
        var renderContext = {
          canvasContext: ctx,
          viewport: viewport
        };

        canvas.height = viewport.height;
        canvas.width = viewport.width;
        canvasContainer.appendChild(canvas);

        page.render(renderContext);
    }

    function renderPages(pdfDoc) {
        for(var num = 1; num <= pdfDoc.numPages; num++)
            pdfDoc.getPage(num).then(renderPage);
    }
    PDFJS.disableWorker = true;
    PDFJS.getDocument(url).then(renderPages);
}
</script>

<div id="holder"></div>

<script type="text/javascript">
renderPDF('//cdn.mozilla.net/pdfjs/helloworld.pdf', document.getElementById('holder'));
</script>

</body>
</html>

原文由 Tim 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题