我正在开发一个电子应用程序。应用程序应该接收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);
答案 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
实现相同的目标,并从主要操作中更清楚地分离渲染器操作。