Modo consigliato per incorporare PDF in HTML?


1182

Qual è il modo consigliato per incorporare PDF in HTML?

  • iFrame?
  • Oggetto?
  • Incorporare?

Cosa si dice Adobe al riguardo?

Nel mio caso, il PDF viene generato al volo, quindi non può essere caricato su una soluzione di terze parti prima di scaricarlo.



C'è un grande confronto non solo di soluzioni specifiche ma di strategie generali, sul wiki del repository pdf2htmlEX . Inoltre, anche se non l'ho provato, questo sembra essere un fork mantenuto.
ShreevatsaR,

Risposte:


540

Probabilmente l'approccio migliore è usare la libreria PDF.JS. È un puro renderizzatore HTML5 / JavaScript per documenti PDF senza plug-in di terze parti.

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

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


12
Come notato in un'altra risposta, scribd utilizza effettivamente pdf2swf per convertire i file pdf
Peter Craig,

8
Consiglio vivamente di non usare scribd: ho appena eseguito un esperimento su un particolare documento e in Firefox 4 visualizza solo le prime 3 pagine, mentre in IE9 il testo di rendering è errato, compensando alcune sezioni della pagina. Quindi tecnicamente parlando è buggy. Inoltre si aspettano che ti iscrivi per stampare o scaricare documenti! In sostanza, stanno prendendo in precedenza documenti gratuiti ed erigendo un paywall attorno a loro.
Frank

9
La libreria PDF.js in realtà sembra un'ottima soluzione, sebbene la demo collegata non la mostri incorporata in una pagina (occupa l'intera pagina). Ma utilizza la tela HMTL5, quindi dovrebbe essere facile da incorporare ed è veloce . Sul lato <object>
negativo

33
pdf.js funziona male su browser tablet come Chrome. Trovo anche che sia molto, molto lento per documenti PDF più grandi.
Rocco The Taco,

10
Non posso credere che sia stato raccomandato. Guarda il rendering dei caratteri nella demo online, sembrano irregolari e terribili. Sembra molto meglio con il rendering sub-pixel quando viene aperto in Adobe Reader.
speedplane il

532

Questo è veloce, facile, al punto e non richiede alcuno script di terze parti:

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

AGGIORNAMENTO (1/2018):

Il browser Chrome su Android non supporta più gli incorporamenti PDF. Puoi aggirare il problema utilizzando il visualizzatore PDF di Google Drive

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

30
Meglio usare un tag <object> in modo da poter includere un fallback.
Jonathon Hill,

1
Pensavo che gli sviluppatori avrebbero voluto sapere che Mac / Firefox ha un'immagine del plugin interrotta. La pagina del plug-in non carica il plug-in che sta cercando. Qualche idea su come aggirare questo?
Shanimal,

63
se vuoi essere sicuro che verrà mostrato invece di scaricare automaticamente il pdf (come mi è successo) aggiungi type='application/pdf'al tag embed
Hassek

32
Meglio usare il <object>tag perché può visualizzare contenuti alternativi nei browser che non possono visualizzare PDF. Puoi anche inserire un <embed>tag in un <object>tag, se lo desideri. Rif: stackoverflow.com/questions/1244788/embed-vs-object
Raphael

1
@raphaelcm In realtà, come ho detto prima, il solo utilizzo del tag embed funziona in tutti i principali browser. Anche IE 7 e 8.
Batfan,

361

A questo scopo puoi anche utilizzare il visualizzatore di Google PDF. Per quanto ne so non è una funzione ufficiale di Google (mi sbaglio su questo?), Ma funziona per me molto bene e senza intoppi. Devi caricare il tuo PDF da qualche parte prima e usare semplicemente il suo URL:

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

Ciò che è importante è che non ha bisogno di un lettore Flash, utilizza JavaScript.


29
Una cosa che dovrebbe essere menzionata è che esiste un limite massimo alla dimensione del PDF che può essere visualizzato. Penso che sia attualmente 10 MB / 100 pagine. PS: non credo che lo spettatore sia "non ufficiale"; hanno anche una pagina di istruzioni
SuperElectric

30
Questa opzione funziona benissimo, ma devi rendere i tuoi PDF accessibili al pubblico, il che per me non è sempre un'opzione.
KoviNET,

4
@riot_starter questa soluzione non funziona più, se sei completamente disconnesso da google si carica bene, se sei completamente loggato si carica bene, tuttavia se sei in mezzo (qualunque cosa significhi) ti chiede la tua password. E nel caso dell'iframe non si carica.
dwenaus,

5
Hai il permesso di impostare la privacy di qualsiasi Google Docs tra public, sign-in requirede private. È sicuramente una funzionalità ufficiale, considerando che qualsiasi documento su Google Documenti ha embedun'opzione.
b1nary.atr0phy

6
Un'altra cosa che dovrebbe essere menzionata è l'avviso "hai fatto troppe richieste di recente", che è una limitazione.
kommradHomer,

116

Hai un certo controllo su come appare il PDF nel browser passando alcune opzioni nella stringa di query. Sono stato felice di questo lavoro, fino a quando ho capito che non funziona in IE8. :(

Funziona in Chrome 9 e Firefox 3.6, ma in IE8 mostra il messaggio "Inserisci qui il tuo messaggio di errore, se il PDF non può essere visualizzato".

Non ho ancora testato le versioni precedenti di nessuno dei browser di cui sopra. Ma ecco il codice che ho comunque nel caso in cui aiuti qualcuno. Questo imposta lo zoom all'85%, rimuove barre di scorrimento, barre degli strumenti e pannelli di navigazione. Aggiornerò il mio post se trovo qualcosa che funziona anche in IE.

<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
Questa è la soluzione migliore perché utilizza le funzionalità del browser e non una complicata soluzione di terze parti. In tutti i browser moderni (IE9, FF o Chrome) il PDF dovrebbe essere incorporato bene. Ci scusiamo per gli utenti di IE 6/7. Devono aggiornare. Abbiamo smesso di supportare questi browser molto tempo fa. :(
Adrian P.

2
Non funziona sulla versione per tablet mobile di Chrome..FYI ... peccato, sarebbe stata una soluzione rapida.
Rocco The Taco,

1
+1 per l'indirizzamento delle opzioni di zoom e scorrimento, tuttavia, non funziona nell'ultima versione di Chrome (44) ... Impossibile caricare il documento PDF.
giovedì

È possibile aggiungere un pulsante di chiusura? e come?
Roberto Sepúlveda Bravo,

@RoccoTheTaco Seconded, non funziona su Chrome per dispositivi mobili su Android
Anonimo

66

Usando entrambi <object>e <embed>ti darà una più ampia gamma di compatibilità del browser.

<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
Questo non funzionerà nei browser se il componente aggiuntivo pdf non è installato o non è aggiornato
Umair Hamid

Inoltre, ciò non verrà convalidato per coloro che si occupano della convalida del codice.
giovedì

1
Questo ha funzionato benissimo per me, mentre l'utilizzo del embedtag da solo è stato considerato unsafeda Chrome e Firefox.
Richie Thomas,

1
Per qualche motivo su Android (Chrome) non incorpora il PDF e offre invece di scaricarlo. Su iPhone (safari) mostra solo la prima pagina del PDF.
Ivan Rubinson,

21

Convertilo in PNG tramite ImageMagick e visualizza il PNG (veloce e sporco).

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

Questa è una buona opzione se hai bisogno di una soluzione rapida, vuoi evitare problemi di visualizzazione PDF tra browser e se il PDF è solo una o due pagine. Ovviamente, hai bisogno di ImageMagick installato (che a sua volta necessita di Ghostscript) sul tuo server web, un'opzione che potrebbe non essere disponibile negli ambienti di hosting condivisi. C'è anche un plugin PHP (chiamato imagick) che funziona in questo modo ma ha i suoi requisiti speciali.


O converti l'immagine in PNG usando un'applicazione, come Anteprima su Mac.
Garrett,

2
ma puoi farlo programmaticamente?
Dan Mantyla,

cosa succede se il documento ha più di 1 pagina? Immagino che mostrerai solo la prima pagina allora
seb

@seb è passato un po 'di tempo, ma sono stato in grado di usarlo su PDF lunghi 2 o 3 pagine. Non sarebbe saggio andare molto più grande di quello, penso che i browser per dispositivi mobili abbiano difficoltà a visualizzare immagini del genere. Questo è il motivo per cui l'ho chiamato il metodo "rapido e sporco", ma è una buona idea, a condizione che il PDF non sia più di poche pagine.
Dan Mantyla,

1
Se apri il PDF usando la libreria zend, puoi fare un foreach($pdf->pages as $page)e creare un'immagine per ogni pagina
99 Problemi - La sintassi non è un

19

Dai un'occhiata a questo codice: per incorporare il PDF in HTML

<!-- 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
Questo non sembra funzionare. Finisco sempre con uno schermo grigio vuoto invece del pdf. Ma passare srca data, come nella risposta di @ Gayle, funziona.
Mottie,

1
Sto usando Chrome 44 e non funzionerà. Ho anche provato a cambiare i dati in src.
giovedì

1
type = "application / pdf" risolve il problema. Funziona bene in cromo.
Gavin Simpson,

13

FDView combina PDF2SWF (che a sua volta si basa su xpdf ) con un visualizzatore SWF in modo da poter convertire e incorporare documenti PDF al volo sul tuo server.

xpdf non è un convertitore PDF perfetto. Se hai bisogno di risultati migliori, Ghostview ha una certa capacità di convertire documenti PDF in altri formati per i quali potresti essere in grado di creare più facilmente un visualizzatore Flash.

Ma per semplici documenti PDF, FDView dovrebbe funzionare abbastanza bene.


FDView è disponibile altrove? code4net.com sembra essere scomparso.
Michael Myers

@Michael Non che riesco a trovare facilmente. Lascerò questa risposta alla prima occasione che qualcuno re-ospita fdview da qualche altra parte.
Adam Davis,

12

Il nostro problema è che per motivi legali non è consentito archiviare temporaneamente un PDF sul disco rigido . Inoltre, l'intera pagina non deve essere ricaricata quando si visualizza un PDF come Anteprima nel browser.

Per prima cosa abbiamo provato PDF.jS. Ha funzionato con Base64 nel visualizzatore per Firefox e Chrome. Tuttavia, è stato inaccettabilmente lento per il nostro PDF. IE / Edge non ha funzionato affatto.

Lo abbiamo quindi provato con una stringa Base64 in un tag di oggetto HTML. Anche questo non ha funzionato per IE / Edge (forse lo stesso problema con PDF.js). In Chrome / Firefox / Safari di nuovo nessun problema. Ecco perché abbiamo scelto una soluzione ibrida. IE / Edge usiamo un IFrame e per tutti gli altri browser il tag oggetto.

Naturalmente la soluzione IFrame funzionerebbe anche per Chrome e co. Il motivo per cui non abbiamo utilizzato questa soluzione per Chrome è che sebbene il PDF sia visualizzato correttamente, Chrome invia una nuova richiesta al server non appena si fa clic su "download" nell'anteprima . Il file pdfHelperTransferData campo nascosto (per l'invio dei dati del nostro modulo necessari per la generazione di PDF) non è più impostato perché il PDF viene visualizzato in un IFrame. Per questa funzione / bug vediChrome invia due richieste durante il download di un PDF (e ne cancella una) .

Ora rimangono i problemi relativi ai bambini IE9 e IE10. Per questi abbiamo rinunciato a una soluzione di anteprima e abbiamo semplicemente inviato il documento facendo clic sul pulsante di anteprima come download per l'utente (anziché l'anteprima). Abbiamo provato molto, ma anche se avessimo trovato una soluzione lo sforzo extra per questa piccola parte degli utenti non sarebbe valsa la pena. Puoi trovare la nostra soluzione per il download qui: Scarica PDF senza aggiornamento con IFrame .

Il nostro 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);
            }
        })
 }

Il nostro 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>

Per verificare il tipo di browser per IE / Edge vedere qui: Come posso rilevare Internet Explorer (IE) e Microsoft Edge usando JavaScript? Spero che questi risultati salveranno qualcun altro il tempo.


Mi dispiace, ma non capisco, che tipo di valore ha la variabile "transferData"?
Kate,

1
Ciao @Kate, Nel nostro caso, generiamo il PDF in base all'input di un utente nel nostro modulo web. "transferData" contiene i dati inviati come JSON alla funzione di generazione PDF nell'API Web. Ho aggiunto una riga di codice in più per chiarimenti.
George Maharis,

10

È possibile utilizzare la posizione relativa del pdf salvato in questo modo:

Esempio 1

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

Esempio 2

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


10
  1. Crea un contenitore per contenere il tuo PDF

    <div id="example1"></div>
  2. Indica a PDFObject quale PDF incorporare e dove incorporarlo

    <script src="/js/pdfobject.js"></script>
    <script>PDFObject.embed("/pdf/sample-3pp.pdf", "#example1");</script>
  3. Opzionalmente puoi usare CSS per specificare lo stile visivo, inclusi dimensioni, bordo, margini, ecc.

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

fonte: https://pdfobject.com/


Questa è stata un'ottima soluzione e ha funzionato bene in combinazione con lo stile bootstrap. È andato tutto al di sopra di altri elementi bootstrap.
Netfed

Hai provato con il file BLOB? L'ho usato con pdf.output('bloburl')lib jspdf ma sembra non funzionare su IE11.
Hoang Tran Son,

8

Scribd non ti richiede più di ospitare i tuoi documenti sul loro server. Se crei un account con loro in modo da ottenere un ID editore. Bastano poche righe di codice JavaScript per caricare i file PDF memorizzati sul proprio server.

Per ulteriori dettagli, consultare Strumenti per sviluppatori .


1
Potresti pubblicare un altro link che mostra come viene fatto? Non è chiaro dal link che hai pubblicato.
SuperElectric

Sembra che abbiano aggiornato il loro sito Web e cambiato questa pagina. Penso che questa pagina abbia il contenuto a cui mi riferivo nel mio post originale: scribd.com/developers/api?method_name=Javascript+API
Bjorn

Vorrei poterlo apprezzare più di una volta, funziona perfettamente. Scorri fino alla fine del sito Web e fai clic su API per vedere esempi.
Rocco The Taco,

1
Le iscrizioni sono ora chiuse per scribd.
Lance Fisher,

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

4

PdfToImageServlet usando il convertcomando di ImageMagick .

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


4

Questo è il modo in cui ho fatto con AXIOS e Vue.js:

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

aggiungi urlPDF in modo dinamico all'HTML:

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

3

Una delle opzioni che dovresti considerare è Notable PDF
Ha un piano gratuito a meno che tu non abbia intenzione di fare una collaborazione online in tempo reale su pdf

Incorpora quanto segue iframein qualsiasi HTML e goditi i risultati:

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

2

Per eseguire lo streaming del file sul browser, vedere Domanda di overflow dello stack Come eseguire lo streaming di un file PDF come binario sul browser utilizzando .NET 2.0 ; tenere presente che, con variazioni minori, questo dovrebbe funzionare indipendentemente dal fatto che si stia offrendo un file dal file system o generato dinamicamente.

Detto questo, l'articolo di MSDN a cui viene fatto riferimento ha una visione piuttosto semplicistica del mondo, quindi potresti voler leggere con successo lo streaming di un PDF sul browser tramite HTTPS e per alcune delle intestazioni che potresti dover fornire.

Usando questo approccio, un iframe è probabilmente il modo migliore per andare. Avere un modulo web che trasmette il file in streaming, quindi inserire l'iframe in un'altra pagina con l' srcattributo impostato sul primo modulo.


4
@downvoter ti interessa spiegare perché stai effettuando il downgrade anonimo di una risposta di 10 anni?
GalacticCowboy,

1
  1. Costruire un BLOB dei byte PDF di input
  2. Utilizzare un iframe e PDF.js corretti con questa soluzione alternativa per browser

L'URI per l'iframe dovrebbe assomigliare a questo:

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

Ora FF, Chrome, IE 11 e Edge visualizzano tutti il ​​PDF in un visualizzatore nell'iframe passato tramite URI BLOB standard nell'URL.


1

Ho dovuto visualizzare l'anteprima di un PDF con React, quindi dopo aver provato diverse librerie la mia soluzione ottimale era quella di recuperare i dati e salvarli.

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

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

0

Se non desideri ospitare PDF.JS da solo, puoi provare DocDroid . È simile al visualizzatore PDF di Google Drive ma consente il branding personalizzato.


0

basta usare iFrame per i PDF.

Avevo esigenze specifiche nella mia app React.js, ho provato milioni di soluzioni ma ho finito con un iFrame :) Buona fortuna!


-7

Ho trovato che funziona bene e il browser lo gestisce in Firefox. Non ho controllato IE ...

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

Cosa dovrebbe raggiungere questo? Non riesco a vedere come risponde alla domanda.
TRiG

Quando incorporo un PDF nel mio HTML, trovo che il modo migliore sia quello di avere un link a questo documento. come <a href=" server1.network/trifold_JonesChiro.pdf "target='_blank'> Client Portal Trifold (esempio) </a> a volte è una risposta chiara per aprire una pagina e mostrare il pdf vs tring per posizionarlo nel codice HTML. Consente inoltre al pdf di rimanere aperto in una scheda.
Wynn,

Quindi la tua raccomandazione è quella di collegare, non incorporare? Va bene, ma come risposta non è abbastanza chiaro.
TRiG
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.