Cara yang disarankan untuk menanamkan PDF dalam HTML?

1182

Apa cara yang disarankan untuk menanamkan PDF dalam HTML?

  • iFrame?
  • Obyek?
  • Menanamkan?

Apa yang dikatakan Adobe tentang hal itu?

Dalam kasus saya, PDF dibuat dengan cepat, sehingga tidak dapat diunggah ke solusi pihak ketiga sebelum dibilas.

Daniel Silveira
sumber
6
Coba pdf2htmlEX: github.com/coolwanglu/pdf2htmlEX
Tezcat
Ada perbandingan hebat tidak hanya dari solusi spesifik tetapi strategi umum, di wiki repo pdf2htmlEX . Juga, meskipun saya belum mencobanya, ini sepertinya garpu yang dipelihara.
ShreevatsaR

Jawaban:

540

Mungkin pendekatan terbaik adalah dengan menggunakan perpustakaan PDF.JS. Ini adalah penyaji HTML5 / JavaScript murni untuk dokumen PDF tanpa plugin pihak ketiga.

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

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

lubos hasko
sumber
12
Seperti disebutkan dalam jawaban lain, scribd benar-benar menggunakan pdf2swf untuk mengonversi file pdf
Peter Craig
8
Saya sangat merekomendasikan untuk tidak menggunakan scribd - Saya baru saja melakukan percobaan pada dokumen tertentu dan di firefox 4 hanya menampilkan 3 halaman pertama, sedangkan di IE9 rendering teksnya salah - itu mengimbangi beberapa bagian halaman. Jadi secara teknis itu buggy. Selain itu mereka berharap Anda berlangganan untuk mencetak atau mengunduh dokumen! Pada dasarnya mereka mengambil dokumen yang sebelumnya gratis dan memasang paywall di sekitar mereka.
frankster
9
Pustaka PDF.js sebenarnya terlihat seperti solusi yang sangat baik, meskipun demo yang ditautkan tidak memperlihatkannya disematkan dalam satu halaman (ini menghabiskan seluruh halaman). Tapi itu menggunakan kanvas HMTL5, jadi harus mudah disematkan, dan cepat . Di sisi bawah, dibutuhkan beberapa js untuk digunakan, tidak seperti <object>: github.com/mozilla/pdf.js/blob/master/examples/helloworld/…
LarsH
33
pdf.js bekerja dengan buruk di browser tablet seperti Chrome. Saya juga merasa sangat, sangat lambat untuk dokumen pdf yang lebih besar.
Rocco The Taco
10
Saya tidak percaya ini direkomendasikan. Lihat rendering font di demo online, mereka terlihat jaggy dan mengerikan. Ini terlihat jauh lebih baik dengan rendering sub-pixel ketika dibuka di adobe reader.
speedplane
532

Ini cepat, mudah, to the point dan tidak memerlukan skrip pihak ketiga:

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

UPDATE (1/2018):

Browser Chrome di Android tidak lagi mendukung penyematan PDF. Anda dapat menyiasatinya dengan menggunakan penampil PDF Google Drive

<embed src="https://drive.google.com/viewerng/
viewer?embedded=true&url=http://example.com/the.pdf" width="500" height="375">
Batfan
sumber
30
Lebih baik menggunakan tag <object> sehingga Anda dapat menyertakan back-back.
Jonathon Hill
1
Saya pikir pengembang ingin tahu Mac / Firefox mendapatkan gambar plugin yang rusak. Halaman plugin tidak akan memuat plugin yang dicari. Ada ide bagaimana menyiasatinya?
Shanimal
63
jika Anda ingin memastikan itu akan ditampilkan alih-alih secara otomatis unduh pdf (seperti yang terjadi pada saya) tambahkan type='application/pdf'ke tag embed
Hassek
32
Lebih baik menggunakan <object>tag karena dapat menampilkan konten alternatif di browser yang tidak dapat menampilkan pdf. Bahkan dapat menempatkan <embed>tag di <object>tag jika Anda mau. Ref: stackoverflow.com/questions/1244788/embed-vs-object
Raphael
1
@raphaelcm Sebenarnya, seperti yang saya katakan sebelumnya, hanya menggunakan tag embed yang berfungsi di semua browser utama. Bahkan IE 7 & 8.
Batfan
361

Anda juga dapat menggunakan penampil Google PDF untuk tujuan ini. Sejauh yang saya tahu itu bukan fitur Google resmi (apakah saya salah dalam hal ini?), Tetapi berfungsi dengan baik dan lancar bagi saya. Anda perlu mengunggah PDF Anda di suatu tempat sebelumnya dan cukup menggunakan URL-nya:

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

Yang penting adalah bahwa itu tidak memerlukan Flash player, ia menggunakan JavaScript.

Lukasz Korzybski
sumber
29
Satu hal yang harus disebutkan adalah ada batas atas ukuran PDF yang bisa ditampilkan. Saya pikir saat ini 10MB / 100 halaman. PS: Saya kira pemirsa itu "tidak resmi"; mereka bahkan memiliki halaman bagaimana-untuk yang membangun URL embed untuk Anda: docs.google.com/viewer
SuperElectric
30
Opsi ini berfungsi dengan baik, tetapi Anda harus membuat PDF Anda dapat diakses publik, yang bagi saya tidak selalu merupakan pilihan.
KoviNET
4
@riot_starter solusi ini tidak lagi berfungsi, jika Anda sepenuhnya keluar dari google, itu baik-baik saja, jika Anda sepenuhnya masuk itu baik-baik saja, namun jika Anda berada di antara (apa pun artinya) ia meminta kata sandi Anda. Dan dalam kasus iframe itu hanya tidak memuat.
dwenaus
5
Anda diperbolehkan untuk mengatur privasi dari setiap Google Docs antara public, sign-in required, dan private. Ini jelas merupakan fitur resmi, mengingat setiap dokumen di Google Documents memiliki embedopsi.
b1nary.atr0phy
6
Hal lain yang harus disebutkan adalah peringatan "Anda telah membuat terlalu banyak permintaan baru-baru ini", yang merupakan batasan.
kommradHomer
116

Anda memiliki kontrol atas bagaimana PDF muncul di browser dengan melewatkan beberapa opsi dalam string kueri. Saya senang bekerja ini, sampai saya menyadari itu tidak berfungsi di IE8. :(

Ini bekerja di Chrome 9 dan Firefox 3.6, tetapi di IE8 itu menunjukkan pesan "Sisipkan pesan kesalahan Anda di sini, jika PDF tidak dapat ditampilkan."

Saya belum menguji versi yang lebih lama dari salah satu browser di atas. Tapi ini kode yang saya miliki kalau-kalau itu membantu siapa pun. Ini mengatur zoom ke 85%, menghilangkan scrollbar, toolbar, dan panel nav. Saya akan memperbarui posting saya jika saya menemukan sesuatu yang berfungsi di IE juga.

<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>
Gayle
sumber
6
Itu solusi terbaik karena menggunakan kemampuan browser dan bukan solusi pihak ketiga yang rumit. Di semua browser modern (IE9, FF atau Chrome) PDF harus disematkan dengan baik. Maaf untuk pengguna IE 6/7. Mereka harus memutakhirkan. Kami sudah lama berhenti mendukung browser ini. :(
Adrian P.
2
Tidak berfungsi pada tablet tablet Chrome saya..FYI ... kasihan, akan menjadi perbaikan cepat.
Rocco The Taco
1
+1 untuk mengatasi opsi zoom dan gulir, namun ini tidak berfungsi dalam versi Chrome terbaru (44) ... Gagal Memuat Dokumen PDF.
NotJay
Apakah mungkin untuk menambahkan tombol tutup? dan bagaimana?
Roberto Sepúlveda Bravo
@RoccoTheTaco Diperbaiki, tidak berfungsi pada chrome ponsel di android
Anonymous
66

Menggunakan keduanya <object>dan <embed>akan memberi Anda kompatibilitas browser yang lebih luas.

<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>
Suneel Kumar
sumber
4
Ini tidak akan berfungsi di peramban jika addon pdf tidak terpasang atau kedaluwarsa
Umair Hamid
Juga, ini tidak akan memvalidasi bagi mereka yang berkaitan dengan validasi kode.
NotJay
1
Ini bekerja baik untuk saya, sedangkan menggunakan embedtag itu sendiri dianggap unsafeoleh Chrome dan Firefox.
Richie Thomas
1
Untuk beberapa alasan di Android (chrome) itu tidak menanamkan PDF dan malah menawarkan untuk mengunduhnya. Pada iPhone (safari) hanya menampilkan halaman pertama dari PDF.
Ivan Rubinson
21

Konversikan ke PNG melalui ImageMagick, dan tampilkan PNG (cepat dan kotor).

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

Ini adalah opsi yang baik jika Anda memerlukan solusi cepat, ingin menghindari masalah tampilan lintas-browser PDF, dan jika PDF hanya satu atau dua halaman. Tentu saja, Anda perlu menginstal ImageMagick (yang pada gilirannya membutuhkan Ghostscript) pada server web Anda, opsi yang mungkin tidak tersedia di lingkungan hosting bersama. Ada juga plugin PHP (disebut imagick) yang berfungsi seperti ini tetapi memiliki persyaratan khusus sendiri.

Dan Mantyla
sumber
Atau konversi gambar ke PNG menggunakan aplikasi, seperti Pratinjau di Mac.
Garrett
2
tetapi dapatkah Anda melakukannya secara terprogram?
Dan Mantyla
bagaimana jika dokumen tersebut memiliki lebih dari 1 halaman? Saya kira Anda hanya akan menampilkan halaman pertama kemudian
seb
@seb sudah lama tapi saya bisa menggunakannya pada 2 atau 3 halaman PDF. Tidak bijaksana untuk menjadi jauh lebih besar dari itu, saya pikir browser seluler mengalami kesulitan menampilkan gambar seperti itu. Inilah mengapa saya menyebutnya metode "cepat dan kotor", tetapi ini adalah metode yang baik menurut saya selama PDF tidak lebih dari beberapa halaman.
Dan Mantyla
1
Jika Anda membuka PDF menggunakan zend library maka Anda dapat melakukan foreach($pdf->pages as $page)dan membuat gambar untuk setiap halaman
99 Masalah - Sintaksis bukan satu
19

Lihat kode ini - Untuk menanamkan PDF dalam 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>
amIT
sumber
6
Ini sepertinya tidak berhasil. Saya selalu berakhir dengan layar abu-abu kosong, bukan pdf. Tetapi beralih srcuntuk data, seperti dalam jawaban @ Gayle, berhasil.
Mottie
1
Saya menggunakan Chrome 44 dan itu tidak akan berfungsi. Saya juga mencoba mengalihkan data ke src.
NotJay
1
type = "application / pdf" memperbaiki masalah. Bekerja dengan baik di chrome.
Gavin Simpson
13

FDView menggabungkan PDF2SWF (yang berdasarkan xpdf ) dengan penampil SWF sehingga Anda dapat mengonversi dan menyematkan dokumen PDF dengan cepat di server Anda.

xpdf bukan konverter PDF yang sempurna. Jika Anda membutuhkan hasil yang lebih baik maka Ghostview memiliki beberapa kemampuan untuk mengkonversi dokumen PDF ke dalam format lain yang Anda mungkin dapat dengan lebih mudah membangun penampil Flash.

Tetapi untuk dokumen PDF sederhana, FDView harus bekerja dengan cukup baik.

Adam Davis
sumber
Apakah FDView tersedia di tempat lain? code4net.com tampaknya telah menghilang.
Michael Myers
@Michael Bukannya aku bisa dengan mudah menemukan. Saya akan membiarkan jawaban ini jika ada orang yang meng-host fdview di tempat lain.
Adam Davis
12

Masalah kami adalah karena alasan hukum kami tidak diperbolehkan menyimpan sementara PDF di hard disk . Selain itu, seluruh halaman tidak boleh dimuat ulang saat menampilkan PDF sebagai Pratinjau di Browser.

Pertama kami mencoba PDF.jS. Ini bekerja dengan Base64 di penampil untuk Firefox dan Chrome. Namun, itu sangat lambat untuk PDF kami. IE / Edge tidak berfungsi sama sekali.

Karena itu kami mencobanya dengan string Base64 dalam tag objek HTML. Ini lagi tidak bekerja untuk IE / Edge (mungkin masalah yang sama dengan PDF.js). Di Chrome / Firefox / Safari lagi tidak ada masalah. Itu sebabnya kami memilih solusi hybrid. IE / Edge kami menggunakan IFrame dan untuk semua browser lainnya tag-objek.

Solusi IFrame tentu saja juga akan berfungsi untuk Chrome dan co. Alasan mengapa kami tidak menggunakan solusi ini untuk Chrome adalah bahwa meskipun PDF ditampilkan dengan benar, Chrome membuat permintaan baru ke server segera setelah Anda mengklik "unduh" di pratinjau . PdfHelperTransferData -bidang tersembunyi yang diperlukan (untuk mengirim data formulir yang diperlukan untuk pembuatan PDF) tidak lagi ditetapkan karena PDF ditampilkan dalam IFrame. Untuk fitur / bug ini, lihatChrome mengirimkan dua permintaan saat mengunduh PDF (dan membatalkan salah satunya) .

Sekarang masalah anak-anak IE9 dan IE10 tetap. Untuk ini, kami memberikan solusi pratinjau dan hanya mengirim dokumen dengan mengklik tombol pratinjau sebagai unduhan kepada pengguna (bukan pratinjau). Kami telah mencoba banyak tetapi meskipun kami telah menemukan solusi, upaya ekstra untuk bagian kecil pengguna ini tidak akan sepadan dengan usaha tersebut. Anda dapat menemukan solusi kami untuk unduhan di sini: Unduh PDF tanpa menyegarkan dengan IFrame .

Javascript kami:

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

HTML kami:

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

Untuk memeriksa jenis browser untuk IE / Edge lihat di sini: Bagaimana saya bisa mendeteksi Internet Explorer (IE) dan Microsoft Edge menggunakan JavaScript? Saya berharap temuan ini akan menghemat waktu orang lain.

George Maharis
sumber
Maaf, tetapi saya tidak mengerti, nilai apa yang dimiliki variabel "transferData"?
Kate
1
Hai @ Kate, Dalam kasus kami, kami menghasilkan PDF berdasarkan input pengguna di formulir web kami. "transferData" berisi data yang dikirim sebagai JSON ke fungsi pembuatan PDF di API web. Saya telah menambahkan satu baris kode lagi untuk klarifikasi.
George Maharis
10

Anda dapat menggunakan lokasi relatif dari pdf yang disimpan seperti ini:

Contoh 1

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

Contoh2

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

Ahmedakhtar11
sumber
10
  1. Buat wadah untuk menyimpan PDF Anda

    <div id="example1"></div>
  2. Beri tahu PDFObject PDF mana yang akan disematkan, dan di mana untuk menyematkannya

    <script src="/js/pdfobject.js"></script>
    <script>PDFObject.embed("/pdf/sample-3pp.pdf", "#example1");</script>
  3. Anda dapat menggunakan CSS untuk menentukan penataan visual, termasuk dimensi, batas, margin, dll.

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

sumber: https://pdfobject.com/

Kata Bouigherdaine
sumber
Ini adalah solusi yang sangat bagus dan bekerja dengan baik bersama dengan styling bootstrap. Semuanya berjalan di atas elemen bootstrap lainnya.
netfed
Apakah Anda mencoba dengan file gumpalan? Saya menggunakan ini dengan pdf.output('bloburl')dari lib jspdf tetapi tampaknya tidak berfungsi pada IE11.
Hoang Tran Son
8

Scribd tidak lagi mengharuskan Anda meng-host dokumen Anda di server mereka. Jika Anda membuat akun dengan mereka, maka Anda mendapatkan ID penerbit. Hanya diperlukan beberapa baris kode JavaScript untuk memuat file PDF yang disimpan di server Anda sendiri.

Untuk detail lebih lanjut, lihat Alat Pengembang .

Bjorn
sumber
1
Bisakah Anda memposting tautan lain yang menunjukkan bagaimana hal ini dilakukan? Tidak jelas dari tautan yang Anda poskan.
SuperElectric
Sepertinya mereka telah memperbarui situs web mereka dan mengubah halaman ini. Saya pikir halaman ini memiliki konten yang saya maksudkan di posting asli saya: scribd.com/developers/api?method_name=Javascript+API
Bjorn
Saya berharap saya bisa menyukai ini lebih dari sekali, itu berfungsi dengan baik. Gulir ke bagian bawah situs web dan klik API untuk melihat contoh.
Rocco The Taco
1
Pendaftaran sekarang ditutup untuk scribd.
Lance Fisher
4
<object width="400" height="400" data="helloworld.pdf"></object>
Daryl H
sumber
4

PdfToImageServlet menggunakan convertperintah ImageMagick .

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

PLA
sumber
4

Inilah yang saya lakukan dengan AXIOS dan 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)
        })

tambahkan urlPDF secara dinamis ke HTML:

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

Salah satu opsi yang harus Anda pertimbangkan adalah PDF Terkemuka.
Ini memiliki paket gratis kecuali Anda berencana melakukan kolaborasi online real-time pada pdf

Sematkan yang berikut iframeke html apa saja dan nikmati hasilnya:

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

Untuk melakukan streaming file ke browser, lihat pertanyaan Stack Overflow Bagaimana cara streaming file PDF sebagai biner ke browser menggunakan .NET 2.0 - perhatikan bahwa, dengan variasi kecil, ini harus berfungsi apakah Anda menyajikan file dari sistem file atau dihasilkan secara dinamis.

Dengan demikian, artikel MSDN yang dirujuk mengambil pandangan yang agak sederhana tentang dunia, jadi Anda mungkin ingin membaca Berhasil Streaming PDF ke browser melalui HTTPS juga untuk beberapa tajuk yang mungkin perlu Anda pasok.

Menggunakan pendekatan itu, iframe mungkin merupakan cara terbaik untuk pergi. Minta satu webform yang mengalirkan file, lalu letakkan iframe di halaman lain dengan srcatributnya disetel ke formulir pertama.

GalacticCowboy
sumber
4
@downvoter peduli untuk menjelaskan mengapa Anda secara anonim menurunkan jawaban 10 tahun?
GalacticCowboy
1
  1. Buat gumpalan input byte PDF
  2. Gunakan iframe dan PDF.js yang ditambal dengan solusi lintas browser ini

URI untuk iframe akan terlihat seperti ini:

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

Sekarang FF, Chrome, IE 11, dan Edge semua menampilkan PDF dalam penampil di iframe yang diteruskan melalui URI gumpalan standar di URL.

kentut
sumber
1

Saya harus melihat pratinjau PDF dengan React jadi setelah mencoba beberapa perpustakaan solusi optimal saya adalah untuk mengambil data dan menyatukannya.

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

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

Jika Anda tidak ingin meng-host PDF.JS sendiri, Anda dapat mencoba DocDroid . Ini mirip dengan penampil PDF Google Drive tetapi memungkinkan pemberian merek kustom.

Senin
sumber
0

cukup gunakan iFrame untuk PDF.

Saya memiliki kebutuhan spesifik di aplikasi React.js saya, mencoba jutaan solusi tetapi berakhir dengan iFrame :) Selamat mencoba!

Maksym Koshyk
sumber
-7

Saya menemukan ini berfungsi dengan baik dan browser menanganinya di firefox. Saya belum memeriksa IE ...

<script>window.location='url'</script>
Wynn
sumber
Apa yang harus dicapai ini? Saya tidak bisa melihat bagaimana itu menjawab pertanyaan.
TRiG
Ketika saya menyematkan PDF dalam HTML saya, saya menemukan cara terbaik adalah memiliki tautan ke dokumen ini. seperti <a href=" server1.network/trifold_JonesChiro.pdf "target='_blank'> Trifold Portal Klien (contoh) </a> terkadang merupakan jawaban bersih untuk membuka halaman dan menunjukkan pdf vs tring untuk meletakkannya di html. Ini juga memungkinkan pdf untuk tetap terbuka di tab.
Wynn
Jadi rekomendasi Anda adalah menautkan, bukan menanamkan? Tidak apa-apa, tetapi sebagai jawaban ini tidak jelas.
TRiG