Рекомендований спосіб вставлення PDF у HTML?


1181

Який рекомендований спосіб вставити PDF в HTML?

  • iFrame?
  • Об'єкт?
  • Вставити?

Що про це говорить сам Adobe?

У моєму випадку PDF формується на ходу, тому його не можна завантажувати до стороннього рішення перед його промиванням.



На вікі pdf2htmlEX repo є відмінне порівняння не лише конкретних рішень, але й загальних стратегій . Крім того , хоча я не пробував, це , здається, підтримується виделкою.
ShreevatsaR

Відповіді:


541

Можливо, найкращим підходом є використання бібліотеки PDF.JS. Це чистий HTML5 / JavaScript- рендер для документів PDF без будь-яких сторонніх плагінів.

Демонстрація в Інтернеті: http://mozilla.github.com/pdf.js/web/viewer.html

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


12
Як зазначається в іншій відповіді, scribd фактично використовує pdf2swf для перетворення файлів PDF
Peter Craig

8
Я настійно не рекомендую використовувати scribd - я щойно провів експеримент над певним документом, і в firefox 4 він відображає лише перші 3 сторінки, тоді як в IE9 текст його візуалізації неправильний - він зміщує деякі розділи сторінки. Так технічно кажучи, це баггі. Крім того, вони очікують, що ви підпишитеся на друк або завантаження документів! По суті, вони беруть раніше безкоштовні документи та споруджують навколо себе платню.
франкстер

9
Бібліотека PDF.js насправді виглядає дуже вдалим рішенням, хоча пов’язана демонстраційна версія не показує її вбудованої в сторінку (вона займає всю сторінку). Але в ньому використовується полотно HMTL5, тому вбудовувати його потрібно легко, і це швидко . З нижньої сторони потрібно використовувати деякі js, на відміну від <object>: github.com/mozilla/pdf.js/blob/master/examples/helloworld/…
LarsH

33
pdf.js погано працює в браузерах планшетних ПК, таких як Chrome. Я також вважаю, що це дуже-дуже повільно для великих PDF-документів.
Rocco The Тако

10
Я не можу повірити, що це рекомендується. Подивіться на рендеринг шрифту в демонстрації в Інтернеті, вони виглядають тужливими і жахливими. Це набагато краще виглядає з підпіксельною візуалізацією, коли вона відкривається в Adobe Reader.
швидкісний літак

531

Це швидко, легко, до речі і не вимагає сторонніх сценаріїв:

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

ОНОВЛЕННЯ (1/2018):

Веб-переглядач Chrome на Android більше не підтримує вбудовування PDF. Ви можете обійти це за допомогою засобу перегляду PDF на Диску Google

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

30
Краще використовувати тег <object>, щоб можна було включити резервний запас.
Джонатан Хілл

1
Я думав, що розробники хочуть знати, що Mac / Firefox отримує зображення зламаного плагіна. Сторінка плагіна не завантажує плагін, який він шукає. Будь-які ідеї, як обійти це?
Шанімаль

62
якщо ви хочете переконатися, що він буде показаний замість автоматичного завантаження PDF-файлу (як це сталося зі мною), додайте type='application/pdf'в тег "embed"
Hassek

31
Краще використовувати <object>тег, оскільки він може відображати альтернативний вміст у браузерах, які не можуть відображати файли pdfs. Ви навіть можете помістити <embed>тег у <object>тег, якщо хочете. Посилання: stackoverflow.com/questions/1244788/embed-vs-object
Рафаель

1
@raphaelcm Насправді, як я вже говорив раніше, просто за допомогою вбудованого тегу працює у всіх основних браузерах. Навіть IE 7 та 8.
Батфан

361

Ви також можете використовувати Google Viewer Google PDF для цієї мети. Наскільки я знаю, це не офіційна функція Google (я помиляюся в цьому?), Але вона працює для мене дуже красиво і плавно. Вам потрібно завантажити де-небудь раніше і просто скористатися його URL-адресою:

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

Важливо те, що йому не потрібен програвач Flash, він використовує JavaScript.


29
Одне, що слід зазначити, - це те, що є верхня межа розміру PDF, який може відображатися. Я думаю, що зараз це 10 Мб / 100 сторінок. PS: Я не думаю, що глядач "неофіційний"; навіть у них є сторінка, як створити вбудовувану URL-адресу для вас: docs.google.com/viewer
SuperElectric

30
Цей варіант чудово працює, але ви повинні зробити PDF-файли загальнодоступними, що для мене не завжди є варіантом.
KoviNET

4
@riot_starter це рішення більше не працює, якщо ви повністю вийшли з google, воно завантажується нормально, якщо ви повністю ввійшли в нього, він завантажує чудово, однак якщо ви знаходитесь між ними (що б це не означало), він запитає у вас пароль. А у випадку з iframe він просто не завантажується.
dwenaus

5
Вам дозволяється встановити конфіденційність будь-якої Google Docs між public, sign-in requiredі private. Це, безумовно, офіційна функція, оскільки будь-який документ у Документах Google має embedможливість.
b1nary.atr0phy

6
Ще одна річ, яку слід зазначити, це попередження "ви нещодавно зробили занадто багато запитів", що є обмеженням.
kommradHomer

115

Ви маєте певний контроль над тим, як PDF відображається в браузері, передаючи деякі параметри в рядку запиту. Я був радий цій роботі, поки не зрозумів, що це не працює в IE8. :(

Він працює в Chrome 9 та Firefox 3.6, але в IE8 відображається повідомлення "Вставте своє повідомлення про помилку, якщо PDF не може бути відображений".

Я ще не перевіряв старіші версії жодного з перерахованих вище браузерів. Але ось у мене все-таки є випадок, якщо він комусь допомагає. Це встановлює масштаб 85%, видаляє смуги прокрутки, панелі інструментів та панелі навігації. Я оновлю свій пост, якщо я також натраплю на щось, що працює в 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
Це найкраще рішення, оскільки використання можливостей браузера, а не складне сторонне рішення. У всіх сучасних веб-переглядачах (IE9, FF або Chrome) PDF має бути добре вбудованим. Вибачте для користувачів IE 6/7. Їх треба оновити. Ми давно перестали підтримувати ці браузери. :(
Адріан П.

2
Не працює на моєму мобільному планшетному ПК Chrome..FYI ... шкода, було б швидким виправленням.
Rocco The Taco

1
+1 для адреси параметрів масштабування та прокрутки, однак це не працює в останній версії Chrome (44) ... Не вдалося завантажити документ PDF.
NotJay

Можна додати кнопку закриття? і як?
Роберто Сепулведа Браво

@RoccoTheTaco Seconded, не працює на мобільному хромі на андроїд
Anonymous

66

Використання обох <object>і <embed>надасть вам ширшу сумісність браузера.

<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
Це не працюватиме у веб-переглядачах, якщо додаток PDF не встановлений чи застарілий
Umair Hamid

Крім того, це не буде підтверджено для тих, хто пов'язаний з перевіркою коду.
NotJay

1
Для мене це спрацювало чудово, тоді як Chrome і Firefox embedвважали використання тега саме собою unsafe.
Річі Томас

1
Чомусь на Android (хром) він не вбудовує PDF-файл, а пропонує запропонувати його завантажити. На iPhone (сафарі) він показує лише першу сторінку PDF.
Іван Рубінсон

21

Перетворіть його в PNG за допомогою ImageMagick та виведіть на нього PNG (швидко та брудно).

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

Це хороший варіант, якщо вам потрібно швидке рішення, хочете уникнути проблем із переглядом PDF між веб-браузерами та якщо PDF - це лише сторінка чи дві. Звичайно, вам потрібно встановити ImageMagick (який, у свою чергу, потребує Ghostscript) на вашому веб-сервері, що може бути недоступним у спільних хостинг-середовищах. Існує також плагін PHP (званий imagick), який працює так, але він має свої особливі вимоги.


Або конвертувати зображення в PNG за допомогою програми, наприклад Preview на Mac.
Гаррет

2
але чи можна це робити програмно?
Дан Мантіла

що робити, якщо документ має більше 1 сторінки? Я припускаю , що ви будете показувати лише першу сторінку , то
СЕБ

@seb минуло певний час, але мені вдалося використати його на двох-трьох сторінках PDF-файлах. Не було б розумним виглядати набагато більше цього, я думаю, що мобільні браузери важко відображають подібні зображення. Ось чому я назвав це «швидким і брудним» методом, але вважаю, що це хороший спосіб, поки PDF не має кількох сторінок.
Дан Мантіла

1
Якщо ви відкриєте PDF за допомогою бібліотеки zend, ви можете зробити a foreach($pdf->pages as $page)і створити зображення для кожної сторінки
99 Проблеми - Синтаксис не один

19

Погляньте на цей код - Вбудовувати PDF у 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
Це, здається, не працює. Я завжди закінчую порожній сірий екран замість pdf. Але перемикання srcна data, як у відповіді @ Gayle, працює.
Мотті

1
Я використовую Chrome 44 і він не працюватиме. Я також спробував переключити дані на src.
NotJay

type = "application / pdf" виправляє проблему. Чудово працює в хромі.
Гевін Сімпсон,

13

FDView поєднує PDF2SWF (який базується на xpdf ) та SWF перегляду щоб ви могли конвертувати та вбудовувати PDF-документи влітку на своєму сервері.

xpdf не є ідеальним конвертором PDF. Якщо вам потрібні кращі результати, тоді Ghostview має певну можливість конвертувати PDF-документи в інші формати, для яких, можливо, ви зможете легше створити переглядач Flash.

Але для простих документів PDF FDView має працювати досить добре.


Чи доступний FDView деінде? code4net.com, здається, зник.
Майкл Майерс

@Michael Не те, що мене легко знайти. Залишаю цю відповідь на випадок, коли хтось повторно влаштує fdview десь в іншому місці.
Адам Девіс

12

Наша проблема полягає в тому, що з юридичних причин нам заборонено тимчасово зберігати PDF на жорсткому диску . Крім того, не слід перезавантажувати всю сторінку під час відображення PDF у форматі попереднього перегляду в браузері.

Спочатку ми спробували PDF.jS. Він працював з Base64 у програмі перегляду Firefox та Chrome. Однак для нашого PDF це було неприпустимо повільно. IE / Edge взагалі не працював.

Тому ми спробували його з рядком Base64 у тезі HTML-об’єкта. Це знову не спрацювало для IE / Edge (можливо, така ж проблема, як і для PDF.js). У Chrome / Firefox / Safari знову немає проблем. Тому ми обрали гібридне рішення. IE / Edge ми використовуємо IFrame, а для всіх інших браузерів - тег об'єктів.

Рішення IFrame, звичайно, також буде працювати для Chrome і co. Причина, чому ми не використали це рішення для Chrome, полягає в тому, що, хоча PDF відображається правильно, Chrome робить новий запит на сервер, як тільки ви натискаєте кнопку "завантажити" у попередньому перегляді . Обов’язковий прихованим полем pdfHelperTransferData в (для надсилання даних форми, необхідні для генерації PDF) більше не встановлені, оскільки PDF відображається в IFrame. Про цю функцію / помилку дивПід час завантаження PDF Chrome надсилає два запити (і скасовує один з них) .

Зараз проблемні діти IE9 та IE10 залишаються. Для цього ми відмовились від рішення для попереднього перегляду та просто надіслали документ, натиснувши кнопку попереднього перегляду як завантаження користувачеві (замість попереднього перегляду). Ми багато пробували, але навіть якби ми знайшли рішення, додаткові зусилля для цієї крихітної частини користувачів не були б варті зусиль. Ви можете знайти наше рішення для завантаження тут: Завантажте PDF без оновлення за допомогою IFrame .

Наш 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);
            }
        })
 }

Наш 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>

Щоб перевірити тип браузера на IE / Edge, див. Тут: Як я можу виявити Internet Explorer (IE) та Microsoft Edge за допомогою JavaScript? Сподіваюся, ці висновки заощадять комусь інший час.


Вибачте, але я не розумію, яке значення має змінна "transferData"?
Кейт

1
Привіт @Kate, У нашому випадку ми генеруємо PDF на основі введення користувача у нашій веб-формі. "transferData" містить дані, які надсилаються у вигляді JSON функції генерації PDF у веб-API. Я додав рядок більше коду для уточнення.
Джордж Махаріс

10
  1. Створіть контейнер для зберігання Вашого PDF

    <div id="example1"></div>
  2. Скажіть PDFObject, який PDF вбудувати та куди його вставити

    <script src="/js/pdfobject.js"></script>
    <script>PDFObject.embed("/pdf/sample-3pp.pdf", "#example1");</script>
  3. Ви можете додатково використовувати CSS для визначення візуального стилю, включаючи розміри, облямівку, поля тощо.

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

джерело: https://pdfobject.com/


Це було дуже хорошим рішенням і добре працювало в поєднанні зі стилем завантаження. Все проходило поверх інших елементів завантаження.
netfed

Ви спробували з файлом blob? Я використовував це з pdf.output('bloburl')lib jspdf, але, здається, не працює на IE11.
Син Хоанг Тран

9

Ви можете використовувати відносне розташування збереженого формату PDF так:

Приклад1

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

Приклад2

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


8

Scribd більше не вимагає від вас розміщення документів на їх сервері. Якщо ви створите обліковий запис у них, ви отримаєте ідентифікатор видавця. Для завантаження файлів PDF, що зберігаються на вашому власному сервері, потрібно лише кілька рядків коду JavaScript.

Докладніше див. Інструменти для розробників .


1
Чи можете ви опублікувати ще одне посилання, що показує, як це робиться? З посилання, яке ви опублікували, незрозуміло.
SuperElectric

Схоже, вони оновили свій веб-сайт і змінили цю сторінку. Я думаю, що ця сторінка має той вміст, про який я згадував у своєму початковому дописі: scribd.com/developers/api?method_name=Javascript+API
Bjorn

Мені б хотілося, що це могло мені сподобатися не раз, воно працює чудово. Прокрутіть донизу веб-сайту та натисніть API, щоб переглянути приклади.
Rocco The Taco

1
Підписки тепер закриті для scribd.
Ленс Фішер


4

PdfToImageServlet за допомогою convertкоманди ImageMagick .

Приклад використання: <img src='/webAppDirectory/PdfToImageServlet?pdfFile=/usr/share/cups/data/default-testpage.pdf'>


4

Так я зробив з AXIOS та 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)
        })

динамічно додайте urlPDF до HTML:

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

3

Один із варіантів, який слід врахувати, - це помітний PDF.
Він має вільний план, якщо ви не плануєте здійснювати онлайн-співпрацю в режимі реального часу на pdfs

Вставте наступне iframeу будь-який html та насолоджуйтесь результатами:

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

2

Щоб передати файл у веб-переглядач, див. Запитання про переповнення стека. Як передавати файл PDF у вигляді двійкового до браузера за допомогою .NET 2.0 - зауважте, що при незначних варіаціях це має працювати, чи подаєте ви файл з файлової системи або динамічно генерується.

Зважаючи на це, згадана стаття MSDN має досить спрощений погляд на світ, тому ви, можливо, захочете прочитати PDF-файл із успішною передачею в браузер через HTTPS , а також для деяких заголовків, які можуть вам знадобитися.

Використовуючи такий підхід, iframe - це, мабуть, найкращий шлях. Майте одну веб-форму, яка передає файл, а потім поставте iframe на іншу сторінку з srcатрибутом, встановленим у першій формі.


4
@downvoter піклується про те, щоб пояснити, чому ви анонімно відмовляєтесь від відповіді на 10 років?
GalacticCowboy

1
  1. Побудуйте крапку вхідних байтів PDF
  2. Використовуйте параметр iframe та PDF.js, виправлений із цим вирішенням перехресного веб-переглядача

URI для iframe повинен виглядати приблизно так:

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

Тепер FF, Chrome, IE 11 та Edge всі відображають PDF у переглядачі в iframe, що передається через стандартний URI-код блобу в URL-адресі.


0

Якщо ви не хочете розміщувати PDF.JS самостійно, ви можете спробувати DocDroid . Він схожий на переглядач файлів PDF на Диску Google, але дозволяє користуватися брендом.


0

Мені довелося переглядати PDF з React, тому після спробу декількох бібліотек моїм оптимальним рішенням було отримання даних та передавання їх по електронній пошті.

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

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

-7

Я виявив, що це працює чудово, і браузер обробляє його у firefox. Я не перевірив IE ...

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

Чого цього слід досягти? Я не бачу, як це відповідає на питання.
TRiG

Коли я вставляю PDF у свій HTML, я вважаю, що найкращий спосіб - це посилання на цей документ. наприклад <a href=" server1.network/trifold_JonesChiro.pdf "target='_blank'> Потрійний портал клієнта (зразок) </a>, іноді є чистою відповіддю відкрити сторінку та показати pdf vs tring, щоб розмістити її в html. Це також дозволяє pdf залишатися відкритим на вкладці.
Wynn

Тож ваша рекомендація - пов'язувати, а не вставляти? Це добре, але як відповідь це зовсім незрозуміло.
TRiG
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.