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

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

Ответ 1

Да, вы можете...

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

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

Ответ 2

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

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

    function printTrigger(elementId) {
        var getMyFrame = document.getElementById(elementId);
        getMyFrame.focus();
        getMyFrame.contentWindow.print();
    }
    
  • кнопка для доступа пользователя...

    (a onClick на a или button или input или все, что вы пожелаете)

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

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

Идея Bonus Idea # 1. Создайте iframe и добавьте ее на свою страницу в printTrigger();, чтобы PDF файл не был загружен, пока пользователь не нажмет кнопку "Печать", затем javascript может атаковать! iframe и вызвать диалог печати. ​​


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

Ответ 3

Просто выяснилось, как это сделать в самом PDF файле - если у вас есть acrobat pro, перейдите на вкладку "Страницы", щелкните правой кнопкой мыши на миниатюре для первой страницы и щелкните свойства страницы. Перейдите на вкладку действий в верхней части окна и в окне выбора триггера выберите страницу. В рамках действия select выберите "запустить javascript". Затем в окне javascript введите следующее:

this.print({bUI: false, bSilent: true, bShrinkToFit: true});

Это напечатает ваш документ без диалога с принтером по умолчанию на вашем компьютере. Если вы хотите диалог печати, просто измените bUI на true, bSilent на false и, возможно, удалите параметр shrink to fit.

Авто-печать PDF!

Ответ 4

Я использую named action вместо javascript, потому что javascript часто отключается, и если он не дает предупреждения.

Мое веб-приложение создает файл postscript, который затем преобразуется с ghostscript в pdf. Я хочу, чтобы он печатался автоматически, поскольку пользователь уже нажал на печать внутри моего приложения. С информацией о названных действиях от @DSimon выше, я исследовал, как это решить. Все это сводится к вставке строки /Type /Action /S /Named /N /Print в нужное место в pdf.

Я подумывал написать небольшую утилиту, но он должен разобрать pdf, чтобы найти корень node, вставить /OpenAction с ссылкой на объект с действием и пересчитать байты-смещения в xref.

Но потом я узнал о pdfmark, который является расширением для postscript, чтобы выразить в синтаксисе postscript, идиомы, которые были преобразованы в pdf с помощью Distiller Adobes или 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 создадут действие, свяжут его и посчитают смещения xref. (В postscript % есть комментарий, а 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, который является корнем node. Как вы можете видеть, существует ссылка от объекта 1, /OpenAction для запуска ревизии объекта 9.

С помощью ghostscript можно преобразовать pdf в постскриптум (pdf2ps), добавить текст выше и преобразовать его обратно в pdf с помощью ps2pdf. Следует отметить, что в этом преобразовании теряется метаинформация о pdf. Я больше не искал этого.

Ответ 5

Вставить код примера:

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

Ответ 6

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

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

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

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

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

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

Ответ 7

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

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

Ответ 8

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

prawn-print

Ответ 9

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

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

Ответ 10

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

Я надеюсь, что это поможет.