Hallo combit Team,
ich möchte gern ein PDF über den Browser ausdrucken. Hierfür ist es notwendig eine ACTION, welche beim Öffnen eines PDF ausgeführt wird, zu erstellen. Eine so genannte OPENACTION.
Wie kann dies beim Erstellen eines PDF aus einem Report auf einem Server (also ohne Userinteraktion) mit List&Label gemacht werden?
Beispiel automatische Navigation zu einer Webseite beim Öffnen eines PDFs:
/TYPE /ACTION
/S /URI
/URI (https://www.combit.net)
Mit freundlichen Grüßen
Stefan Kriebitzsch
Hallo,
das Ganze habe ich mit PdfSharp gelöst.
Zuerst gibt man den Export als Stream aus.
Danach kann man diesen mit PdfSharp bearbeiten.
Der Ergebnis-Stream wird dann an den Browser übergeben.
Sieht bei mir so aus:
MemoryStream pdfStream = new MemoryStream();
PrinterSettings settings = new PrinterSettings();
settings.PrinterName = "HPM3027";
settings.Copies = 1;
LlProject projType = RepositoryItemType.ToLlProject(RepositoryHelper.GetCurrentRepository().GetItem(TemplateItemID).Type);
LL.Core.LlSetPrinterInPrinterFile(projType, TemplateItemID, LlPrinterIndex.AllPages, settings);
ExportConfiguration exportConfig = new ExportConfiguration(LlExportTarget.Pdf, pdfStream, TemplateItemID);
exportConfig.BoxType = LlBoxType.None;
exportConfig.Path = null;
exportConfig.ExportOptions.Add(LlExportOption.ExportQuiet, "1");
LL.Export(exportConfig);
PdfDocument document = new PdfDocument();
document = PdfReader.Open(pdfStream);
PdfDictionary dict = new PdfDictionary(document);
dict.Elements["/Type"] = new PdfName("/Action");
dict.Elements["/S"] = new PdfName("/Named");
dict.Elements["/N"] = new PdfName("/Print");
document.Internals.AddObject(dict);
document.Internals.Catalog.Elements["/OpenAction"] = PdfInternals.GetReference(dict);
MemoryStream outputDoc = new MemoryStream();
document.Save(outputDoc, false);
Response.Clear();
Response.ContentType = "application/pdf";
Response.AddHeader("content-length", outputDoc.Length.ToString());
Response.BinaryWrite(outputDoc.ToArray());
Response.Flush();
outputDoc.Close();
pdfStream.Close();
Response.End();
Vielen Dank!
Funktioniert einwandfrei.