电子转换PDF到文本

时间:2018-02-23 14:25:52

标签: pdf electron

我正在开发一个电子应用程序。应用程序应该接收PDF文件并转换为txt。我使用了lib PDF2JSON但是,如果与电子一起使用,它会产生以下工人错误:

Uncaught Error: No PDFJS.workerSrc specified

使用Electron将PDF转换为文本而不必重定向到外部服务器的最佳方法是什么?

  const {dialog} = require('electron').remote;
    const fs = require('fs');
    const PDFParser = require("pdf2json");

    const pdfParser = new PDFParser(this,1);



    document.getElementById('select-file').addEventListener('click',function(){
        dialog.showOpenDialog(function (fileNames) {
            if(fileNames === undefined){
                console.log("No file selected");
            }else{
                const file = fileNames[0];

                pdfParser.on("pdfParser_dataError", errData => console.error(errData.parserError) );
                pdfParser.on("pdfParser_dataReady", pdfData => {
                    fs.writeFile("content.txt", pdfParser.getRawTextContent());
                });

                pdfParser.loadPDF(file);

            }
        });
    },false);

2 个答案:

答案 0 :(得分:1)

我正在开发一个电子应用程序,但遇到了同样的问题(尝试读取PDF和“未指定PDFJS.workerSrc”),最后我明白了。我的想法和@ slowjack2k相同(但是没有coffeescript呵呵)。

首先,安装pdf2json

然后,在main.js中

const { ipcMain } = require( 'electron' );
const PDFParser = require( 'pdf2json' );

ipcMain.on( 'prefix-convert-pdf', ( event, file_base_path ) => {
    new PDFParser()
        .on( "pdfParser_dataError", errData => {
            event.sender.send( 'prefix-pdf-converted-error', errData );
        })
        .on( "pdfParser_dataReady", pdfData => {
            event.sender.send( 'prefix-pdf-converted', pdfData );
        })
        .loadPDF( file_base_path );
});

然后在renderer.js中

const { ipcRenderer } = require( 'electron' );

document.getElementById( 'the-button' ).addEventListener('click', () => {
    ipcRenderer.send( 'prefix-convert-pdf', 'C:\Users\user\Desktop\test\my-pdf.pdf' );
    // Better use require('path'), this is a simple way to understand how it works.
});

ipcRenderer
    .on( 'prefix-pdf-converted-error', ( event, errData ) => {
        console.error( errData );
        //do whatever you want in the DOM
    })
    .on( 'prefix-pdf-converted', ( event, pdfData ) => {
        console.log( pdfData );
        //do whatever you want in the DOM
    });

答案 1 :(得分:-1)

您的代码看起来像是在您的渲染器procress中执行所有pdf2json工作。在渲染器过程中,您没有可用的nodejs的完整功能集。

pdf2json到目前为止还没有设计在浏览器中运行。您可以通过将所有与pdf2json相关的内容放入渲染器进程来使其工作:

在渲染器Process(咖啡脚本)中:

{app, BrowserWindow, ipcMain} = require('electron')
PDFParser = require("pdf2json")

ipcMain.on 'convert-pdf', (event, path_to_file) ->
  console.log "Converting pdf " + path_to_file
  pdfParser = new PDFParser()

  pdfParser.on "pdfParser_dataError", (errData) ->
    console.error(errData.parserError)

  pdfParser.on "pdfParser_dataReady", (pdfData) =>
    console.log "sending data to renderer process"
    console.log JSON.stringify(pdfData)
    event.sender.send 'pdf-converted',  pdfData

    pdfParser.loadPDF(path_to_file)

在渲染器中:

<a href="#" id="convert-pdf"> doit </a> <span id="pdf-data">0</span>
  <script>
    const {ipcRenderer} = require('electron');
    let link = document.querySelector('#convert-pdf');
    link.addEventListener("click",function (event) {
        event.preventDefault();
        ipcRenderer.send('convert-pdf', '/the/file.pdf');
    },
    false);

    ipcRenderer.on('pdf-converted', (event, data) => {
      let span =  document.querySelector('#pdf-data');
      span.textContent=JSON.stringify(data);
    });
 </script>

您还使用remote来显示对话框(对话框是主要流程的一部分)。 remote只是以同步方式使用所有消息传递的快捷方式。您可以使用ipcRenderer.sendSync实现相同的目标,并从主要操作中更清楚地分离渲染器操作。