Is there a way to save processed documents as PDF out of Quick Fields?
Is there a way to save scanned documents as PDF within the scanning function of the Laserfiche Desktop Client? Looks like everything is converting to Tiff.
Thanks!
Is there a way to save processed documents as PDF out of Quick Fields?
Is there a way to save scanned documents as PDF within the scanning function of the Laserfiche Desktop Client? Looks like everything is converting to Tiff.
Thanks!
I don't believe Quick Fields can generate PDF documents at this time, however, I am doing this within a SDK script and it is not terribly complicated; however, you need to be mindful of server resources (primarily CPU in my experience) and workflow configuration (such as the script domain model).
Below is the code I am using to generate my PDFs. Note that I preserve both the PDF and the TIFF images on the document, and I apply variable compression quality to the PDF to control the size of the resulting files, which you may or may not need to do depending on what you are processing.
namespace WorkflowActivity.Scripting.GeneratePDF
{
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Text;
using System.IO;
using Laserfiche.RepositoryAccess;
using Laserfiche.DocumentServices;
public class GeneratePDF : RAScriptClass102
{
protected override void Execute()
{
// Set variables for image size, text size, document size, and average bytes per page
long imageSize = 0;
long textSize = 0;
long bytesPerPage = 0;
int compression = 0;
// Get and lock source document
DocumentInfo doc = (DocumentInfo)this.BoundEntryInfo;
doc.Lock(LockType.Exclusive);
// Try to generate and attach PDF
try{
// Retrieve page count
int pageCount = doc.PageCount;
// Read values of each page
PageInfoReader pageReader = doc.GetPageInfos();
foreach (PageInfo page in pageReader){
// Track cumulative page and text sizes
// to determine what level of compression to apply
imageSize += page.ImageDataSize;
textSize += page.TextDataSize;
}
// Get average bytes per page
bytesPerPage = imageSize/pageCount;
// Initialize compression variables
int minSize = 62500;
int midSize = 250000;
int maxSize = 1000000;
// Evaluate average page size
if (bytesPerPage < minSize){
// default for low-quality images
compression = 90;
}
else {
// low-to-medium quality images
if (bytesPerPage < midSize){
compression = 75;
}
else {
// medium-to-high quality images
if (bytesPerPage < maxSize){
compression = 50;
}
// high-quality images
else {
compression = 25;
}
}
}
// Initialize document export
DocumentExporter dExp = new DocumentExporter();
// Configure document exporter settings
dExp.CompressionQuality = compression;
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
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();
}
// Ensure tokens are always updated and document is always unlocked
finally{
// Confirm eDoc attached and get eDoc Size
SetTokenValue("eDoc",doc.IsElectronicDocument);
SetTokenValue("eDocSize",doc.ElecDocumentSize);
SetTokenValue("imageSize",imageSize);
SetTokenValue("textSize",textSize);
SetTokenValue("Quality",compression);
// Release document
doc.Unlock();
doc.Dispose();
}
}
}
}
I call this script within my workflow, then evaluate the output tokens to confirm that the PDF was generated without errors and track various information.
Also note that I have a Try-Finally instead of a Try-Catch-Finally as I personally prefer to put the script activity in a Try-Catch in workflow to handle errors outside of the script for this particular process.
I've done something similar, and it can be done with a lot less code if all you want to do is get one or more entries out as PDFs.
namespace WorkflowActivity.Scripting.SDKScripttoBriefcaseArchiveFolder
{
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Text;
using Laserfiche.RepositoryAccess;
using Laserfiche.DocumentServices;
/// <summary>
/// Provides one or more methods that can be run when the workflow scripting activity is performed.
/// </summary>
public class Script1 : RAScriptClass102
{
/// <summary>
/// This method is run when the activity is performed.
/// </summary>
protected override void Execute()
{
// RASession will get the Repository Access session
try
{
//get the document info for the current entry
DocumentInfo DI = (DocumentInfo)this.BoundEntryInfo;
DocumentExporter DE = new DocumentExporter();
//DE.IncludeAnnotations = true; // convert Laserfiche annotations into Adobe Acrobat annotations.
DE.CompressionQuality = 25;
DE.ExportPdf(DI, DI.AllPages, PdfExportOptions.IncludeText , "c:\\temp\\" + GetTokenValue("ForEachEntryFound_CurrentEntry_Name").ToString() + ".pdf");
}
catch (Exception ex)
{
throw new LaserficheRepositoryException ("Script threw exception", ex);
}
}
}
}
This SDK script is used in a For Each Entry loop that gets a set of entries from a search. You could just as easily use it in a one activity script that does the export whenever a new document is created by Quick Fields.
this.BoundEntryInfo is how you point a Workflow SDK script at the entry you choose in the script activity.
As I noted, the reason for the extra code is to apply variable compression quality.
Some lower quality images, such as faxes, can look unacceptably bad at 25% so I've found it is best evaluate documents individually and apply variable settings for optimal quality.
For example, exporting a 200 dpi black and white document at 25% vs 75% could make a significant difference in appearance with a negligible difference in size compared to what you would see in higher resolution and/or color images.
Also, as he mentioned in his post, he wants to store the documents as PDFs instead of TIFF rather than just export them out of Laserfiche, which is where the other additional parts of my code come into play.
Thanks. Does this output the pdf inside the repository please?