电子js和node中的Jquery.js仅在运行服务器时打印和保存PDF文件一次



我正在尝试为学生注册表创建一个动态模板,我正在尝试打印它,

问题是第一次按下打印按钮时,它会打印并且一切正常,但是第二次之后它不起作用,直到重新启动服务器本身,尽管它显示了打印窗口。

这是主要的.js

$('#elemID').submit(function(e) {
e.preventDefault();
var x = $('#numberOfStudents').val();
var output = [];
for (var i = 1; i <= x; i++) {
output.push(`<div><p> student number #0${i} </p></div>`);
}
var data = `
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.4.1/semantic.min.css">
</head>
<body>
<h4>Registation Form</h4>
<h5>Full Name:</h5>
<h5>gender:</h5>
.
.
.
</body>
</html>
`
$.print(data);
})

print.ejs

<form id="elemID">
<input type="number" id="numberOfStudents" placeholder="Number of students eg. 1....2....3">
<button type="submit" id="printApplication">Print Application</button>
</form>

索引.js(服务器端(

const {app, BrowserWindow, Menu } = require('electron')

// express
const express = require('express'),
expApp = express(),
server = require('http').createServer(expApp),
db = require('./db/mongoose'),
parentRoutes = require('./routes/parents'),
studentRoutes = require('./routes/students'),
port = process.env.PORT || 3000
let mainWindow
// load the url on listening
function onListening() {
mainWindow.loadURL('http://localhost:3000')
}
// Function create a window
function createWindow() {
// create a new window for main window
mainWindow = new BrowserWindow({
webPreferences: {
nodeIntegration: true
}
})
// express usage
expApp.set('port', port)
expApp.use(parentRoutes)
expApp.use(studentRoutes)
expApp.use(express.static('../semantic'))
// listening to port
server.listen(port, () => {console.log(`listening to port ${port}`);})
server.on('listening', onListening)
}
app.on('ready', createWindow);

我正在使用jquery.print.js

在第二次第一次提交ut时一切正常,打印功能在打印或保存文件时不起作用,除非我重新启动服务器。

我不知道怎么了?...如果有什么不清楚的地方,请告诉我。

所以你能帮我吗?

您可能不需要进程间通信功能; 您有任何理由禁用nodeIntegration吗?

我用另一种方式解决了我的问题,那就是使用{ipcRenderer} = require('electron');

我找到了这个答案,它对我来说非常有用 如何在电子JS中打印DIV

按下打印按钮通过功能将内容发送到服务器端后我做了什么sendDataToServer(data)

主.js

// create a function to send data to server.
function sendDataToServer(content) {
ipcRenderer.send('printPDF', content);
}
$('#elemID').submit(function(e) {
e.preventDefault();
var x = $('#numberOfStudents').val();
var output = [];
for (var i = 1; i <= x; i++) {
output.push(`<div><p> student number #0${i} </p></div>`);
}
var data = `
<h4>Registation Form</h4>
<h5>Full Name:</h5>
<h5>gender:</h5>
.
.
.
`
// call the function
sendDataToServer(data);
})

索引.js(服务器端(

const {app, BrowserWindow, Menu } = require('electron')

// express
const express = require('express'),
expApp = express(),
server = require('http').createServer(expApp),
db = require('./db/mongoose'),
parentRoutes = require('./routes/parents'),
studentRoutes = require('./routes/students'),
port = process.env.PORT || 3000
let mainWindow
// load the url on listening
function onListening() {
mainWindow.loadURL('http://localhost:3000')
}
// Function create a window
function createWindow() {
// create a new window for main window
mainWindow = new BrowserWindow({
webPreferences: {
nodeIntegration: true
}
})
//create hidden window 
win = new BrowserWindow({
show: false,
webPreferences: {
nodeIntegration: true
}
});
// hide the hidden window on ready to show
win.once('ready-to-show', () => win.hide())
win.loadURL('file://' + views + '/printApp.html');
// send data to hidden window
ipcMain.on('printPDF', (event, content ) => {
win.webContents.send('printPDF', content);
});
// create the pdf and printing options once hidden window finish rendering
ipcMain.on('readyToPrintPDF', (e) => {
const pdfPath = path.join(os.tmpdir(), 'print.pdf');
// Use default printing options
win.webContents.print({}, function (err, data) {
if (err) throw err
fs.writeFile(pdfPath, data, function (error) {
if (error) throw error
shell.openItem(pdfPath)
event.sender.send('wrote-pdf', pdfPath)
})
})
})
// express usage
expApp.set('port', port)
expApp.use(parentRoutes)
expApp.use(studentRoutes)
expApp.use(express.static('../semantic'))
// listening to port
server.listen(port, () => {console.log(`listening to port ${port}`);})
server.on('listening', onListening)
}
app.on('ready', createWindow);

打印应用.html

<head>
<link rel="stylesheet" href="./css/main.css">
</head>
<body>
<script>
const ipcRenderer = require('electron').ipcRenderer;
ipcRenderer.on('printPDF', (e, content) =>{
document.body.innerHTML = content;
// I set a timeout to take time for rendering the page
setTimeout(() => {
ipcRenderer.send('readyToPrintPDF')
}, 2000)
})
</script>
</body>

最新更新