Я знаю, как открыть веб-страницу в новом окне и добавить javascript, чтобы появилось диалоговое окно печати. Есть ли способ сделать то же самое с файлом PDF?
Можно ли открыть диалоговое окно печати файла PDF с помощью Javascript?
Ответы (10)
Да, ты можешь...
PDF-файлы имеют поддержку Javascript. Мне нужно было иметь возможности автоматической печати, когда был создан PDF-файл, сгенерированный PHP, и я смог использовать FPDF, чтобы заставить его работать:
http://www.fpdf.org/en/script/script36.php
<script type="text/javascript">print();</script> в свой PDF-файл. (я использую домпдф)
- person mpen; 09.11.2011
Обычно я делаю что-то похожее на подход, описанный в Как использовать JavaScript для печати PDF (eHow.com), используя файл iframe.
функция для размещения триггера печати...
function printTrigger(elementId) { var getMyFrame = document.getElementById(elementId); getMyFrame.focus(); getMyFrame.contentWindow.print(); }кнопка, чтобы дать пользователю доступ...
(
onClickнаaилиbuttonилиinputили как вам угодно)<input type="button" value="Print" onclick="printTrigger('iFramePdf');" />iframe, указывающий на ваш PDF...
<iframe id="iFramePdf" src="myPdfUrl.pdf" style="display:none;"></iframe>
Дополнительная идея №1. Создайте iframe и добавьте его на свою страницу в printTrigger();, чтобы PDF-файл не загружался, пока пользователь не нажмет кнопку «Печать», после чего javascript может атаковать! iframe и вызвать диалоговое окно печати.
Дополнительная идея № 2. Дополнительный кредит, если вы отключите кнопку «Печать» и дадите пользователю небольшой индикатор загрузки или что-то еще после того, как он нажмет на нее, чтобы они знали, что что-то находится в процессе, вместо того, чтобы нажимать ее несколько раз!
contentWindow не определено. Но пока вы загружаете PDF внутри iframe И из того же домена, что и ваш родительский DOM, это должно работать нормально.
- person brandonjp; 04.08.2011
Uncaught DOMException: Blocked a frame with origin "http://localhost:8080" from accessing a cross-origin frame.
- person Rajeshwar; 28.02.2018
Только что выяснил, как это сделать в самом PDF-файле - если у вас есть Acrobat Pro, перейдите на вкладку своих страниц, щелкните правой кнопкой мыши миниатюру первой страницы и выберите свойства страницы. Нажмите на вкладку «Действия» в верхней части окна и в разделе «Выбор триггера» выберите «Открыть страницу». При выборе действия выберите «запустить javascript». Затем в окне javascript введите следующее:
this.print({bUI: false, bSilent: true, bShrinkToFit: true});
Это напечатает ваш документ без диалога на принтере по умолчанию на вашем компьютере. Если вы хотите диалоговое окно печати, просто измените bUI на true, bSilent на false и, при необходимости, удалите параметр сжатия для подгонки.
Автоматическая печать PDF!
printParams, но это происходит с javascript, показанным в этом ответе. Либо работает, если Acrobat отображает PDF. Ни один из них не работает для кода отображения PDFJS FireFox 20 и 21.
- person Lee Meador; 22.05.2013
Я использую named action вместо javascript, потому что javascript часто отключен, и если это не так, он выдает предупреждение.
Мое веб-приложение создает файл postscript, который затем преобразуется с помощью ghostscript в pdf. Я хочу, чтобы он печатался автоматически, потому что пользователь уже нажал кнопку печати внутри моего приложения. С информацией об именованных действиях от @DSimon выше, я исследовал, как решить эту проблему. Все сводится к тому, чтобы вставить строку /Type /Action /S /Named /N /Print в нужное место в pdf.
Я думал написать небольшую утилиту, но она должна разобрать pdf, чтобы найти корневой узел, вставить /OpenAction со ссылкой на объект с действием и пересчитать смещения байтов в xref.
Но затем я узнал о pdfmark, который является расширением postscript для выражения в синтаксисе postscript идиом, которые преобразуются в pdf программой Adobe Distiller или ghostscript.
Поскольку я уже использую ghostscript, все, что мне нужно сделать, это добавить следующее в конец моего файла postscript:
%AUTOPRINT
[ /_objdef {PrintAction} /type /dict /OBJ pdfmark
[ {PrintAction} << /Type /Action /S /Named /N /Print >> /PUT pdfmark
[ {Catalog} << /OpenAction {PrintAction} >> /PUT pdfmark
и ghostscript создаст действие, свяжет его и рассчитает смещения внешних ссылок. (В постскриптуме % — комментарий, а PrintAction — мое имя объекта)
Глядя на PDF, я вижу, что он создал это:
1 0 obj
<</Type /Catalog /Pages 3 0 R
/OpenAction 9 0 R
/Metadata 10 0 R
>>
endobj
9 0 obj
<</S/Named
/Type/Action
/N/Print>>endobj
1 0 — это объект 1, ревизия 0, а 9 0 — это объект 9, ревизия 0. В pdf-трейлере сказано, что именно объект 1 является корневым узлом. Как видите, есть ссылка из объекта 1, /OpenAction, для запуска объекта 9 ревизии 0.
С помощью ghostscript можно преобразовать pdf в postscript (pdf2ps), добавить текст выше и преобразовать его обратно в pdf с помощью ps2pdf. Следует отметить, что при этом преобразовании теряется метаинформация о pdf. Я не искал больше в этом.
Пример кода для вставки:
<object type="application/pdf" data="example.pdf" width="100%" height="100%" id="examplePDF" name="examplePDF"><param name='src' value='example.pdf'/></object>
<script>
examplePDF.printWithDialog();
</script>
Возможно, придется повозиться с идентификаторами/именами. С помощью Adobe Reader...
examplePDF.Print()
- person Erwin; 25.04.2014
Если вы знаете, как устроены PDF-файлы (или готовы немного потратиться на чтение спецификации), вы можете сделать это следующим образом.
Используйте Именованное действие «Печать» в поле OpenAction объекта «Каталог»; действие «Печать» не задокументировано, но Acrobat Reader и большинство других основных программ чтения его понимают. Приятным преимуществом этого подхода является то, что вы не получаете никаких предупреждений JavaScript. Подробнее см. здесь: http://www.gnostice.com/nl_article.asp?id= 157а>
Чтобы сделать его еще более блестящим, я добавил второе действие, URI, указывающее читателю вернуться на страницу, с которой был отправлен запрос. Затем я прикрепил это действие к первому названному действию, используя его поле «Далее». Когда расположение содержимого установлено на «встроенный», это делает так, что когда пользователь нажимает ссылку для печати:
- Он открывает Adobe Reader на той же вкладке и загружает файл
- Он сразу показывает диалог печати
- Как только диалоговое окно «Печать» закрывается (независимо от того, нажимают ли они «ОК» или «Отмена»), вкладка браузера возвращается на веб-страницу.
Я смог достаточно легко внести все эти изменения в Ruby, используя только модули File и IO; Я открыл PDF-файл, созданный с помощью внешнего инструмента, перешел по внешней ссылке к существующему разделу «Каталог», затем добавил в PDF-файл новый раздел с обновленным объектом «Каталог», содержащим мою специальную строку OpenAction, а также новые объекты «Действие».
Благодаря функциям инкрементной редакции PDF вам не нужно вносить какие-либо изменения в существующие данные, чтобы сделать это, просто добавьте дополнительный раздел в конец.
Почему бы не использовать опцию меню «Действия», чтобы установить это?
Выполните следующие действия. Если у вас есть Acrobat Pro, перейдите на вкладку страниц, щелкните правой кнопкой мыши миниатюру первой страницы и выберите свойства страницы. Нажмите на вкладку «Действия» в верхней части окна и в разделе «Выбор триггера» выберите «Открыть страницу». В разделе выбора действия выберите "Выполнить элемент меню". Нажмите кнопку «Добавить», затем выберите «Файл» > «Печать», затем «ОК». Нажмите «ОК» еще раз и сохраните PDF-файл.
Если вы используете гем prawn для Ruby on Rails для создания PDF-файла, вы можете использовать следующие дополнительные gem, чтобы активировать диалоговое окно печати:
Другое решение:
<input type="button" value="Print" onclick="document.getElementById('PDFtoPrint').focus(); document.getElementById('PDFtoPrint').contentWindow.print();">
если вы вставите PDF-файл на свою веб-страницу и сошлетесь на идентификатор объекта, вы сможете это сделать.
например. в вашем HTML:
<object ID="examplePDF" type="application/pdf" data="example.pdf" width="500" height="500">
в вашем javascript:
<script>
var pdf = document.getElementById("examplePDF");
pdf.print();
</script>
Надеюсь, это поможет.