Unser Problem ist, dass wir aus rechtlichen Gründen keine PDF-Dateien vorübergehend auf der Festplatte speichern dürfen . Außerdem sollte nicht die gesamte Seite neu geladen werden, wenn eine PDF-Datei als Vorschau im Browser angezeigt wird.
Zuerst haben wir PDF.jS ausprobiert. Es funktionierte mit Base64 im Viewer für Firefox und Chrome. Für unser PDF war es jedoch inakzeptabel langsam. IE / Edge hat überhaupt nicht funktioniert.
Wir haben es daher mit einer Base64-Zeichenfolge in einem HTML-Objekt-Tag versucht. Dies funktionierte wiederum nicht für IE / Edge (möglicherweise das gleiche Problem wie bei PDF.js). In Chrome / Firefox / Safari wieder 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 Objekt-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 Chrome zwar korrekt angezeigt wird, Chrome jedoch eine neue Anfrage an den Server sendet, sobald Sie in der Vorschau auf "Herunterladen" klicken . Das erforderliche versteckten Feldern pdfHelperTransferData (zum Senden unserer für die PDF-Generierung erforderlichen Formulardaten) ist nicht mehr festgelegt, da das PDF in einem IFrame angezeigt wird. Für diese Funktion / diesen Fehler sieheChrome sendet beim Herunterladen einer PDF-Datei zwei Anfragen (und bricht eine davon ab) .
Jetzt bleiben die Problemkinder IE9 und IE10 bestehen. Für diese haben wir eine Vorschau-Lösung aufgegeben und das Dokument einfach durch Klicken auf die Vorschau-Schaltfläche als Download an den Benutzer (anstelle der Vorschau) gesendet. Wir haben viel versucht, aber selbst wenn wir eine Lösung gefunden hätten, wäre der zusätzliche Aufwand für diesen winzigen Teil der Benutzer den Aufwand nicht wert gewesen. Unsere Lösung für den Download finden Sie hier: Laden Sie PDF ohne Aktualisierung mit IFrame herunter .
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>
Informationen zum Überprüfen des Browsertyps für IE / Edge finden Sie hier: Wie kann ich Internet Explorer (IE) und Microsoft Edge mithilfe von JavaScript erkennen? Ich hoffe, dass diese Erkenntnisse jemand anderem die Zeit sparen.