What is the best way to convert TIFF to PDF using SDK script inside of a repository?
Discussion
Discussion
You can generate a PDF from TIFF pages using the DocumentExporter class. The PDF can then be written to a Laserfiche entry using the WriteEdoc method.
In the following example, the "doc" variable is the source document. If you're writing between two different document entries, change adjust the variables accordingly.
// Initialize document export
DocumentExporter dExp = new DocumentExporter();
// Configure document exporter settings
dExp.CompressionQuality = compression; // 0-100
dExp.IncludeAnnotations = true;
dExp.BlackoutRedactions = true;
dExp.PageFormat = DocumentPageFormat.Jpeg;
// Set PDF export options to flatten annotations and include searchable text
PdfExportOptions ExportOptions = PdfExportOptions.RenderAnnotationsAsImage | PdfExportOptions.IncludeText;
// Initialize memory stream and export PDF
using(MemoryStream ms = new MemoryStream()){
dExp.ExportPdf(doc, doc.AllPages, ExportOptions, ms);
// Write PDF to document
using(Stream eDocStream = doc.WriteEdoc("application/pdf",ms.ToArray().LongLength)){
eDocStream.Write(ms.ToArray(),0,ms.ToArray().Length);
}
}
// Update document extension and save changes
doc.Extension = ".pdf";
// Save changes
doc.Save();
If you only want to keep the PDF and not the TIFF pages, you can remove the page images after the PDF has been successfully generated and written to the target entry.
// Read values of each page and verify image contents
PageInfoReader pageReader = doc.GetPageInfos();
foreach(PageInfo page in pageReader){
// Check if page has image and remove it
if(page.HasImage){
page.ClearPagePart(PagePart.Image);
}
}
// Save changes
doc.Save();
I would normally do this as two separate steps to make sure the PDF is generated before removing the page images, but it can be done in one script; just don't call .Save() until both are complete.
The only thing that I would change is to put the
MemoryStream ms = new MemoryStream()
into a using statement as well to make sure that it is disposed of properly.
using(MemoryStream ms = new MemoryStream()){
dExp.ExportPdf(doc, doc.AllPages, ExportOptions, ms);
// Write PDF to document
using(Stream eDocStream = doc.WriteEdoc("application/pdf",ms.ToArray().LongLength)){
eDocStream.Write(ms.ToArray(),0,ms.ToArray().Length);
}
}
If this does not work, then be sure to flush and dispose of the Memorystream
I didn't used worry about that for short scripts since, because of how the script threads are handled by default, the resources should be released when the Workflow script completes, but you're right, that is best practice.
I copied the code as-is from a very old post of mine, so I'll incorporate that change.