brauchen Nachdem der Benutzer das Formular ausgefüllt und auf Speichern geklickt hat, kann er das PDF-Dokument direkt herunterladen. Lösung Servergeneration Ideen Google Chrome entwickelte 2017 eigenständig die Chrome Headless-Funktion und brachte zeitgleich Puppeteer auf den Markt. Diese ist als Browser ohne Oberfläche zu verstehen, kann aber Serverfunktionen übernehmen. Daher können wir den Puppeteer-Browser auf dem Server starten, die Ziel-URL öffnen und die integrierte Konvertierungsfunktion des Chrome-Browsers verwenden, um HTML in PDF zu konvertieren. Server generiert Kerncode Zuerst müssen Sie Puppeteer installieren. Die NPM-Installation kann fehlschlagen. Am besten verwenden Sie zur Installation den Taobao-Spiegel von cnpm. Geben Sie Erstellen Sie eine JS-Datei, öffnen Sie einfach die URL mit dem Puppeteer-Browser und speichern Sie das PDF. // html2pdf.js const puppeteer = erfordern('puppeteer'); (asynchrone Funktion(){ // Starten Sie den Dienst const browser = await puppeteer.launch(); // Öffnen Sie die Registerkarte const page = await browser.newPage(); // Gehe zu dieser Adresse, warte auf page.goto('https://koa.bootcss.com/#context'); // HTML-Seite in PDF konvertieren und im Pfad speichern warte auf Seite.pdf({Pfad:"test.pdf",Format:'A4'}) // Browser schließen. await browser.close(); })(); Geben Sie dann Natürlich können Sie Modulmethoden auch mit module.export entsprechend der Geschäftslogik exportieren. Mangel Dynamische Formulardaten können nicht gespeichert werden Da die Seite vom Server angefordert wird, stellt das abgefangene PDF den Ausgangszustand der Seite ohne Ausfüllung dar, wenn die Benutzereingabe nicht unter der Anforderungsadresse gespeichert ist. Mit anderen Worten: Es können nur statische Seiten konvertiert werden, aber unsere Anforderungen erfordern eine Menge Benutzereingaben, sodass es erfolgreich ist. Der Client generiert den Kerncode Ideen
Mangel Verzerrung. Da es dem Aufnehmen eines Screenshots der Seite und dem anschließenden Einfügen des Screenshots in eine PDF-Datei ähnelt, können wir deutlich erkennen, dass sich die Auflösung und Konfiguration der Seite wahrscheinlich auf die Qualität des Ausgabebildes auswirken. Da es sich um einen Screenshot handelt, können gleichzeitig Funktionen wie Seitenverlinkungen verloren gehen. Textkürzung Wenn die Leinwand größer als eine PDF-Seite ist, ist die Ausgabe falsch. Zu diesem Zeitpunkt müssen wir feststellen, ob die Leinwand die Größe A4 überschreitet. Wenn ja, teilen Sie die Leinwand auf und fügen Sie sie in verschiedene Seiten ein. Jetzt tritt das Problem erneut auf. Da das Bild segmentiert ist, ist es sehr wahrscheinlich, dass das Bild oder der Text in zwei Hälften geschnitten wird, da wir die Struktur des Elements innerhalb der Leinwand nicht analysieren können. Kerncode Unsere Anforderungen umfassen keine Bilder und Links, sodass das Verzerrungsproblem kaum Auswirkungen auf uns hat. Gleichzeitig besteht unser Formular aus mehreren sich wiederholenden Elementen gleicher Länge, und diese Elemente sind sehr kurz und überschreiten nicht ein A4-Blatt (obwohl dies nicht streng ist, können Sie bei Bedarf die Breite und Höhe des DOM-Elements abrufen und entsprechend der Höhe des DOM-Elements zuschneiden). Daher plane ich, die Leinwand direkt nach Element aufzuteilen und jedes Element auf einer A4-Seite zu speichern. Bevor Sie beginnen, müssen Sie mehrere grundlegende Methoden verstehen: html2canvas // DOM ist der zu konvertierende DOM-Knoten html2canvas(DOM,{ Hintergrundfarbe: "#ffffff", Breite:Breite, Höhe:Höhe, Maßstab: 2, allowTaint:true, }).dann((Leinwand)=>{ // Canvas ist die Leinwand nach erfolgreicher Konvertierung}) // Eine Instanz erstellen let pdf = new jsPDF('','pt','a4'); // Bild zur PDF-Datei hinzufügen // Der erste Parameter ist das einzufügende Dateiformat (base64), der zweite ist das Dateiformat // Der dritte und vierte sind die Koordinaten der oberen linken Ecke des Bildes und die letzten beiden sind die Breite und Höhe des Bildes nach dem Einfügen pdf.addImage(image,'JPEG',10,10,height,width); // Neue Seite hinzufügen pdf.addPage() // PDF-Datei speichern pdf.save() Leinwand // Canvas ist das Bild, das zugeschnitten werden soll. // sx, sy sind die Koordinaten für den Beginn des Zuschneidens. // swidth, sHeight sind die Breite und Höhe des Zuschneidens. // dx, dy sind die Koordinaten zum Einfügen des zugeschnittenen Bildes in den Canvas. // sWidth, sHeight sind die Breite und Höhe des zugeschnittenen Bildes im Canvas. cxt.drawImage(canvas, sx, sy, sWidth, sHeight, dx, dy, sWidth, sHeight); /** * @description: Formular in PDF-Datei konvertieren* @return: pdf */ beim Absenden(){ // Dies ist das Formular, das ich konvertieren möchte. Es enthält viele identische Formulare. let form = this.$refs.form; // Breite und Höhe des Elements abrufen let width = form.getBoundingClientRect().width; let height = form.getBoundingClientRect().height; html2canvas(Formular,{ Hintergrundfarbe: "#ffffff", Breite:Breite, Höhe:Höhe, Maßstab: 2, allowTaint:true, }).dann((Leinwand)=>{ Fügt eine neue PDF-Datei hinzu, die mit der Funktion jsPDF('','pt','a4') identisch ist. // Bild ausschneiden let canvasList = this.splitCanvas(canvas,this.forms.length); // Durchlaufe die Canvas-Liste und füge jeder Seite ein Bild hinzu canvasList.forEach((item,index)=>{ //Konvertiere das Bildformat in Base64 let itemImage = item.toDataURL('image/jpeg',1.0); // 10 Pixel Rand freihalten, die Breite eines A4-Blatts beträgt 595 Pixel auf einem Monitor mit 72-Auflösung pdf.addImage(itemImage,'JPEG',10,10,575.28,575.28/item.width*item.height); // Wenn es nicht die letzte Seite ist, paginieren Sie den Index == this.forms.length-1 ? '' : pdf.addPage(); }) // Datei speichern let blob = pdf.output('blob'); pdf.save('test.pdf'); }) }, /** * @description: Leinwand ausschneiden * @param {number} num Anzahl der Scheiben * @param {canvas} Leinwand * @return {array} Canvas-Liste*/ splitCanvas(Leinwand,Anzahl){ sei Höhe = Leinwandhöhe, Breite = Leinwandbreite; let chunkHeight = height/num; // Die Höhe jedes Slices let chunkList = []; // Das Ergebnis-Canvas speichern für (lass i = 0; i < Höhe; i + = Blockhöhe) { // Position des Zuschneiderechtecks initialisieren let sx = 0,sy = i,sWidth = width,sHeight = chunkHeight,dx = 0, dy = 0; // Einen Canvas-Knoten erstellen let canvasItem = document.createElement("canvas"); // Leinwandgröße initialisieren canvasItem.height = chunkHeight; canvasItem.width = Breite; let cxt = canvasItem.getContext("2d"); // Fügen Sie das zugeschnittene Bild in den neuen Canvas-Knoten ein cxt.drawImage(canvas,sx,sy,sWidth,sHeight,dx,dy,sWidth,sHeight); chunkList.push(canvasItem); } gibt ChunkList zurück; }, Endergebnis Seite nach dem Speichern des Formulars Auswirkungen der Konvertierung in PDF Damit ist dieser Artikel über reine clientseitige und reine serverseitige Implementierungslösungen für HTML zu PDF abgeschlossen. Weitere relevante HTML zu PDF-Inhalte finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder durchsuchen Sie die verwandten Artikel weiter unten. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen! |
<<: Spezielle Methode zum Hinzufügen von Fremdschlüsseleinschränkungen in MySQL
>>: Docker Link realisiert die Containerverbindung
1. Docker-Installation und -Einstellungen #Instal...
In diesem Artikel wird der spezifische Code von J...
Inhaltsverzeichnis Vorwort 1. Einfügen von ignore...
Wenn Sie den FTP-Server häufig in Ihrem Studium o...
Vorwort Nginx ist ein auf Leistung ausgelegter HT...
1. Überprüfen Sie die maximale Anzahl geöffneter ...
Es gibt drei Hauptmethoden der MySQL-Replikation:...
Inhaltsverzeichnis Installieren Sie Tomcat Laden ...
So installieren Sie MySQL 5.7.18 unter Linux 1. L...
JavaScript kann viele tolle Dinge. Dieser Artikel...
Vorwort Ich möchte Ihnen zeigen, wie Sie ein Such...
Vorwort Unter Linux ist zum Kompilieren und Verkn...
Ich konnte nie herausfinden, ob der Port belegt i...
1, %, steht für beliebige 0 oder mehr Zeichen. Es...
<base target=_blank> ändert den Zielrahmen d...