Drucken einer PDF-Datei mit Elektronen-JS
Ich versuche zu erstellen, die ein Elektron JS-app, die den Zweck hat drucken letter-Format in PDF-Dateien.
Dies ist mein code-snippet für den Druck:
win = new BrowserWindow({
width: 378,
height: 566,
show: true,
webPreferences: {
webSecurity: false,
plugins: true
}
});
//load PDF
win.loadURL('file://' + __dirname + '/header1_X_BTR.pdf');
//if pdf is loaded start printing
win.webContents.on('did-finish-load', () => {
win.webContents.print({silent: true, printBackground:true});
});
Meine Fragen sind: wenn ich print({silent:true})
mein Drucker druckt eine leere Seite. Wenn ich print({silent:false})
, der Drucker druckt in der gleichen Weise wie der screenshot, mit Kopf, Kontrollen, etc.
Brauche ich eine unbeaufsichtigte drucken von PDF-Inhalt, und ich kann nicht es tun, zu verwalten, für Tage. Hat jemand die gleiche Erfahrung mit Elektron?
- Laden Sie bitte Ihren Reproduktion-code auf einer
git
repository. Mit einem Nachdruck, ich kann Ihnen helfen, besser. - Heyho, da Electronjs ist sehr buggy, was den oben Nodejs, würde ich vorschlagen, zu versuchen, die Antwort für "so drucken Sie PDF-in Nodejs-app". Sie haben, um zu laichen der neuen Kind-Prozess auf den hintergrund und versuche für die Verwendung von externen Tools (für das, was Sie haben zu prüfen, die Plattform natürlich wie darwin vs win).
- Ich glaube, ich überdachte die Optionen, in meine Antwort.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie bereits über die pdf-Datei oder speichern Sie das pdf vor dem drucken", ich Annahme es ist", dann kannst du dir den Speicherort der Datei, dann können Sie externe Prozess zu tun, der Druck über
child_process
.Können Sie
lp command
oder PDFtoPrinter für windowsIch hoffe, es hilft.
Edit:
Sie können auch SumatraPDF für windows https://github.com/sumatrapdfreader/sumatrapdf
LPR
unmittelbare Druck erfordert eine PDF-fähigen Drucker die meisten Drucker nicht. SumatraPDF ist möglicherweise eine option, obwohlPdfiumViewer
scheint besser positioniert sein, gegenüber dieser Aufgabe.lp
undptp
können ersetzt werden durch andere Befehl/software, die Sie wollen, zu tun, die Druckindustrie, die nur spawn anderen Prozess. Und ich denke auch auf modernen system, jetzt sind die meisten von Ihnen verwendenCUPS
stattLPR
, korrigiert mich wenn ich falsch bin.Der einfachste Weg, dies zu tun ist, um das Rendern der PDF-Seiten, um einzelne canvas-Elemente auf einer Seite verwenden PDF.js und rufen Sie dann "drucken".
Ich fest diese gist zu verwenden PDF.js version (v1) für die es entworfen wurde und die wahrscheinlich ein guter Ausgangspunkt.
Dies ist im wesentlichen, was der Elektron/chrome pdf viewer tut, aber jetzt haben Sie die volle Kontrolle über das layout!
HTML:
printToPdf
api und verwenden Sie dann dieses, um eine Vorschau anzuzeigen inline mit unseren UI, bevor das speichern in einer Datei oder der Ausgabe auf Drucker. Es ist super leistungsfähig und flexibel.Ich bin vor dem gleichen Problem. Es erscheint die PDF-Datei auf einen Drucker drucken, wird einfach nicht umgesetzt Elektron, obwohl es angefordert wurde seit 2017. Hier ist eine weitere Frage im Zusammenhang mit auf SO und den feature request auf GitHub:
Eine mögliche Lösung ist die Verwendung von Google PDFium und eine Verpackung NodeJS-library, das erscheint, ermöglichen die Konvertierung von PDF in eine Reihe von EMF, so dass die EMF gedruckt werden kann auf einer lokalen/Netzwerk-Drucker, zumindest unter Windows.
Als eine weitere sinnvolle option, diese Antwort bietet eine einfache C# - Lösung für PDF-Druck mit PdfiumViewer, das ist ein PDFium-wrapper-Bibliothek für .NET.
Ich bin sill Blick auf andere Optionen. Die Verwendung eines lokal installierten Instanz von Acrobat Reader für den Druck ist keine akzeptable Lösung für uns.
AKTUALISIERT. Für jetzt, PDF.js löst das problem mit dem Rendern/Vorschau der einzelnen Seiten, aber drucken selbst, es scheint Elektron (zum Zeitpunkt dieses Postings) fehlt einfach der richtige Druck-APIs. E. g., Sie können nicht festlegen Papierformat/Querformat hochformat-Modus, etc. Außerdem, beim drucken, PDF.js produziert gerasterte Ausdrucke - Dank, wie sich HTML5-canvas-Arbeit - im Gegensatz zu wie Chrome PDF Viewer funktioniert es. Hier ist eine Diskussion von einigen anderen PDF.js Mängel.
Also ich denke, dass wir gehen könnten mit einer Kombination von PDF.js (für UI in der Elektronen-Renderer-Prozess) und PDFium (für den eigentlichen Druck aus dem Main-Prozess).
Basierend auf Tim ' s Antwort, hier eine version des PDF.js renderer mit ES8
async/await
(unterstützt die aktuelle version von Elektronen):Seit Ihr mit
contents.print([options], [callback])
ich davon aus, dass Sie wollen, auf Papier zu drucken und nicht auf Ihrer Festplatte.Die Antwort auf Ihre Frage ist einfach. Es ist der Fall, Sie hören auf, die den Fehler verursacht. Also, wenn du einfach so machen:
alles wird funktionieren, wenn der Standard-Drucker ist der richtige. Ich habe dies testen, und es wird seinen job tun, mehr oder weniger. Sie können ändern, mein Ereignis, um welches Ereignis Sie auch immer Aussehen mag, das wichtigste Teil ist die Wartezeit mit setTimeout. Die PDF-Datei, die Sie versuchen zu drucken, wird einfach nicht in den Rahmen, wenn mit
silent:true
.Aber lassen Sie mich ins detail, hier ein bisschen, um die Dinge klar:
Elektrons laden von Dateien oder URLs in einem Fenster erstellt (
BrowserWindow
), die an Ereignisse gebunden. Das problem ist, dass jedes Ereignis "kann" sich anders Verhalten auf verschiedenen Systemen.Wir müssen damit Leben und können diese nicht ändern leicht. Aber zu wissen, dies wird Ihnen helfen zu verbessern die Entwicklung von kundenspezifischen Apps.
Wenn Sie urls laden oder htmls funktioniert alles ohne irgendwelche custom-Optionen. Mit PDFs als Quelle haben wir die Verwendung dieses:
Hinweis: ohne
webPreferences: { plugins: true }
Ihre Quell-PDF wird heruntergeladen statt der geladenen in das Fenster.Sagte, dass Sie laden Sie Ihre PDF-Datei in der
webContents
Ihrem Fenster. So haben wir das lauschen auf Ereignisse kompatibel mitBrowserWindow
. Sie hat alles richtig gemacht, der einzige Teil, den Sie verpasst haben, war, dass das drucken ist eine andere Schnittstelle.Druck erfassen Ihre
webContents
wie es ist, wenn Sie drücken Sie auf "drucken". Dies ist eine sehr wichtige, zu wissen, Wann die Arbeit mit Drucker. Denn wenn etwas lädt etwas länger auf ein anderes system, beispielsweise der PDF-viewer wird noch dunkelgrau, ohne die Buchstaben, dann ist dein Druck drucken Sie die dunklen, grauen hintergrund, oder auch die Tasten.Das kleine Problem ist leicht behoben mit
setTimeout()
.Nützlich, Q&Eine für den Druck mit Elektronen:
Allerdings gibt es viel mehr mögliche Probleme mit dem drucken, da die meisten der code wird hinter verschlossenen Türen ohne weltweit APIs zu verwenden. Nur Bedenken Sie, dass jeder Drucker anders Verhalten können, also Tests auf mehreren Rechnern helfen.
So scheint es, wie Sie versuchen, laden Sie die pdf-Datei, sondern drucken eine pdf-Datei des aktuellen Bildschirm, das ist, was
print
versucht zu tun. Als solche haben Sie ein paar Optionen.1) Deaktivieren Sie die native pdf-viewer in Elektron:
Wenn Sie kümmern sich nicht um die Elektron-Fenster und zeigt die pdf-Datei, deaktivieren Sie die native pdf-viewer in Elektron sollte stattdessen führen Sie zu behandeln die Datei als download und versuchen, download.
Möglicherweise möchten Sie auch zur Kasse Elektronen DownloadItem api zu tun, eine manipulation auf, wo die Datei gespeichert werden soll.
2) Laden Sie die pdf-Datei durch eine andere api
Ich bin nicht gonna geben alle Besonderheiten, die für diese ein, weil Sie sollten in der Lage sein, Informationen zu finden, diese selbst, aber im Grunde, wenn Sie möchten, laden Sie die Datei von irgendwo, dann können Sie einige andere download-API wie eine AJAX-Bibliothek, um die Datei herunterzuladen und speichern Sie es irgendwo. Dies würde möglicherweise erlauben Ihnen, um das Dokument zu Rendern in ein Elektron-Fenster als gut, da einmal initiieren Sie den download können Sie wahrscheinlich leiten Sie die Fenster, um die pdf-url und die native viewer umgehen.
Lange Geschichte kurz zu, es klingt für mich wie Sie don ' T wirklich wollen, um zu drucken, vom Elektron, Sie wollen einfach nur, um speichern Sie die pdf Datei, die Sie anzeigen. Drucken von Elektronen wird wiedergeben, was Sie auf dem Bildschirm sehen, nicht das pdf-Dokument selbst, so dass ich denke, dass Sie nur falsch verstanden, was das Ziel der print war. Hoffentlich hilft dir, viel Glück!
=== EDIT ===
Leider, ich glaube nicht, dass es einen Weg gibt, um die Datei zu drucken, die direkt von Elektronen, da Elektronen-Druck ist für den Druck der Inhalt der Elektronen-display. Aber Sie sollten in der Lage sein, um die Datei herunterzuladen, die über eine einfache Anfrage für die Datei (siehe oben).
Meine Empfehlung für Sie wäre, eine Seite zu erstellen für die Vorschau der Datei. Dies wäre eine unabhängige Seite, nicht die eingebaute pdf-viewer. Sie können dann legen Sie einen button irgendwo auf der Seite zum download der pdf über einige Mittel, und überspringen Sie die Position speichern aufgefordert (dies sollte einfach genug zu finden-Dokumentation).
Dann, um Ihre Vorschau, auf der gleichen Seite können Sie eine
Webansicht
- tag in Ihre Seite, die Anzeige der nativen pdf-viewer. Um für die native pdf-viewer, um die Arbeit in der webview-tag, Sie muss gehören dieplugins
- Attribut im-tag. Es ist ein Boolesches tag, so ist es bloße Anwesenheit ist alles, was benötigt wird, wie<webview ... plugins>
Dadurch wird der Plug-in-Unterstützung für das webview die renderer, die erforderlich ist für den pdf-viewer.Können Sie ändern die Größe styling an diesem tag auf der Seite, wie Sie möchten, um Ihre Bedürfnisse anzupassen. Ein trick, um loszuwerden, die download-und Druck-Optionen, so dass Benutzer können nicht drücken Sie anfügen
#toolbar=0
an das Ende des pdf-url um zu verhindern, dass der native pdf-viewer die Anzeige der oberen Symbolleiste mit diesen Tasten.So, auf diese Weise können Sie Ihre Vorschau, sicherzustellen, dass der Benutzer kann nicht mit dem eingebauten download-oder drucken von pdf-viewer mit dem extra ui, und Sie können weitere hinzufügen-Schaltfläche, um es herunterzuladen, so kann es später gedruckt werden.
#toolbar=0
etc.. das funktioniert für HTML aber funktioniert nicht für PDF, es druckt nur die aktuelle Ansicht (eine einzelne Seite), selbst wenn Sie ausblenden des UI. Oder vielleicht sind wir etwas fehlt. In dem Fall könnte Sie veröffentlichen, eine version, die korrekt funktioniert, ist unter OP-code als Basis? Danke.toolbar=0
ist nur zu verhindern, dass der Nutzer durch das herunterladen der PDF-viewer dient als Vorschau in der webview