Создать PDF, который автоматически печатает - PullRequest
11 голосов
/ 29 мая 2011

У меня есть веб-приложение ASP.NET, которое генерирует PDF. Я использую iTextSharp. Что происходит, когда вы нажимаете кнопку, и она загружается. Мой работодатель хочет, чтобы можно было нажать кнопку и открыть ее в диалоговом окне печати. ​​

Ответы [ 5 ]

12 голосов
/ 29 мая 2011

Метод 1: Использование встроенного javascript внутри ваших файлов PDF Вы можете попробовать создать iText PDFAction объект с вызовом javascript this.print(false) (для этого вы можете использовать new PdfAction(PdfAction.PRINTDIALOG))и связать его с событием OpenAction вашего pdf-файла.

Код в iText Java должен выглядеть следующим образом:

PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("file.pdf"));
...
PdfAction action = new PdfAction(PdfAction.PRINTDIALOG);
writer.setOpenAction(action);
...

Он не должен быть слишком разнымв C #.

В качестве примечания, это также возможно с Amyuni PDF Creator .Net , если для атрибута "AutoPrint" установлено значение TRUE в классе документа ( применяется обычный отказ от ответственности).

acPDFCreatorLib.Initialize();
acPDFCreatorLib.SetLicenseKey("Amyuni Tech.", "07EFCDA00...BC4FB9CFD");
Amyuni.PDFCreator.IacDocument document = pdfCreator1.Document;

// Open a PDF document from file
System.IO.FileStream file1 = new System.IO.FileStream("test_input.pdf", FileMode.Open, FileAccess.Read, FileShare.Read);

IacDocument document = new IacDocument(null);

if (document.Open(file1, ""))
{
    //Set AutoPrint
    document.Attribute("AutoPrint").Value = true;

    //Save the document
    System.IO.FileStream file2 = new System.IO.FileStream("test_output.pdf", System.IO.FileMode.Create, System.IO.FileAccess.Write);
    document.Save(file2, Amyuni.PDFCreator.IacFileSaveOption.acFileSaveView);
}

// Disposing the document before closing the stream clears out any data structures used by the Document object
document.Dispose();

file1.Close();

// terminate library to free resources
acPDFCreatorLib.Terminate();

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

Метод 2: Использование javascript из браузера для связи с читателем, который показывает файл.
Я нашел этот другой подход в это ТАК вопрос, который стоит попробовать:

<html>
<script language="javascript">
timerID = setTimeout("exPDF.print();", 1000);
</script>
<body>
<object id="exPDF" type="application/pdf" data="111.pdf" width="100%" height="500"/>
</body>
</html>

Идея состоит в том, чтобы использовать javascript в браузере, чтобы дать команду читателю PDF распечатать файл.Этот подход будет работать с файлами PDF, встроенными в страницу HTML.

4 голосов
/ 18 июля 2013

Другое решение на этом сайте ... Я использую это решение и отлично работаю

У меня есть отчет PDF Stream из Crystal, и я добавляю открытую ссылку с помощью pdfsharp

ссылка: http://www.vo1dmain.info/pdfsharp-howto-inject-javascript-into-pdf-autoprinting-functionality#comments

public static MemoryStream AddAutoPrint(Stream pdfStream, bool ShowPrintDialog = true, int NumCopies = 1)
{
  PdfSharp.Pdf.PdfDocument doc = PdfSharp.Pdf.IO.PdfReader.Open(pdfStream, PdfSharp.Pdf.IO.PdfDocumentOpenMode.Import);
  PdfSharp.Pdf.PdfDocument outputDocument = new PdfSharp.Pdf.PdfDocument();

  for (int idx = 0; idx < doc.PageCount; idx++)
  {
    PdfSharp.Pdf.PdfPage p = doc.Pages[idx];
    outputDocument.AddPage(p);
  }

  outputDocument.Info.Author = "author name";

  string JSScript = string.Empty;
  JSScript += "var pp = this.getPrintParams(); ";

  if(NumCopies > 0)
  {
    JSScript += "pp.NumCopies = " + NumCopies.ToString() + "; ";
  }

  if(!ShowPrintDialog)
  {
     JSScript += "pp.interactive = pp.constants.interactionLevel.automatic; ";
  }


  JSScript += "this.print({printParams: pp}); ";


  PdfSharp.Pdf.PdfDictionary dictJS = new PdfSharp.Pdf.PdfDictionary();
  dictJS.Elements["/S"] = new PdfSharp.Pdf.PdfName("/JavaScript");
  //dictJS.Elements["/JS"] = new PdfSharp.Pdf.PdfStringObject(outputDocument, "print(true);");
  //dictJS.Elements["/JS"] = new PdfSharp.Pdf.PdfStringObject(outputDocument, "this.print({bUI: false, bSilent: true, bShrinkToFit: true});");
  //dictJS.Elements["/JS"] = new PdfSharp.Pdf.PdfStringObject(outputDocument, "var pp = this.getPrintParams(); pp.NumCopies = 2; pp.interactive = pp.constants.interactionLevel.automatic; this.print({printParams: pp});");
  dictJS.Elements["/JS"] = new PdfSharp.Pdf.PdfStringObject(outputDocument, JSScript);


  outputDocument.Internals.AddObject(dictJS);

  PdfSharp.Pdf.PdfDictionary dict = new PdfSharp.Pdf.PdfDictionary();
  PdfSharp.Pdf.PdfArray a = new PdfSharp.Pdf.PdfArray();
  dict.Elements["/Names"] = a;
  a.Elements.Add(new PdfSharp.Pdf.PdfString("EmbeddedJS"));
  a.Elements.Add(PdfSharp.Pdf.Advanced.PdfInternals.GetReference(dictJS));

  outputDocument.Internals.AddObject(dict);

  PdfSharp.Pdf.PdfDictionary group = new PdfSharp.Pdf.PdfDictionary();
  group.Elements["/JavaScript"] = PdfSharp.Pdf.Advanced.PdfInternals.GetReference(dict);

  outputDocument.Internals.Catalog.Elements["/Names"] = group;

  MemoryStream ms = new MemoryStream();

  outputDocument.Save(ms, false);

  return ms;
}
3 голосов
/ 30 мая 2011

Как упомянуто yms, вы можете создать PDF-файл с JavaScript или «Именованное» действие PDF, которое показывает диалоговое окно «Печать» при открытии документа.Мы продемонстрировали это, используя наш продукт Gnostice PDFOne .NET в статье Создание автоматической печати PDF .Вы можете сделать то же самое в iText, я думаю.Если Adobe Reader зарегистрирован как плагин PDF в браузере, то оба варианта будут работать.

Опция HTML Javascript, похоже, работает только в IE.

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я работаю для Gnostice.

1 голос
/ 29 ноября 2018

В iTextSharp сделать:

PdfDocument = pdfDoc = new Document(PageSize.LETTER);
// create and open the new pdf document for writing
FileStream fspdfDoc = new FileStream(pdfDocFileName, FileMode.Create, 
FileAccess.ReadWrite);
PdfWriter pdfW = PdfWriter.GetInstance(pdfDoc, fspdfDoc);
pdfDoc.Open();
pdfW.AddJavaScript(PdfAction.JavaScript("this.print(true);\r", pdfW));
0 голосов
/ 05 марта 2017

КАК о старой доброй моде OLE? Он по-прежнему поддерживается большинством всех слоев документов, которые мне известны ... В C # я обычно делаю что-то вроде этого ... где PDF, RTF, DOC, XLS ... не имеет значения ... они все печатают ..

public void HandlePresentation(string fullFilePath, bool viewOnScreen, bool autoPrint)
{
    ProcessStartInfo info = new ProcessStartInfo(fullFilePath);
    if (autoPrint)
    {
        info.Verb = "Print";
        info.WindowStyle = ProcessWindowStyle.Hidden; // not normally required
        Process.Start(info);
        info.Verb = string.Empty;
    }

    if (viewOnScreen)
    {
        info.WindowStyle = ProcessWindowStyle.Normal;
        Process.Start(info);
    }
}
...