You are viewing limited content. For full access, please sign in.

Discussion

Discussion

Workflow to Export Document to Windows Folder

posted on October 17 Show version history

There have been a lot of questions about using a workflow to export Document(s) to a Windows folder.  I will show a script that will handle almost any export need.  It has a lot of checks built into functions, so it may look a little complicated, but I find that building in smaller functions and calling into them makes it easier to both develop and trouble shoot.

The Workflow I will show runs a search for documents and then loops through each found Document and exports it.  Here is the Flow:

You can see that in the Assign Token activity, I have a token to specify to export image documents as PDF and another token to specify the windows destination folder.

Use a SDK Script activity and set the Script Language to C# .net and the Script's Default Entry to the For Each Entry - Current Entry.  Then open the script editor and add a reference to the Laserfiche.DocumentServices and the corresponding "using" statement.

Then here is the whole of the script that I am starting with:

        protected override void Execute()
        {
            // Write your code here. The BoundEntryInfo property will access the entry, RASession will get the Repository Access session
            try
            {
                // Get Setting for Exporting Image Documents
                String sImageToPDF = (String)GetTokenValue("ExportImagesAsPDF");
                // Get Path to Windows Folder for Exports
                String exportFolder = (String)GetTokenValue("DestinationPath");
                // Ensure the Destination folder exists
                System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(exportFolder);
                if (!di.Exists)
                {
                    // Create missing folder(s)
                    di.Create();
                }
                // Only Export Documents
                if (IsEntryDocument(BoundEntryInfo))
                {
                    // Get DocumentInfo object
                    using (DocumentInfo doc = (DocumentInfo)BoundEntryInfo)
                    {
                        if (IsElectronicDocument(doc)) // Check if it is an electronic document
                        {
                            // Export the electronic Portion of the document
                            ExportElectronic(doc, exportFolder);
                        }
                        else if (HasImagePages(doc)) // Check for Image pages
                        {
                            if (sImageToPDF.ToLower() == "true")
                            {
                                // Export images to PDF
                                ExportImageDocumentToPDF(doc, exportFolder);
                            }
                            else
                            {
                                // Export images to TIFF
                                ExportImageDocument(doc, exportFolder);
                            }
                        }
                        else
                        {
                            if (HasText(doc)) // if it has Text
                            {
                                // Export text file
                                ExportTextDocument(doc, exportFolder);
                            }
                            else
                            {
                                ExportEmptyDocument(doc, exportFolder);
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                WorkflowApi.TrackError(ex.Message);
            }

        }

        private void ExportEmptyDocument(DocumentInfo LFDoc, String sExportFolder)
        {
            try
            {
                System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(sExportFolder);
                if (!di.Exists)
                {
                    di.Create();
                }
                String exportPath= System.IO.Path.Combine(sExportFolder, LFDoc.Name);
                System.IO.File.Create(exportPath).Dispose();
            }
            catch (Exception ex)
            {
                WorkflowApi.TrackError(ex.Message);
            }
        }

        private void ExportTextDocument(DocumentInfo LFDoc, String sExportFolder)
        {
            try
            {
                String sTxt = null;
                System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(sExportFolder);
                if (!di.Exists)
                {
                    di.Create();
                }
                String exportPath= System.IO.Path.Combine(sExportFolder, LFDoc.Name + ".txt");
                using (PageInfoReader LF_PageInfos = LFDoc.GetPageInfos())
                {
                    foreach (PageInfo PI in LF_PageInfos)
                    {
                        if (PI.HasText)
                        {
                            using (System.IO.StreamReader reader = PI.ReadTextPagePart())
                            {
                                if (String.IsNullOrEmpty(sTxt))
                                {
                                    sTxt = reader.ReadToEnd();
                                }
                                else
                                {
                                    sTxt = sTxt + Environment.NewLine + reader.ReadToEnd();
                                }
                            }
                        }
                    }
                }
                using (System.IO.StreamWriter file = new System.IO.StreamWriter(exportPath))
                {
                    file.Write(sTxt);
                }
            }
            catch (Exception ex)
            {
                WorkflowApi.TrackError(ex.Message);
            }
        }

        private void ExportImageDocument(DocumentInfo LFDoc, String sExportFolder)
        {
            try
            {
                System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(sExportFolder);
                if (!di.Exists)
                {
                    di.Create();
                }
                DocumentExporter docExporter = new DocumentExporter();
                docExporter.PageFormat = DocumentPageFormat.Tiff;
                String exportPath = System.IO.Path.Combine(sExportFolder, LFDoc.Name + ".tiff");
                docExporter.ExportPages(LFDoc, GetImagePageSet(LFDoc), exportPath);
            }
            catch (Exception ex)
            {
                WorkflowApi.TrackError(ex.Message);
            }
        }

        private void ExportImageDocumentToPDF(DocumentInfo LFDoc, String sExportFolder)
        {
            try
            {
                System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(sExportFolder);
                if (!di.Exists)
                {
                    di.Create();
                }
                DocumentExporter docExporter = new DocumentExporter();
                String exportPath = System.IO.Path.Combine(sExportFolder, LFDoc.Name + ".pdf");
                docExporter.ExportPdf(LFDoc, GetImagePageSet(LFDoc), PdfExportOptions.None, exportPath);
            }
            catch (Exception ex)
            {
                WorkflowApi.TrackError(ex.Message);
            }
        }

        private void ExportElectronic(DocumentInfo LFDoc, String sExportFolder)
        {
            try
            {
                System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(sExportFolder);
                if (!di.Exists)
                {
                    di.Create();
                }
                DocumentExporter docExporter = new DocumentExporter();
                String exportPath = System.IO.Path.Combine(sExportFolder, LFDoc.Name + "." + LFDoc.Extension);
                docExporter.ExportElecDoc(LFDoc, exportPath);
            }
            catch (Exception ex)
            {
                WorkflowApi.TrackError(ex.Message);
            }
        }

        private PageSet GetImagePageSet(DocumentInfo LFDoc)
        {
            PageSet psReturn = new PageSet();
            try
            {
                using (PageInfoReader LF_PageInfos = (PageInfoReader)LFDoc.GetPageInfos())
                {
                    foreach (PageInfo PI in LF_PageInfos)
                    {
                        using (LaserficheReadStream lrs = PI.ReadPagePart(new PagePart()))
                        {
                            if (lrs.Length > 0)
                            {
                                psReturn.AddPage(PI.PageNumber);
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                WorkflowApi.TrackError(ex.Message);
                psReturn = new PageSet();
            }
            return psReturn;
        }

        private Boolean HasText(DocumentInfo LFDoc)
        {
            Boolean bReturn = false;
            try
            {
                using (PageInfoReader LF_PageInfos = LFDoc.GetPageInfos())
                {
                    foreach (PageInfo PI in LF_PageInfos)
                    {
                        if (PI.HasText)
                        {
                            bReturn = true;
                            break;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                WorkflowApi.TrackError(ex.Message);
                bReturn = false;
            }
            return bReturn;
        }

        private Boolean HasImagePages(DocumentInfo LFDoc)
        {
            Boolean bReturn = false;
            try
            {
                using (PageInfoReader LF_PageInfos = LFDoc.GetPageInfos())
                {
                    foreach (PageInfo PI in LF_PageInfos)
                    {
                        using (LaserficheReadStream lrs = PI.ReadPagePart(new PagePart()))
                        {
                            if (lrs.Length > 0)
                            {
                                bReturn = true;
                                break;
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                WorkflowApi.TrackError(ex.Message);
                bReturn = false;
            }
            return bReturn;
        }

        private Boolean IsElectronicDocument(DocumentInfo LFDoc)
        {
            Boolean bReturn = false;
            try
            {
                bReturn = LFDoc.IsElectronicDocument;
            }
            catch (Exception ex)
            {
                WorkflowApi.TrackError(ex.Message);
                bReturn = false;
            }
            return bReturn;
        }

        private Boolean IsEntryDocument(EntryInfo LFEnt)
        {
            Boolean bReturn = false;
            try
            {
                if (LFEnt.EntryType == EntryType.Document)
                {
                    bReturn = true;
                }
                else
                {
                    bReturn = false;
                }
            }
            catch (Exception ex)
            {
                WorkflowApi.TrackError(ex.Message);
                bReturn = false;
            }
            return bReturn;
        }

Please feel free to reply with any improvements you might have.

9 0
replied on October 17 Show version history

The only thing that I'd add is that you need to make sure that the account that the Workflow service runs as has permissions to the destination directory. We have Workflow running as an AD account so that we can achieve this. There are also a variety of ways to do it in code.

3 0
replied on October 17

Excellent point.

This is a very big "gotcha" because, as many of you already know, when you run the code from the Designer it runs as the current user, not the service account.

I figured that out after I had a script that worked great in testing, but suddenly failed when I tried to publish and run it the workflow on the server.

1 0
You are not allowed to follow up in this post.

Sign in to reply to this post.