Empfohlene Möglichkeit, PDF in HTML einzubetten?


1181

Was ist die empfohlene Methode zum Einbetten von PDF in HTML?

  • iFrame?
  • Objekt?
  • Einbetten?

Was sagt sich Adobe dazu?

In meinem Fall wird das PDF im laufenden Betrieb generiert, sodass es vor dem Leeren nicht auf eine Drittanbieterlösung hochgeladen werden kann.


6
Versuchen Sie pdf2htmlEX: github.com/coolwanglu/pdf2htmlEX
Tezcat

Im Wiki des pdf2htmlEX-Repos gibt es einen großartigen Vergleich nicht nur spezifischer Lösungen, sondern allgemeiner Strategien . Auch wenn ich es nicht versucht haben, dies scheint eine gepflegte Gabel zu sein.
ShreevatsaR

Antworten:


541

Der wahrscheinlich beste Ansatz ist die Verwendung der PDF.JS- Bibliothek. Es ist ein reiner HTML5 / JavaScript- Renderer für PDF-Dokumente ohne Plugins von Drittanbietern.

Online-Demo: http://mozilla.github.com/pdf.js/web/viewer.html

GitHub: https://github.com/mozilla/pdf.js


12
Wie in einer anderen Antwort erwähnt, verwendet scribd tatsächlich pdf2swf, um PDF-Dateien zu konvertieren
Peter Craig

8
Ich empfehle dringend, scribd nicht zu verwenden. Ich habe gerade ein Experiment mit einem bestimmten Dokument durchgeführt und in Firefox 4 werden nur die ersten drei Seiten angezeigt, während in IE9 der Rendering-Text falsch ist und einige Abschnitte der Seite versetzt sind. Technisch gesehen ist es also fehlerhaft. Außerdem erwarten sie, dass Sie Dokumente zum Drucken oder Herunterladen abonnieren! Im Wesentlichen nehmen sie zuvor kostenlose Dokumente und errichten eine Paywall um sie herum.
Frankster

9
Die PDF.js-Bibliothek scheint tatsächlich eine sehr gute Lösung zu sein, obwohl die verknüpfte Demo nicht zeigt, dass sie in eine Seite eingebettet ist (sie nimmt die gesamte Seite ein). Da jedoch HMTL5-Canvas verwendet wird, sollte es einfach einzubetten sein und es ist schnell . Auf der anderen Seite dauert es einige js, im Gegensatz zu <object>: github.com/mozilla/pdf.js/blob/master/examples/helloworld/…
LarsH

33
pdf.js funktioniert in Tablet-Browsern wie Chrome schlecht. Ich finde es auch sehr, sehr langsam für größere PDF-Dokumente.
Rocco The Taco

10
Ich kann nicht glauben, dass dies empfohlen wird. Schauen Sie sich die Schriftwiedergabe in der Online-Demo an, sie sehen zackig und schrecklich aus. Beim Subpixel-Rendering sieht es viel besser aus, wenn es im Adobe Reader geöffnet wird.
Speedplane

531

Dies ist schnell, einfach und auf den Punkt gebracht und erfordert kein Skript von Drittanbietern:

<embed src="http://example.com/the.pdf" width="500" height="375" 
 type="application/pdf">

UPDATE (1/2018):

Der Chrome-Browser unter Android unterstützt keine PDF-Einbettungen mehr. Sie können dies mithilfe des Google Drive PDF-Viewers umgehen

<embed src="https://drive.google.com/viewerng/
viewer?embedded=true&url=http://example.com/the.pdf" width="500" height="375">

30
Verwenden Sie besser ein <Objekt> -Tag, damit Sie einen Fallback einfügen können.
Jonathon Hill

1
Ich dachte, Entwickler würden wissen wollen, dass Mac / Firefox ein kaputtes Plugin-Image bekommt. Die Plugin-Seite lädt das gesuchte Plugin nicht. Irgendwelche Ideen, wie man das umgehen kann?
Shanimal

62
Wenn Sie sicherstellen möchten, dass es angezeigt wird, anstatt das PDF automatisch herunterzuladen (wie es mir passiert ist), fügen Sie type='application/pdf'es dem eingebetteten Tag hinzu
Hassek

31
Verwenden Sie das <object>Tag besser, da es alternative Inhalte in Browsern anzeigen kann, in denen keine PDFs angezeigt werden können. Kann sogar ein <embed>Tag in ein <object>Tag einfügen, wenn Sie möchten. Ref: stackoverflow.com/questions/1244788/embed-vs-object
Raphael

1
@raphaelcm Wie ich bereits sagte, funktioniert die Verwendung des eingebetteten Tags in allen gängigen Browsern. Sogar IE 7 & 8.
Batfan

361

Zu diesem Zweck können Sie auch den Google PDF Viewer verwenden. Soweit ich weiß, handelt es sich nicht um eine offizielle Google-Funktion (irre ich mich?), Aber sie funktioniert für mich sehr gut und reibungslos. Sie müssen Ihr PDF vorher irgendwo hochladen und einfach die URL verwenden:

<iframe src="http://docs.google.com/gview?url=http://example.com/mypdf.pdf&embedded=true" style="width:718px; height:700px;" frameborder="0"></iframe>

Wichtig ist, dass kein Flash Player benötigt wird, sondern JavaScript verwendet wird.


29
Eine Sache, die erwähnt werden sollte, ist, dass es eine Obergrenze für die Größe der PDF gibt, die angezeigt werden kann. Ich denke, es sind derzeit 10 MB / 100 Seiten. PS: Ich denke nicht, dass der Zuschauer "inoffiziell" ist; Sie haben sogar eine How-to-Seite, die die eingebettete URL für Sie erstellt: docs.google.com/viewer
SuperElectric

30
Diese Option funktioniert hervorragend, aber Sie müssen Ihre PDFs öffentlich zugänglich machen, was für mich nicht immer eine Option ist.
KoviNET

4
@riot_starter Diese Lösung funktioniert nicht mehr. Wenn Sie vollständig von Google abgemeldet sind, wird sie problemlos geladen. Wenn Sie vollständig angemeldet sind, wird sie problemlos geladen. Wenn Sie sich jedoch dazwischen befinden (was auch immer das bedeutet), werden Sie nach Ihrem Kennwort gefragt. Und im Fall des Iframes wird es einfach nicht geladen.
dwenaus

5
Sie sind berechtigt , die Privatsphäre aller Google Text & Tabellen setzen zwischen public, sign-in requiredund private. Es ist definitiv eine offizielle Funktion, wenn man bedenkt, dass jedes Dokument in Google Text & Tabellen eine embedOption hat.
b1nary.atr0phy

6
Eine andere Sache, die erwähnt werden sollte, ist die Warnung "Sie haben in letzter Zeit zu viele Anfragen gestellt", was eine Einschränkung darstellt.
kommradHomer

116

Sie haben eine gewisse Kontrolle darüber, wie die PDF-Datei im Browser angezeigt wird, indem Sie einige Optionen in der Abfragezeichenfolge übergeben. Ich war mit dieser Arbeit zufrieden, bis mir klar wurde, dass sie in IE8 nicht funktioniert. :(

Es funktioniert in Chrome 9 und Firefox 3.6, aber in IE8 wird die Meldung "Fügen Sie hier Ihre Fehlermeldung ein, wenn das PDF nicht angezeigt werden kann" angezeigt.

Ich habe jedoch noch keine älteren Versionen der oben genannten Browser getestet. Aber hier ist der Code, den ich trotzdem habe, falls er jemandem hilft. Dadurch wird der Zoom auf 85% eingestellt und Bildlaufleisten, Symbolleisten und Navigationsfenster werden entfernt. Ich werde meinen Beitrag aktualisieren, wenn ich auf etwas stoße, das auch im IE funktioniert.

<object width="400" height="500" type="application/pdf" data="/my_pdf.pdf?#zoom=85&scrollbar=0&toolbar=0&navpanes=0">
    <p>Insert your error message here, if the PDF cannot be displayed.</p>
</object>

6
Dies ist die beste Lösung, da die Browserfunktionen verwendet werden und keine komplizierte Lösung von Drittanbietern. In allen modernen Browsern (IE9, FF oder Chrome) sollte PDF gut eingebettet sein. Entschuldigung für IE 6/7 Benutzer. Sie müssen upgraden. Wir haben vor langer Zeit aufgehört, diese Browser zu unterstützen. :(
Adrian P.

2
Funktioniert nicht auf meiner mobilen Tablet-Edition von Chrome. Zu Ihrer Information ... Schade, wäre eine schnelle Lösung gewesen.
Rocco The Taco

1
+1 für die Adressierung von Zoom- und Bildlaufoptionen funktioniert dies jedoch nicht in der neuesten Chrome-Version (44) ... PDF-Dokument konnte nicht geladen werden.
NotJay

Ist es möglich, eine Schaltfläche zum Schließen hinzuzufügen? und wie?
Roberto Sepúlveda Bravo

@RoccoTheTaco Seconded, funktioniert nicht auf Mobile Chrome auf Android
Anonymous

66

Mit beiden <object>und <embed>geben Ihnen eine größere Breite der Browser - Kompatibilität.

<object data="http://yoursite.com/the.pdf" type="application/pdf" width="750px" height="750px">
    <embed src="http://yoursite.com/the.pdf" type="application/pdf">
        <p>This browser does not support PDFs. Please download the PDF to view it: <a href="http://yoursite.com/the.pdf">Download PDF</a>.</p>
    </embed>
</object>

4
Dies funktioniert nicht in Browsern, wenn das PDF-Addon nicht installiert oder veraltet ist
Umair Hamid

Dies gilt auch nicht für diejenigen, die sich mit der Codeüberprüfung befassen.
NotJay

1
Dies hat bei mir sehr gut funktioniert, während die Verwendung des embedTags für sich unsafeund Chrome und Firefox als wichtig erachtet wurde.
Richie Thomas

1
Aus irgendeinem Grund wird das PDF unter Android (Chrome) nicht eingebettet und stattdessen zum Herunterladen angeboten. Auf dem iPhone (Safari) wird nur die erste Seite des PDF angezeigt.
Ivan Rubinson

21

Konvertieren Sie es über ImageMagick in PNG und zeigen Sie das PNG an (schnell und schmutzig).

<?php
  $dir = '/absolute/path/to/my/directory/';
  $name = 'myPDF.pdf';
  exec("/bin/convert $dir$name $dir$name.png");
  print '<img src="$dir$name.png" />';
?>

Dies ist eine gute Option, wenn Sie eine schnelle Lösung benötigen, Probleme mit der browserübergreifenden PDF-Anzeige vermeiden möchten und wenn die PDF-Datei nur ein oder zwei Seiten umfasst. Natürlich muss ImageMagick auf Ihrem Webserver installiert sein (was wiederum Ghostscript erfordert), eine Option, die in gemeinsam genutzten Hosting-Umgebungen möglicherweise nicht verfügbar ist. Es gibt auch eine PHP - Plugin (genannt imagick) , dass Werke wie diese , aber es hat seine eigene spezielle Anforderungen sind.


Oder konvertieren Sie das Bild mit einer Anwendung wie Preview auf dem Mac in PNG.
Garrett

2
Aber können Sie das programmgesteuert tun?
Dan Mantyla

Was ist, wenn das Dokument mehr als eine Seite hat? Ich denke, Sie werden dann nur die erste Seite zeigen
seb

@seb es ist schon eine Weile her, aber ich konnte es für 2 oder 3 seitenlange PDFs verwenden. Es wäre nicht ratsam, viel größer zu werden. Ich denke, mobile Browser haben es schwer, solche Bilder anzuzeigen. Aus diesem Grund habe ich es die "schnelle und schmutzige" Methode genannt, aber ich denke, es ist eine gute Methode, solange das PDF nicht mehr als ein paar Seiten umfasst.
Dan Mantyla

1
Wenn Sie die PDF-Datei mit der Zend-Bibliothek öffnen, können Sie eine foreach($pdf->pages as $page) für jede Seite ein Bild erstellen
99 Probleme - Die Syntax ist nicht

19

Suchen Sie nach diesem Code, um das PDF in HTML einzubetten

<!-- Embed PDF File -->
<object data="YourFile.pdf" type="application/x-pdf" title="SamplePdf" width="500" height="720">
    <a href="YourFile.pdf">shree</a> 
</object>

6
Das scheint nicht zu funktionieren. Am Ende habe ich immer einen leeren grauen Bildschirm anstelle des PDFs. Aber das Umschalten srcfür data, wie in @ Gayles Antwort, funktioniert.
Mottie

1
Ich verwende Chrome 44 und es wird nicht funktionieren. Ich habe auch versucht, Daten auf src umzuschalten.
NotJay

type = "application / pdf" behebt das Problem. Funktioniert gut in Chrom.
Gavin Simpson

13

FDView kombiniert PDF2SWF (das selbst auf xpdf basiert ) mit einem SWF- Viewer, sodass Sie PDF-Dokumente im laufenden Betrieb auf Ihrem Server konvertieren und einbetten können.

xpdf ist kein perfekter PDF-Konverter. Wenn Sie bessere Ergebnisse benötigen, kann Ghostview PDF-Dokumente in andere Formate konvertieren, für die Sie möglicherweise einfacher einen Flash-Viewer erstellen können.

Für einfache PDF-Dokumente sollte FDView jedoch recht gut funktionieren.


Ist FDView irgendwo anders verfügbar? code4net.com scheint verschwunden zu sein.
Michael Myers

@ Michael Nicht, dass ich leicht finden kann. Ich lasse diese Antwort bei der Möglichkeit, dass jemand fdview woanders erneut hostet.
Adam Davis

12

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.


Es tut mir leid, aber ich verstehe nicht, welchen Wert hat die Variable "transferData"?
Kate

1
Hallo @Kate, in unserem Fall generieren wir das PDF basierend auf den Eingaben eines Benutzers in unserem Webformular. "transferData" enthält die Daten, die als JSON an die PDF-Generierungsfunktion in der Web-API gesendet werden. Ich habe eine Zeile mehr Code zur Verdeutlichung hinzugefügt.
George Maharis

10

Sie können den relativen Speicherort des gespeicherten PDF wie folgt verwenden:

Beispiel 1

<embed src="example.pdf" width="1000" height="800" frameborder="0" allowfullscreen>

Beispiel2

<iframe src="example.pdf" style="width:1000px; height:800px;" frameborder="0" allowfullscreen></iframe>


10
  1. Erstellen Sie einen Container für Ihre PDF-Datei

    <div id="example1"></div>
  2. Teilen Sie PDFObject mit, welches PDF eingebettet werden soll und wo es eingebettet werden soll

    <script src="/js/pdfobject.js"></script>
    <script>PDFObject.embed("/pdf/sample-3pp.pdf", "#example1");</script>
  3. Optional können Sie CSS verwenden, um das visuelle Design festzulegen, einschließlich Bemaßungen, Rahmen, Ränder usw.

    <style>
    .pdfobject-container { height: 500px;}
    .pdfobject { border: 1px solid #666; }
    </style>

Quelle: https://pdfobject.com/


Dies war eine sehr gute Lösung und funktionierte gut in Verbindung mit dem Bootstrap-Styling. Es ging alles über andere Bootstrap-Elemente.
Netfed

Haben Sie es mit einer Blob-Datei versucht? Ich habe das mit benutztpdf.output('bloburl') von lib jspdf verwendet, aber es scheint nicht auf IE11 zu funktionieren.
Hoang Tran Son

8

Scribd erfordert nicht mehr, dass Sie Ihre Dokumente auf ihrem Server hosten. Wenn Sie ein Konto bei ihnen erstellen, erhalten Sie eine Publisher-ID. Es sind nur wenige Zeilen JavaScript-Code erforderlich, um auf Ihrem eigenen Server gespeicherte PDF-Dateien zu laden.

Weitere Informationen finden Sie unter Entwicklertools .


1
Könnten Sie einen weiteren Link posten, der zeigt, wie das gemacht wird? Aus dem von Ihnen geposteten Link geht nicht hervor.
SuperElectric

Scheint, als hätten sie ihre Website aktualisiert und diese Seite geändert. Ich denke, diese Seite hat den Inhalt, auf den ich mich in meinem ursprünglichen Beitrag bezog: scribd.com/developers/api?method_name=Javascript+API
Björn

Ich wünschte, ich könnte das mehr als einmal mögen, es funktioniert perfekt. Scrollen Sie zum Ende der Website und klicken Sie auf API, um Beispiele anzuzeigen.
Rocco The Taco

1
Anmeldungen sind jetzt für Scribd geschlossen.
Lance Fisher

4
<object width="400" height="400" data="helloworld.pdf"></object>

4

PdfToImageServlet mit ImageMagick'sconvert Befehl .

Anwendungsbeispiel: <img src='/webAppDirectory/PdfToImageServlet?pdfFile=/usr/share/cups/data/default-testpage.pdf'>


4

So habe ich es mit AXIOS und Vue.js gemacht:

        axios({
            url: `urltoPDFfile.pdf`,
            method: 'GET',
            headers: headers,
            responseType: 'blob'
        })
        .then((response) => {
            this.urlPdf = URL.createObjectURL(response.data)
        })
        .catch((error) => {
            console.log('ERROR   ', error)
        })

füge urlPDF dynamisch zu HTML hinzu:

<object width='100%' height='600px' :data='urlPdf' type='application/pdf'></object>

3

Eine der Optionen, die Sie in Betracht ziehen sollten, ist Notable PDF.
Es gibt einen kostenlosen Plan, es sei denn, Sie planen eine Online-Zusammenarbeit in Echtzeit für PDFs

Betten Sie Folgendes iframein ein beliebiges HTML ein und genießen Sie die Ergebnisse:

<iframe width='1000' height='800' src='http://bit.ly/1JxrtjR' frameborder='0' allowfullscreen></iframe>

2

Informationen zum Streamen der Datei in den Browser finden Sie unter Frage zum Stapelüberlauf. So streamen Sie eine PDF-Datei mit .NET 2.0 als Binärdatei in den Browser Beachten Sie, dass dies mit geringfügigen Abweichungen funktionieren sollte, unabhängig davon, ob Sie eine Datei aus dem Dateisystem bereitstellen oder dynamisch generiert.

Vor diesem Hintergrund bietet der referenzierte MSDN-Artikel eine eher vereinfachte Ansicht der Welt. Daher möchten Sie möglicherweise auch erfolgreich einige PDF-Dateien über HTTPS in den Browser streamen, um einige der Header zu erhalten, die Sie möglicherweise bereitstellen müssen.

Mit diesem Ansatz ist ein Iframe wahrscheinlich der beste Weg. Lassen Sie ein Webformular die Datei streamen und platzieren Sie den Iframe auf einer anderen Seite, wobei das srcAttribut auf das erste Formular festgelegt ist.


4
@downvoter möchte erklären, warum Sie eine 10 Jahre alte Antwort anonym ablehnen?
GalacticCowboy

1
  1. Erstellen Sie einen Blob der eingegebenen PDF-Bytes
  2. Verwenden Sie einen Iframe und PDF.js, die mit dieser browserübergreifenden Problemumgehung gepatcht wurden

Der URI für den Iframe sollte ungefähr so ​​aussehen:

/viewer.html?file=blob:19B579EA-5217-41C6-96E4-5D8DF5A5C70B

Jetzt zeigen FF, Chrome, IE 11 und Edge die PDF-Datei in einem Viewer im Iframe an, der über den Standard-Blob-URI in der URL übergeben wird.


1

Ich musste eine Vorschau eines PDF mit React anzeigen. Nachdem ich mehrere Bibliotheken ausprobiert hatte, bestand meine optimale Lösung darin, die Daten abzurufen und zu ebnen.

const pdfBase64 = //fetched from url or generated with jspdf or other library

  <embed
    src={pdfBase64}
    width="500"
    height="375"
    type="application/pdf"
  ></embed>

0

Wenn Sie PDF.JS nicht alleine hosten möchten, können Sie DocDroid ausprobieren . Es ähnelt dem Google Drive PDF-Viewer, ermöglicht jedoch ein benutzerdefiniertes Branding.


-7

Ich fand, dass dies gut funktioniert und der Browser es in Firefox handhabt. Ich habe IE nicht überprüft ...

<script>window.location='url'</script>

Was soll das bewirken? Ich kann nicht sehen, wie es die Frage beantwortet.
TRiG

Wenn ich ein PDF in mein HTML einbette, ist es am besten, einen Link zu diesem Dokument zu haben. Beispiel: <a href=" server1.network/trifold_JonesChiro.pdf "target='_blank'> Client Portal Trifold (Beispiel) </a> Manchmal ist es eine saubere Antwort, eine Seite zu öffnen und das PDF zu zeigen, um sie zu platzieren im HTML. Außerdem kann das PDF in einem Tab geöffnet bleiben.
Wynn

Ihre Empfehlung ist also, zu verlinken, nicht einzubetten? Das ist in Ordnung, aber als Antwort ist dies ziemlich unklar.
TRiG
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.