У меня есть веб-приложение ASP.NET, которое создает PDF файл. Я использую iTextSharp. Случается, что вы нажимаете кнопку, и она загружается. Мой работодатель хочет иметь возможность щелкнуть кнопку и открыть ее с помощью диалогового окна печати.
Создайте PDF файл, который автоматически печатает
Ответ 1
Метод 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);
...
Он не должен быть слишком разным в С#.
В качестве дополнительной заметки это также возможно с 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 из браузера для связи с читателем, который показывает файл.
Я нашел этот другой подход в этом SO вопросе, который стоит попробовать:
<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-страницу.
Ответ 2
Другое решение на этом сайте... Я использую это решение и отлично работаю
У меня есть поток PDF из отчета Crystal, и я добавляю openaction с помощью pdfsharp
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
Как уже упоминалось yms, вы можете создать PDF-документ, в котором есть JavaScript или "Именованное" действие PDF, которое отображает диалоговое окно "Печать" при открытии документа. Мы продемонстрировали это с помощью нашего продукта Gnostice PDFOne.NET в статье Создать PDF для автоматической печати. Вы можете сделать то же самое в iText, я думаю. Если Adobe Reader зарегистрирован как плагин PDF в браузере, то оба варианта будут работать.
HTML Javascript, похоже, работает только в IE.
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я работаю для Гностиса.
Ответ 4
КАК о хорошей старой одежде OLE? Он по-прежнему поддерживается большинством всех слоев документа, о которых я знаю... IN С# Я обычно делаю что-то вроде этого.. где 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);
}
}