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.



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


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

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.


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>

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>

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.


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>

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.


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.


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>


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/


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 .


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>

4

PdfToImageServlet menggunakan convertperintah ImageMagick .

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


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>

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>

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.


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.


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>

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.


0

cukup gunakan iFrame untuk PDF.

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


-7

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

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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.