Unser Problem ist, dass aus rechtlichen Gründen es ist nicht erlaubt, eine PDF-Datei vorübergehend auf der Festplatte zu speichern . Außerdem sollte nicht die gesamte Seite neu geladen werden, wenn ein PDF als Vorschau im Browser angezeigt wird.
Zuerst haben wir PDF.jS ausprobiert. Es funktionierte mit Base64 im Viewer für Firefox und Chrome. Allerdings war es für unsere PDF-Datei inakzeptabel langsam. IE/Edge funktionierte überhaupt nicht.
Deshalb haben wir es mit einer Base64-Zeichenkette in einem HTML-Objekt-Tag versucht. Dies funktionierte wiederum nicht mit IE/Edge (vielleicht das gleiche Problem wie bei PDF.js). In Chrome/Firefox/Safari wiederum kein Problem. Deshalb haben wir uns für eine Hybridlösung entschieden. IE/Edge verwenden wir einen IFrame und für alle anderen Browser das Object-Tag.
Die IFrame-Lösung würde natürlich auch für Chrome und Co. funktionieren. Der Grund, warum wir diese Lösung für Chrome nicht verwendet haben, ist, dass das PDF zwar korrekt angezeigt wird, Chrome stellt eine neue Anfrage an den Server, sobald Sie in der Vorschau auf "Download" klicken . Das erforderliche Hidden-Field pdfHelperTransferData (zum Senden unserer Formulardaten, die für die PDF-Erzeugung benötigt werden) ist nicht mehr gesetzt, da das PDF in einem IFrame angezeigt wird. Für diese Funktion/Fehler siehe Chrome sendet beim Herunterladen einer PDF-Datei zwei Anfragen (und bricht eine davon ab) .
Jetzt bleiben die Problemkinder IE9 und IE10. Für diese haben wir eine Vorschaulösung aufgegeben und senden das Dokument einfach durch Anklicken des Vorschau-Buttons als Download an den Benutzer (statt der Vorschau). Wir haben viel ausprobiert, aber selbst wenn wir eine Lösung gefunden hätten, hätte sich der Mehraufwand für diesen kleinen Teil der Nutzer nicht gelohnt. Unsere Lösung für den Download finden Sie hier: PDF-Download ohne Aktualisierung mit IFrame .
Unser Javascript:
var transferData = getFormAsJson()
if (isMicrosoftBrowser()) {
// Case IE / Edge (because doesn't recoginzie Pdf-Base64 use Iframe)
var form = document.getElementById('pdf-helper-form');
$("#pdfHelperTransferData").val(transferData);
form.target = "iframe-pdf-shower";
form.action = "serverSideFunctonWhichWritesPdfinResponse";
form.submit();
} else {
// Case non IE use Object tag instead of iframe
$.ajax({
url: "serverSideFunctonWhichRetrivesPdfAsBase64",
type: "post",
data: { downloadHelperTransferData: transferData },
success: function (result) {
$("#object-pdf-shower").attr("data", result);
}
})
}
Unser HTML:
<div id="pdf-helper-hidden-container" style="display:none">
<form id="pdf-helper-form" method="post">
<input type="hidden" name="pdfHelperTransferData" id="pdfHelperTransferData" />
</form>
</div>
<div id="pdf-wrapper" class="modal-content">
<iframe id="iframe-pdf-shower" name="iframe-pdf-shower"></iframe>
<object id="object-pdf-shower" type="application/pdf"></object>
</div>
Um den Browsertyp für IE/Edge zu überprüfen, siehe hier: Wie kann ich Internet Explorer (IE) und Microsoft Edge mit JavaScript erkennen? Ich hoffe, diese Erkenntnisse ersparen jemand anderem die Zeit.
9 Stimmen
Versuchen Sie pdf2htmlEX: github.com/coolwanglu/pdf2htmlEX
1 Stimmen
Es gibt einen großartigen Vergleich nicht nur von spezifischen Lösungen, sondern auch von allgemeinen Strategien, im Wiki des pdf2htmlEX-Repos . Außerdem habe ich es noch nicht ausprobiert, este scheint eine beibehaltene Abzweigung zu sein.