2016-06-04 12 views
11

sto cercando di convertire il mio web in un'applicazione realizzata in ElectronJSCome stampare un DIV in ElectronJS

nel mio web stampa un div con un codice a barre. questo funziona abbastanza bene, ma in electronjs non riesco a raggiungere questo.

originariamente userei questa funzione

$scope.printDiv = function (divName) { 
    var printContents = document.getElementById(divName).innerHTML; 
    var popupWin = window.open('', '_blank', 'width=500,height=500'); 
    popupWin.document.open(); 
    popupWin.document.write('<html><head><link rel="stylesheet" type="text/css" href="styles/main.css" type=\"text/css\" media=\"print\" /></head><body onload="window.print()">' + printContents + '</body></html>'); 
    popupWin.document.close(); 
} 

con electronjs

non so come passare l'oggetto da stampare.

anche io sto cercando di generare un PDF dal contenuto che posso caricare. ma i PDF sono corrotti

var windowPrint = require('electron').remote.BrowserWindow; 
    var fs = require('fs'); 
    var newWindow = new windowPrint({width: 800, height: 600, show: false}); 
    console.log(newWindow); 
    newWindow.loadURL('http://github.com'); 
    newWindow.show(); 
    newWindow.webContents.print({silent: true, printBackground: true}); 
    newWindow.webContents.printToPDF({printSelectionOnly : true, printBackground: true}, function (error, data) { 
     if (error) { 
      throw error; 
     } 
     console.log(error); 
     console.log(data); 
     fs.writeFile('print.pdf', function (data, error) { 
      if (error) { 
       throw error; 
      } 
      console.log(error); 
      console.log(data); 
     }); 
    }); 

c'è un modo semplice per stampare un DIV con electronjs?

grazie per la lettura.

+0

https://github.com/electron/electron-api-demos È possibile creare una finestra vuota invisibile che ricevono segnali (stringa HTML) dal processo principale e quindi stampa PDF. – Zen

+0

l'ho visto, ma questo crea solo un pdf? o anche inviare il comando di stampa? –

+0

Scusate per la mia risposta in ritardo, avete capito? – Zen

risposta

11

Questa pagina è stata stampata prima che il caricamento sia terminato.

Il mio approccio: 1. Creare un MainWindow e una finestra (invisibile) lavoratore

import {app, BrowserWindow, Menu, ipcMain, shell} from "electron"; 
const os = require("os"); 
const fs = require("fs"); 
const path = require("path"); 

let mainWindow: Electron.BrowserWindow = undefined; 
let workerWindow: Electron.BrowserWindow = undefined; 

async function createWindow() { 

    mainWindow = new BrowserWindow(); 
    mainWindow.loadURL("file://" + __dirname + "/index.html"); 
    mainWindow.webContents.openDevTools(); 
    mainWindow.on("closed",() => { 
     // close worker windows later 
     mainWindow = undefined; 
    }); 

    workerWindow = new BrowserWindow(); 
    workerWindow.loadURL("file://" + __dirname + "/worker.html"); 
    // workerWindow.hide(); 
    workerWindow.webContents.openDevTools(); 
    workerWindow.on("closed",() => { 
     workerWindow = undefined; 
    }); 
} 

// retransmit it to workerWindow 
ipcMain.on("printPDF", (event: any, content: any) => { 
    console.log(content); 
    workerWindow.webContents.send("printPDF", content); 
}); 
// when worker window is ready 
ipcMain.on("readyToPrintPDF", (event) => { 
    const pdfPath = path.join(os.tmpdir(), 'print.pdf'); 
    // Use default printing options 
    workerWindow.webContents.printToPDF({}, function (error, data) { 
     if (error) throw error 
     fs.writeFile(pdfPath, data, function (error) { 
      if (error) { 
       throw error 
      } 
      shell.openItem(pdfPath) 
      event.sender.send('wrote-pdf', pdfPath) 
     }) 
    }) 
}); 

2, mainWindow.html

<head> 
</head> 
<body> 
    <button id="btn"> Save </button> 
    <script> 
     const ipcRenderer = require("electron").ipcRenderer; 

     // cannot send message to other windows directly https://github.com/electron/electron/issues/991 
     function sendCommandToWorker(content) { 
      ipcRenderer.send("printPDF", content); 
     } 

     document.getElementById("btn").addEventListener("click",() => { 
      // send whatever you like 
      sendCommandToWorker("<h1> hello </h1>"); 
     }); 
    </script> 
</body> 

3, worker.html

<head> </head> 
<body> 
    <script> 
     const ipcRenderer = require("electron").ipcRenderer; 

     ipcRenderer.on("printPDF", (event, content) => { 
      document.body.innerHTML = content; 

      ipcRenderer.send("readyToPrintPDF"); 
     }); 
    </script> 
</body> 
+0

Grazie mille, questo mi aiuta molto. ma ho qualche domanda. invece di 'printToPdf()' funzionerà con solo 'print()' ?? –

+0

Non sono la stessa cosa. 'print()' è usato con una stampante. @PauloGaldoSandoval – Zen

+0

sì, questo è quello che cerco di raggiungere in un primo momento, ma stampare un PDF è anche funzionale per me. ma sto dicendo che se in questo modo ottengo il PDF posso inviare il comando di stampa. –

1

Grazie, lavora per la stampa con print() pure

ipcMain.on('print', (event, content) => { 
    workerWindow.webContents.send('print', content); 
}); 

ipcMain.on('readyToPrint', (event) => { 
    workerWindow.webContents.print({}); 
}); 

(eventi vengono rinominati di conseguenza)