public CreateMergedPDFAcrobat(
            List<CockleFilePdf> filesToCombine,
            TypeOfCombinedPdf typeOfCombinedPdf = TypeOfCombinedPdf.All,
            bool centerPdf = false)
        {
            if (filesToCombine.Count() < 1) { return; }

            var first_filename = filesToCombine.First();
            var destination_folder = System.IO.Path.GetDirectoryName(first_filename.FullName);

            // collect non-foldout files
            var files_no_foldouts = filesToCombine.Where(f => f.Rank >= 0).OrderBy(f => f.Rank);

            // collect foldout files
            var files_foldouts = filesToCombine
                .Where(f => f.FileType == SourceFileTypeEnum.Brief_Foldout || f.FileType == SourceFileTypeEnum.Brief_ZFold
                || f.FileType == SourceFileTypeEnum.App_Foldout || f.FileType == SourceFileTypeEnum.App_ZFold)
                .OrderBy(f => f.PageRange.FirstPage);

            // create new filename
            if (typeOfCombinedPdf == TypeOfCombinedPdf.All)
            {
                CombinedPdfFilename = System.IO.Path.Combine(destination_folder,
                    string.Format($"{first_filename.TicketNumber} pdf {first_filename.Attorney}.pdf"));
            }
            else
            {
                if (typeOfCombinedPdf == TypeOfCombinedPdf.Brief)
                {
                    CombinedPdfFilename = System.IO.Path.Combine(destination_folder,
                        string.Format($"{first_filename.TicketNumber} pdf {first_filename.Attorney} br.pdf"));
                }
                if (typeOfCombinedPdf == TypeOfCombinedPdf.Appendix)
                {
                    CombinedPdfFilename = System.IO.Path.Combine(destination_folder,
                        string.Format($"{first_filename.TicketNumber} pdf {first_filename.Attorney} app.pdf"));
                }
            }

            // adjust new filenames if foldouts
            if (files_foldouts.Count() > 0)
            {
                var temp_filename = CombinedPdfFilename;
                CombinedPdfFilename =
                    temp_filename.Replace(".pdf", @" (without foldouts).pdf");
                CombinedPdfFilenameWithFoldouts =
                    temp_filename.Replace(".pdf", @" (with foldouts).pdf");

                // combine files
                createCombinedPdf_noFoldouts(files_no_foldouts, typeOfCombinedPdf, centerPdf);
                createCombinedPdf_withFoldouts(files_no_foldouts, files_foldouts);
            }
            else
            {
                createCombinedPdf_noFoldouts(files_no_foldouts, typeOfCombinedPdf, centerPdf);
            }
        }
        private void createCombinedPdf_noFoldouts(
            IOrderedEnumerable<CockleFilePdf> files_no_foldouts,
            TypeOfCombinedPdf typeOfCombinedPdf,
            bool centerPdf = false)
        {
            CAcroApp app = new AcroApp();           // Acrobat
            CAcroPDDoc doc = new AcroPDDoc();       // First document
            CAcroPDDoc docToAdd = new AcroPDDoc();  // Next documents

            try
            {
                int numPages = 0, numPagesToAdd = 0;
                foreach (var f in files_no_foldouts)
                {
                    if (f.Rank == 0) // both 0
                    {
                        doc.Open(f.FullName);
                        numPages = doc.GetNumPages();
                    }
                    else if (f.Rank != 0 && numPages == 0)
                    {
                        doc.Open(f.FullName);
                        numPages = doc.GetNumPages();
                    }
                    else
                    {
                        if (!docToAdd.Open(f.FullName)) { break; }
                        numPagesToAdd = docToAdd.GetNumPages();
                        if (!doc.InsertPages(numPages - 1, docToAdd, 0, numPagesToAdd, 0)) { break; }
                        if (!docToAdd.Close()) { break; }
                        numPages = doc.GetNumPages();
                    }
                }
                doc.Save(1, CombinedPdfFilename);
                doc.Close();
                // use reflection to center the pdf
                if (centerPdf)
                {
                    var opened = doc.Open(CombinedPdfFilename);
                    if (opened)
                    {
                        object js_object = doc.GetJSObject();
                        Type js_type = js_object.GetType();
                        object[] js_param = { };
                        string script_name = string.Empty;
                        int? cover_length = null;
                        if (typeOfCombinedPdf == TypeOfCombinedPdf.Appendix
                            && files_no_foldouts.All(x => x.CoverLength == null))
                        {
                            script_name = Models.Utilities.AcrobatJS.Javascripts
                                [Models.Utilities.LocalJavascripts.center_letter_no_cover];
                        }
                        else if (files_no_foldouts.All(x => x.CoverLength == null))
                        {
                            script_name = Models.Utilities.AcrobatJS.Javascripts
                                [Models.Utilities.LocalJavascripts.center_letter_no_cover];
                        }
                        else
                        {
                            cover_length = files_no_foldouts.Where(x => x.FileType == SourceFileTypeEnum.Cover).FirstOrDefault().CoverLength;
                            switch (cover_length)
                            {
                                case 48:
                                default:
                                    script_name = Models.Utilities.AcrobatJS.Javascripts
                                        [Models.Utilities.LocalJavascripts.center_letter_48pica];
                                    break;
                                case 49:
                                    script_name = Models.Utilities.AcrobatJS.Javascripts
                                        [Models.Utilities.LocalJavascripts.center_letter_49pica];
                                    break;
                                case 50:
                                    script_name = Models.Utilities.AcrobatJS.Javascripts
                                        [Models.Utilities.LocalJavascripts.center_letter_50pica];
                                    break;
                                case 51:
                                    script_name = Models.Utilities.AcrobatJS.Javascripts
                                        [Models.Utilities.LocalJavascripts.center_letter_51pica];
                                    break;
                            }
                        }

                        js_type.InvokeMember(script_name,
                            System.Reflection.BindingFlags.InvokeMethod | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance,
                            null, js_object, js_param);
                        // test that the file exists
                        doc.Save(1, CombinedPdfFilename);
                    }
                    else
                    {
                        throw new Exception("Could not center pdf.");
                    }
                }
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine(ex.Message);
            }
            finally
            {
                doc.Close();
                app.CloseAllDocs();
                app.Exit();

                doc = null;
                docToAdd = null;
                app = null;

                GC.Collect();
            }
        }