Можно ли открыть диалоговое окно печати файла PDF с помощью Javascript?

Я знаю, как открыть веб-страницу в новом окне и добавить javascript, чтобы появилось диалоговое окно печати. Есть ли способ сделать то же самое с файлом PDF?


person user83358    schedule 26.03.2009    source источник
comment
Для этого не нужно использовать javascript. Вместо этого используйте именованное действие, которое будет работать, даже если javascript отключен.   -  person some    schedule 12.11.2013


Ответы (10)


Да, ты можешь...

PDF-файлы имеют поддержку Javascript. Мне нужно было иметь возможности автоматической печати, когда был создан PDF-файл, сгенерированный PHP, и я смог использовать FPDF, чтобы заставить его работать:

http://www.fpdf.org/en/script/script36.php

person Edward    schedule 22.03.2010
comment
Как минимум, просто добавьте <script type="text/javascript">print();</script> в свой PDF-файл. (я использую домпдф) - person mpen; 09.11.2011
comment
Поздно на вечеринку, но как этого добиться с помощью сторонней библиотеки? - person Adrian; 08.11.2018

Обычно я делаю что-то похожее на подход, описанный в Как использовать JavaScript для печати PDF (eHow.com), используя файл iframe.

  1. функция для размещения триггера печати...

    function printTrigger(elementId) {
        var getMyFrame = document.getElementById(elementId);
        getMyFrame.focus();
        getMyFrame.contentWindow.print();
    }
    
  2. кнопка, чтобы дать пользователю доступ...

    (onClick на a или button или input или как вам угодно)

    <input type="button" value="Print" onclick="printTrigger('iFramePdf');" />
    
  3. iframe, указывающий на ваш PDF...

    <iframe id="iFramePdf" src="myPdfUrl.pdf" style="display:none;"></iframe>
    

Дополнительная идея №1. Создайте iframe и добавьте его на свою страницу в printTrigger();, чтобы PDF-файл не загружался, пока пользователь не нажмет кнопку «Печать», после чего javascript может атаковать! iframe и вызвать диалоговое окно печати.


Дополнительная идея № 2. Дополнительный кредит, если вы отключите кнопку «Печать» и дадите пользователю небольшой индикатор загрузки или что-то еще после того, как он нажмет на нее, чтобы они знали, что что-то находится в процессе, вместо того, чтобы нажимать ее несколько раз!

person brandonjp    schedule 15.05.2011
comment
contentWindow, похоже, не определяется при загрузке PDF в Google Chrome - person Jeroen; 18.07.2011
comment
@jtietema Я считаю, что если вы загружаете PDF прямо в браузер как весь и единственный документ (т. Е. Не в iframe), то contentWindow не определено. Но пока вы загружаете PDF внутри iframe И из того же домена, что и ваш родительский DOM, это должно работать нормально. - person brandonjp; 04.08.2011
comment
Этот ответ больше не работает в Firefox (в настоящее время v25) stackoverflow.com/questions/15011799/ См. отчет об ошибке: bugzilla.mozilla.org/show_bug.cgi?id=911444 - person chrishiestand; 02.12.2013
comment
Выдает ошибку 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!

person mheavers    schedule 24.03.2011

Я использую 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. Я не искал больше в этом.

person some    schedule 03.07.2012

Пример кода для вставки:

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

person RandomGuy87    schedule 01.06.2010
comment
TypeError: у объекта нет метода printWithDialog - person Salizar Marxx; 15.01.2013
comment
Для тех, кто читает это: правильное имя функции — Print() с заглавной P. В этом примере правильный вызов будет examplePDF.Print() - person Erwin; 25.04.2014

Если вы знаете, как устроены PDF-файлы (или готовы немного потратиться на чтение спецификации), вы можете сделать это следующим образом.

Используйте Именованное действие «Печать» в поле OpenAction объекта «Каталог»; действие «Печать» не задокументировано, но Acrobat Reader и большинство других основных программ чтения его понимают. Приятным преимуществом этого подхода является то, что вы не получаете никаких предупреждений JavaScript. Подробнее см. здесь: http://www.gnostice.com/nl_article.asp?id= 157

Чтобы сделать его еще более блестящим, я добавил второе действие, URI, указывающее читателю вернуться на страницу, с которой был отправлен запрос. Затем я прикрепил это действие к первому названному действию, используя его поле «Далее». Когда расположение содержимого установлено на «встроенный», это делает так, что когда пользователь нажимает ссылку для печати:

  1. Он открывает Adobe Reader на той же вкладке и загружает файл
  2. Он сразу показывает диалог печати
  3. Как только диалоговое окно «Печать» закрывается (независимо от того, нажимают ли они «ОК» или «Отмена»), вкладка браузера возвращается на веб-страницу.

Я смог достаточно легко внести все эти изменения в Ruby, используя только модули File и IO; Я открыл PDF-файл, созданный с помощью внешнего инструмента, перешел по внешней ссылке к существующему разделу «Каталог», затем добавил в PDF-файл новый раздел с обновленным объектом «Каталог», содержащим мою специальную строку OpenAction, а также новые объекты «Действие».

Благодаря функциям инкрементной редакции PDF вам не нужно вносить какие-либо изменения в существующие данные, чтобы сделать это, просто добавьте дополнительный раздел в конец.

person DSimon    schedule 04.11.2011
comment
Спасибо за ваш пост, который привел меня в правильном направлении. Он работает отлично! - person some; 03.07.2012

Почему бы не использовать опцию меню «Действия», чтобы установить это?

Выполните следующие действия. Если у вас есть Acrobat Pro, перейдите на вкладку страниц, щелкните правой кнопкой мыши миниатюру первой страницы и выберите свойства страницы. Нажмите на вкладку «Действия» в верхней части окна и в разделе «Выбор триггера» выберите «Открыть страницу». В разделе выбора действия выберите "Выполнить элемент меню". Нажмите кнопку «Добавить», затем выберите «Файл» > «Печать», затем «ОК». Нажмите «ОК» еще раз и сохраните PDF-файл.

person helpingout    schedule 14.09.2011

Если вы используете гем prawn для Ruby on Rails для создания PDF-файла, вы можете использовать следующие дополнительные gem, чтобы активировать диалоговое окно печати:

креветка-print

person Justin Tanner    schedule 29.05.2012

Другое решение:

<input type="button" value="Print" onclick="document.getElementById('PDFtoPrint').focus(); document.getElementById('PDFtoPrint').contentWindow.print();">
person Yasin Bikmazer    schedule 20.10.2016

если вы вставите 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>

Надеюсь, это поможет.

person Community    schedule 11.05.2009
comment
Вы тестировали этот код? Я получаю сообщение об ошибке, в котором говорится, что объект не поддерживает это свойство метода. - person ichiban; 11.05.2009