我正在开发一个电子应用程序。应用程序应该接收PDF文件并转换为txt。我使用了库PDF2JSON,但是,如果和电子一起使用,它会给出以下worker错误:
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);发布于 2019-01-14 23:23:19
我正在开发一个电子应用程序,我也有同样的问题(试着读一个PDF和'No PDFJS.workerSrc specified‘),最后我得到了它。我做了与@slowjack2k相同的想法(但没有coffeescript hehe)。
首先,安装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
});发布于 2018-02-25 19:29:53
你的代码看起来像是在你的渲染器处理器中做所有的pdf2json工作。在渲染器进程中,您无法获得nodejs的完整功能集。
到目前为止,pdf2json还没有被设计为在浏览器中运行。你可以通过将所有与pdf2json相关的东西放到你的渲染器进程中来让它工作,如下所示:
在渲染器进程中(咖啡脚本):
{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实现相同的效果,并更清晰地将渲染器操作与主操作分开。
https://stackoverflow.com/questions/48950033
复制相似问题