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

问题描述 投票:0回答:2

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

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

这里是main.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>

index.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

在第二次第一次提交时,一切正常,除非重新启动服务器,否则打印功能无论打印还是保存文件都无法正常工作。

我不知道怎么了?...如果不清楚,请告诉我。

所以请您帮我一下吗?

jquery node.js electron
2个回答
0
投票
您可能不需要进程间通信功能;您是否有任何理由

not禁用nodeIntegration吗?


0
投票
我用另一种方法解决了我的问题,是使用{ipcRenderer} = require('electron');

我找到了这个答案,对我来说非常有用How to print a DIV in ElectronJS

按下打印按钮以通过功能sendDataToServer(data)将内容发送到服务器端后的操作

main.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); })

index.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);

printApp.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>

© www.soinside.com 2019 - 2024. All rights reserved.