Méthode recommandée pour incorporer un PDF en HTML?


1182

Quelle est la méthode recommandée pour intégrer un fichier PDF au format HTML?

  • iFrame?
  • Objet?
  • Intégrer?

Qu'en dit Adobe?

Dans mon cas, le PDF est généré à la volée, il ne peut donc pas être téléchargé vers une solution tierce avant de le vider.


6
Essayez pdf2htmlEX: github.com/coolwanglu/pdf2htmlEX
Tezcat

Il y a une grande comparaison non seulement de solutions spécifiques mais de stratégies générales, sur le wiki du repo pdf2htmlEX . De plus, même si je ne l'ai pas essayé, cela semble être une fourchette maintenue.
ShreevatsaR

Réponses:


540

La meilleure approche est probablement d'utiliser la bibliothèque PDF.JS. C'est un rendu HTML5 / JavaScript pur pour les documents PDF sans plugins tiers.

Démo en ligne: http://mozilla.github.com/pdf.js/web/viewer.html

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


12
Comme indiqué dans une autre réponse, scribd utilise réellement pdf2swf pour convertir les fichiers pdf
Peter Craig

8
Je déconseille fortement d'utiliser scribd - je viens de réaliser une expérience sur un document particulier et dans Firefox 4, il n'affiche que les 3 premières pages, tandis que dans IE9, son texte de rendu est incorrect - son décalage de certaines sections de la page. Donc, techniquement, c'est un buggy. De plus, ils s'attendent à ce que vous vous abonniez pour imprimer ou télécharger des documents! Essentiellement, ils prennent des documents auparavant gratuits et érigent un mur de paiement autour d'eux.
frankster

9
La bibliothèque PDF.js ressemble en fait à une très bonne solution, bien que la démo liée ne la montre pas intégrée dans une page (elle occupe toute la page). Mais il utilise le canevas HMTL5, il devrait donc être facile à intégrer et c'est rapide . En revanche , il faut quelques js à utiliser, contrairement à <object>: github.com/mozilla/pdf.js/blob/master/examples/helloworld/…
LarsH

33
pdf.js fonctionne mal sur les navigateurs de tablettes tels que Chrome. Je trouve également que c'est très, très lent pour les documents pdf plus volumineux.
Rocco The Taco

10
Je ne peux pas croire que cela soit recommandé. Regardez le rendu des polices dans la démo en ligne, elles ont l'air irrégulières et horribles. Il semble beaucoup mieux avec le rendu sous-pixel lorsqu'il est ouvert dans Adobe Reader.
speedplane

532

C'est rapide, facile, au point et ne nécessite aucun script tiers:

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

MISE À JOUR (1/2018):

Le navigateur Chrome sur Android ne prend plus en charge les intégrations PDF. Vous pouvez contourner ce problème en utilisant la visionneuse PDF de Google Drive

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

30
Mieux vaut utiliser une balise <object> pour pouvoir inclure une solution de repli.
Jonathon Hill

1
Je pensais que les développeurs voudraient savoir que Mac / Firefox obtient une image de plugin cassée. La page du plugin ne chargera pas le plugin qu'il recherche. Des idées sur la façon de contourner cela?
Shanimal

63
si vous voulez être sûr qu'il sera affiché au lieu de télécharger automatiquement le pdf (comme cela m'est type='application/pdf'
arrivé

32
Mieux vaut utiliser la <object>balise car elle peut afficher un contenu alternatif dans les navigateurs qui ne peuvent pas afficher les fichiers PDF. Peut même mettre une <embed>balise dans une <object>balise si vous le souhaitez. Ref: stackoverflow.com/questions/1244788/embed-vs-object
Raphael

1
@raphaelcm En fait, comme je l'ai déjà dit, l'utilisation de la balise embed fonctionne dans tous les principaux navigateurs. Même IE 7 & 8.
Batfan

361

Vous pouvez également utiliser la visionneuse Google PDF à cette fin. Pour autant que je sache, ce n'est pas une fonctionnalité officielle de Google (je me trompe?), Mais cela fonctionne pour moi très bien et en douceur. Vous devez télécharger votre PDF quelque part avant et utilisez simplement son URL:

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

Ce qui est important, c'est qu'il n'a pas besoin d'un lecteur Flash, il utilise JavaScript.


29
Une chose qui doit être mentionnée est qu'il existe une limite supérieure à la taille du PDF qui peut être affiché. Je pense que c'est actuellement 10 Mo / 100 pages. PS: Je ne pense pas que le spectateur soit "officieux"; ils ont même une page pratique qui construit l'URL d'
intégration

30
Cette option fonctionne très bien, mais vous devez rendre vos fichiers PDF accessibles au public, ce qui pour moi n'est pas toujours une option.
KoviNET

4
@riot_starter cette solution ne fonctionne plus, si vous êtes complètement déconnecté de google, il se charge correctement, si vous êtes complètement connecté, il se charge correctement, mais si vous êtes entre les deux (quoi que cela signifie), il vous demande votre mot de passe. Et dans le cas de l'iframe, il ne se charge tout simplement pas.
dwenaus

5
Vous êtes autorisé à régler la confidentialité de tous les documents Google entre public, sign-in requiredet private. C'est définitivement une fonctionnalité officielle, étant donné que tout document sur Google Docs a une embedoption.
b1nary.atr0phy

6
Une autre chose qui doit être mentionnée est l'avertissement "vous avez fait trop de demandes récemment", ce qui est une limitation.
kommradHomer

116

Vous avez un certain contrôle sur la façon dont le PDF apparaît dans le navigateur en passant certaines options dans la chaîne de requête. J'étais heureux de ce travail, jusqu'à ce que je réalise qu'il ne fonctionne pas dans IE8. :(

Il fonctionne dans Chrome 9 et Firefox 3.6, mais dans IE8, il affiche le message "Insérez votre message d'erreur ici, si le PDF ne peut pas être affiché."

Cependant, je n'ai pas encore testé les anciennes versions de l'un des navigateurs ci-dessus. Mais voici le code que j'ai de toute façon au cas où cela aiderait quelqu'un. Cela règle le zoom à 85%, supprime les barres de défilement, les barres d'outils et les volets de navigation. Je mettrai à jour mon message si je tombe sur quelque chose qui fonctionne également dans 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
C'est la meilleure solution car elle utilise les capacités du navigateur et non une solution tierce compliquée. Dans tous les navigateurs modernes (IE9, FF ou Chrome), le PDF devrait bien s'intégrer. Désolé pour les utilisateurs d'IE 6/7. Ils doivent se mettre à niveau. Nous avons cessé de prendre en charge ces navigateurs depuis longtemps. :(
Adrian P.

2
Ne fonctionne pas sur mon édition de tablette mobile de Chrome..FYI ... dommage, aurait été une solution rapide.
Rocco The Taco

1
+1 pour l'adressage des options de zoom et de défilement, cependant, cela ne fonctionne pas dans la dernière version de Chrome (44) ... Échec du chargement du document PDF.
NotJay

Est-il possible d'ajouter un bouton de fermeture? et comment?
Roberto Sepúlveda Bravo

@RoccoTheTaco Seconded, ne fonctionne pas sur le chrome mobile sur Android
Anonyme

66

L'utilisation des deux <object>et <embed>vous donnera une plus grande étendue de compatibilité avec les navigateurs.

<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
Cela ne fonctionnera pas dans les navigateurs si l'addon pdf n'est pas installé ou obsolète
Umair Hamid

De plus, cela ne validera pas pour ceux qui sont concernés par la validation du code.
NotJay

1
Cela a très bien fonctionné pour moi, alors que l'utilisation de la embedbalise en elle-même a été considérée unsafepar Chrome et Firefox.
Richie Thomas

1
Pour une raison quelconque sur Android (chrome), il n'intègre pas le PDF et propose à la place de le télécharger. Sur iPhone (safari), il n'affiche que la première page du PDF.
Ivan Rubinson

21

Convertissez-le en PNG via ImageMagick et affichez le PNG (rapide et sale).

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

C'est une bonne option si vous avez besoin d'une solution rapide, si vous voulez éviter les problèmes d'affichage PDF entre navigateurs et si le PDF n'est qu'une ou deux pages. Bien sûr, vous devez installer ImageMagick (qui à son tour a besoin de Ghostscript) sur votre serveur Web, une option qui pourrait ne pas être disponible dans les environnements d'hébergement partagé. Il existe également un plugin PHP (appelé imagick) qui fonctionne comme ceci, mais il a ses propres exigences particulières.


Ou convertissez l'image au format PNG à l'aide d'une application, telle que Aperçu sur Mac.
Garrett

2
mais pouvez-vous le faire par programme?
Dan Mantyla

que faire si le document comporte plus d'une page? Je suppose que vous ne montrer la première page , puis
seb

@seb ça fait un moment mais j'ai pu l'utiliser sur des PDF de 2 ou 3 pages. Il ne serait pas sage d'aller beaucoup plus grand que cela, je pense que les navigateurs mobiles ont du mal à afficher des images comme ça. C'est pourquoi je l'ai appelé la méthode "rapide et sale", mais je pense que c'est une bonne méthode tant que le PDF ne fait que quelques pages.
Dan Mantyla

1
Si vous ouvrez le PDF à l'aide de la bibliothèque zend, vous pouvez faire un foreach($pdf->pages as $page)et créer une image pour chaque page
99 Problèmes - La syntaxe n'est pas un

19

Jetez un œil à ce code - Pour intégrer le PDF en 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
Cela ne semble pas fonctionner. Je me retrouve toujours avec un écran gris vierge au lieu du pdf. Mais commutation srcpour data, comme dans @ la réponse de Gayle, fonctionne.
Mottie

1
J'utilise Chrome 44 et cela ne fonctionnera pas. J'ai également essayé de passer des données à src.
NotJay

1
type = "application / pdf" résout le problème. Fonctionne très bien en chrome.
Gavin Simpson

13

FDView combine PDF2SWF (qui est lui-même basé sur xpdf ) avec une visionneuse SWF afin que vous puissiez convertir et intégrer des documents PDF à la volée sur votre serveur.

xpdf n'est pas un convertisseur PDF parfait. Si vous avez besoin de meilleurs résultats, Ghostview a la possibilité de convertir des documents PDF dans d'autres formats pour lesquels vous pourrez peut-être plus facilement créer une visionneuse Flash.

Mais pour les documents PDF simples, FDView devrait fonctionner assez bien.


FDView est-il disponible ailleurs? code4net.com semble avoir disparu.
Michael Myers

@Michael Pas que je puisse facilement trouver. Je laisse cette réponse au cas où quelqu'un ré-hébergerait fdview ailleurs.
Adam Davis

12

Notre problème est que, pour des raisons juridiques, nous ne sommes pas autorisés à stocker temporairement un PDF sur le disque dur . De plus, la page entière ne doit pas être rechargée lors de l'affichage d'un PDF en tant qu'aperçu dans le navigateur.

Nous avons d'abord essayé PDF.jS. Cela a fonctionné avec Base64 dans la visionneuse pour Firefox et Chrome. Cependant, cela a été trop lent pour notre PDF. IE / Edge ne fonctionnait pas du tout.

Nous l'avons donc essayé avec une chaîne Base64 dans une balise d'objet HTML. Cela n'a pas fonctionné à nouveau pour IE / Edge (peut-être le même problème qu'avec PDF.js). Dans Chrome / Firefox / Safari à nouveau, aucun problème. C'est pourquoi nous avons choisi une solution hybride. IE / Edge nous utilisons un IFrame et pour tous les autres navigateurs l'objet-tag.

La solution IFrame fonctionnerait bien sûr également pour Chrome et co. La raison pour laquelle nous n'avons pas utilisé cette solution pour Chrome est que, bien que le PDF s'affiche correctement, Chrome fait une nouvelle demande au serveur dès que vous cliquez sur "télécharger" dans l'aperçu . Le champ PDFHelperTransferData requis (pour envoyer nos données de formulaire nécessaires à la génération du PDF) n'est plus défini car le PDF est affiché dans un IFrame. Pour cette fonctionnalité / bogue, voirChrome envoie deux demandes lors du téléchargement d'un PDF (et annule l'une d'entre elles) .

Maintenant, les enfants problématiques IE9 et IE10 restent. Pour ceux-ci, nous avons renoncé à une solution d'aperçu et envoyons simplement le document en cliquant sur le bouton d'aperçu sous forme de téléchargement à l'utilisateur (au lieu de l'aperçu). Nous avons beaucoup essayé, mais même si nous avions trouvé une solution, l'effort supplémentaire pour cette petite partie des utilisateurs n'en aurait pas valu la peine. Vous pouvez trouver notre solution de téléchargement ici: Téléchargez le PDF sans rafraîchissement avec IFrame .

Notre 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);
            }
        })
 }

Notre 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>

Pour vérifier le type de navigateur pour IE / Edge, voir ici: Comment puis-je détecter Internet Explorer (IE) et Microsoft Edge à l'aide de JavaScript? J'espère que ces résultats feront gagner du temps à quelqu'un d'autre.


Je suis désolé, mais je ne comprends pas, quel type de valeur a la variable "transferData"?
Kate

1
Salut @Kate, Dans notre cas, nous générons le PDF en fonction de l'entrée d'un utilisateur dans notre formulaire Web. "transferData" contient les données qui sont envoyées en JSON à la fonction de génération de PDF dans l'API Web. J'ai ajouté une ligne de code pour plus de précision.
George Maharis

10

Vous pouvez utiliser l'emplacement relatif du pdf enregistré comme ceci:

Exemple 1

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

Exemple2

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


10
  1. Créez un conteneur pour contenir votre PDF

    <div id="example1"></div>
  2. Indiquez à PDFObject quel PDF incorporer et où l'incorporer

    <script src="/js/pdfobject.js"></script>
    <script>PDFObject.embed("/pdf/sample-3pp.pdf", "#example1");</script>
  3. Vous pouvez éventuellement utiliser CSS pour spécifier le style visuel, y compris les dimensions, la bordure, les marges, etc.

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

source: https://pdfobject.com/


C'était une très bonne solution et fonctionnait bien en conjonction avec le style bootstrap. Tout est allé au-dessus d'autres éléments de bootstrap.
netfed le

Avez-vous essayé avec le fichier blob? J'ai utilisé cela avec pdf.output('bloburl')de lib jspdf mais cela ne semble pas fonctionner sur IE11.
Hoang Tran Son

8

Scribd ne vous demande plus d'héberger vos documents sur leur serveur. Si vous créez un compte avec eux, vous obtenez un identifiant d'éditeur. Il suffit de quelques lignes de code JavaScript pour charger des fichiers PDF stockés sur votre propre serveur.

Pour plus de détails, voir Outils de développement .


1
Pourriez-vous publier un autre lien montrant comment cela se fait? Ce n'est pas clair d'après le lien que vous avez publié.
SuperElectric

On dirait qu'ils ont mis à jour leur site Web et changé cette page. Je pense que cette page a le contenu auquel
Bjorn

J'aimerais pouvoir aimer cela plus d'une fois, cela fonctionne parfaitement. Faites défiler vers le bas du site Web et cliquez sur API pour voir des exemples.
Rocco The Taco

1
Les inscriptions sont maintenant fermées pour scribd.
Lance Fisher

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

4

PdfToImageServlet à l' aide de la convertcommande ImageMagick .

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


4

Voici comment je l'ai fait avec AXIOS et 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)
        })

ajoutez urlPDF dynamiquement au HTML:

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

3

Une des options que vous devriez considérer est le PDF remarquable.
Il a un plan gratuit, sauf si vous prévoyez de faire une collaboration en ligne en temps réel sur des fichiers PDF.

Intégrez ce qui suit iframeà n'importe quel html et profitez des résultats:

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

2

Pour diffuser le fichier dans le navigateur, consultez la question Stack Overflow Comment diffuser un fichier PDF en tant que binaire dans le navigateur à l'aide de .NET 2.0 - notez que, avec des variations mineures, cela devrait fonctionner que vous serviez un fichier à partir du système de fichiers ou généré dynamiquement.

Cela dit, l'article MSDN référencé adopte une vue plutôt simpliste du monde, vous pouvez donc vouloir lire avec succès Streamer un PDF vers un navigateur via HTTPS ainsi que pour certains des en-têtes que vous devrez peut-être fournir.

En utilisant cette approche, un iframe est probablement la meilleure façon de procéder. Avoir un formulaire Web qui diffuse le fichier, puis placez l'iframe sur une autre page avec son srcattribut défini sur le premier formulaire.


4
@downvoter se soucie d'expliquer pourquoi vous votez de manière anonyme pour une réponse vieille de 10 ans?
GalacticCowboy

1
  1. Construire un blob des octets PDF d'entrée
  2. Utilisez un iframe et PDF.js corrigés avec cette solution de contournement de navigateur

L'URI de l'iframe devrait ressembler à ceci:

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

Maintenant, FF, Chrome, IE 11 et Edge affichent tous le PDF dans une visionneuse dans l'iframe passé via l'URI de blob standard dans l'URL.


1

J'ai dû prévisualiser un PDF avec React, donc après avoir essayé plusieurs bibliothèques, ma solution optimale était de récupérer les données et de les envoyer par ebmed.

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

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

0

Si vous ne souhaitez pas héberger PDF.JS par vous-même, vous pouvez essayer DocDroid . Il est similaire à la visionneuse PDF de Google Drive, mais permet une personnalisation personnalisée.


0

utilisez simplement iFrame pour les PDF.

J'avais des besoins spécifiques dans mon application React.js, j'ai essayé des millions de solutions mais je me suis retrouvé avec un iFrame :) Bonne chance!


-7

J'ai trouvé que cela fonctionne très bien et que le navigateur le gère dans Firefox. Je n'ai pas vérifié IE ...

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

Qu'est-ce que cela est censé accomplir? Je ne vois pas comment cela répond à la question.
TRiG

Lorsque j'incorpore un PDF dans mon HTML, je trouve que le meilleur moyen est d'avoir un lien vers ce document. comme <a href=" server1.network/trifold_JonesChiro.pdf "target='_blank'> Client Portal Trifold (exemple) </a>, il est parfois judicieux d'ouvrir une page et d'afficher le pdf vs tring pour la placer dans le html. Il permet également au pdf de rester ouvert dans un onglet.
Wynn

Donc, votre recommandation est de lier, pas d'intégrer? C'est bien, mais comme réponse, cela n'est pas très clair.
TRiG
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.