コード例 #1
0
        static void Main(string[] args)
        {
            string[] inputFiles = new string[]
            {
                @".\encrypted1 (password is 'password').pdf",
                @".\encrypted2 (password is 'password').pdf",
            };

            using (DocumentMerger merger = new DocumentMerger("demo", "demo"))
            {
                // Handle `PasswordRequired` event
                merger.PasswordRequired += new PasswordEventHandler(merger_PasswordRequired);

                // Ignore document permissions
                merger.CheckPermissions = false;

                merger.Merge(inputFiles, @".\result.pdf");
            }

            // Open result document in default associated application (for demo purpose)
            ProcessStartInfo processStartInfo = new ProcessStartInfo("result.pdf");

            processStartInfo.UseShellExecute = true;
            Process.Start(processStartInfo);
        }
コード例 #2
0
        static void Main(string[] args)
        {
            const string inputFile  = "sample.pdf";
            const string resultFile = "result.pdf";

            int pageCount;

            // Get document page count
            using (var infoExtractor = new InfoExtractor("demo", "demo"))
            {
                infoExtractor.LoadDocumentFromFile(inputFile);
                pageCount = infoExtractor.GetPageCount();
            }

            // Process the document by 10-page pieces

            int numberOfThreads = pageCount / 10;

            if (pageCount - numberOfThreads * 10 > 0)
            {
                numberOfThreads += 1;
            }

            WaitHandle[] doneEvents = new WaitHandle[numberOfThreads];
            Stopwatch    stopwatch = Stopwatch.StartNew();
            int          startPage, endPage;

            string[] pieces = new string[numberOfThreads];

            for (int i = 0; i < numberOfThreads; i++)
            {
                doneEvents[i] = new ManualResetEvent(false);
                startPage     = i * 10;
                endPage       = Math.Min(pageCount - 1, (i + 1) * 10 - 1);

                pieces[i] = string.Format("temp-{0}-{1}.pdf", startPage, endPage);
                ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadProc),
                                             new object[] { i, doneEvents[i], inputFile, pieces[i], startPage, endPage });
            }

            // Wait for all threads
            WaitHandle.WaitAll(doneEvents);

            // Merge pieces
            using (DocumentMerger merger = new DocumentMerger("demo", "demo"))
                merger.Merge(pieces, resultFile);

            // Delete temp files
            foreach (string tempFile in pieces)
            {
                File.Delete(tempFile);
            }

            Console.WriteLine("All done in {0}.", stopwatch.Elapsed);
            Console.WriteLine();

            Console.WriteLine("Press any key to exit...");
            Console.ReadKey();
        }
コード例 #3
0
        static void Main(string[] args)
        {
            // Create and setup Bytescout.PDFExtractor.TextExtractor instance
            TextExtractor extractor = new TextExtractor("demo", "demo");

            // Load PDF document
            extractor.LoadDocumentFromFile(InputFile);

            // List to keep non-empty page numbers
            List <string> nonEmptyPages = new List <string>();

            // Iterate through pages
            for (int pageIndex = 0; pageIndex < extractor.GetPageCount(); pageIndex++)
            {
                // Extract page text
                string pageText = extractor.GetTextFromPage(pageIndex);
                // If extracted text is not empty keep the page number
                if (pageText.Length > 0)
                {
                    nonEmptyPages.Add((pageIndex + 1).ToString());
                }
            }

            // Cleanup
            extractor.Dispose();


            // Form comma-separated list of page numbers to split("1,3,5")
            string ranges = string.Join(",", nonEmptyPages);

            // Create Bytescout.PDFExtractor.DocumentSplitter instance
            DocumentSplitter splitter = new DocumentSplitter("demo", "demo");

            splitter.OptimizeSplittedDocuments = true;

            // Split document by non-empty in temp folder
            string[] parts = splitter.Split(InputFile, ranges, TempFolder);

            // Cleanup
            splitter.Dispose();


            // Create Bytescout.PDFExtractor.DocumentMerger instance
            DocumentMerger merger = new DocumentMerger("demo", "demo");

            // Merge parts
            merger.Merge(parts, OutputFile);

            // Cleanup
            merger.Dispose();

            // Delete temp folder
            Directory.Delete(TempFolder, true);


            // Open the result file in default PDF viewer (for demo purposes)
            Process.Start(OutputFile);
        }
コード例 #4
0
        static void Main(string[] args)
        {
            string[] inputFiles = new string[] { "sample1.pdf", "sample2.pdf", "sample3.pdf" };

            using (DocumentMerger merger = new DocumentMerger("demo", "demo"))
            {
                merger.Merge(inputFiles, "result.pdf");
            }

            Process.Start("result.pdf");
        }
コード例 #5
0
        /// <summary>
        /// Merge the set of PDF documents.
        /// </summary>
        public static byte[] Merge(IReadOnlyList <byte[]> files, IReadOnlyList <IReadOnlyList <int> > pagesBundle = null)
        {
            if (files == null)
            {
                throw new ArgumentNullException(nameof(files));
            }

            const bool isLenientParsing = false;

            var documentBuilder = new DocumentMerger();

            foreach (var fileIndex in Enumerable.Range(0, files.Count))
            {
                var file = files[fileIndex];

                IReadOnlyList <int> pages = null;
                if (pagesBundle != null && fileIndex < pagesBundle.Count)
                {
                    pages = pagesBundle[fileIndex];
                }

                var inputBytes  = new ByteArrayInputBytes(file);
                var coreScanner = new CoreTokenScanner(inputBytes);

                var version = FileHeaderParser.Parse(coreScanner, isLenientParsing, Log);

                var crossReferenceParser = new CrossReferenceParser(Log, new XrefOffsetValidator(Log),
                                                                    new Parser.Parts.CrossReference.CrossReferenceStreamParser(FilterProvider));

                CrossReferenceTable crossReference = null;

                // ReSharper disable once AccessToModifiedClosure
                var locationProvider = new ObjectLocationProvider(() => crossReference, inputBytes);

                var pdfScanner = new PdfTokenScanner(inputBytes, locationProvider, FilterProvider, NoOpEncryptionHandler.Instance);

                var crossReferenceOffset = FileTrailerParser.GetFirstCrossReferenceOffset(inputBytes, coreScanner, isLenientParsing);
                crossReference = crossReferenceParser.Parse(inputBytes, isLenientParsing, crossReferenceOffset, version.OffsetInFile, pdfScanner, coreScanner);

                var catalogDictionaryToken = ParseCatalog(crossReference, pdfScanner, out var encryptionDictionary);
                if (encryptionDictionary != null)
                {
                    throw new PdfDocumentEncryptedException("Unable to merge document with password");
                }

                var documentCatalog = CatalogFactory.Create(crossReference.Trailer.Root, catalogDictionaryToken, pdfScanner, isLenientParsing);

                documentBuilder.AppendDocument(documentCatalog, version.Version, pdfScanner, pages);
            }

            return(documentBuilder.Build());
        }
コード例 #6
0
        static void Main(string[] args)
        {
            string[] inputFiles = new string[] { "sample1.pdf", "sample2.pdf", "sample3.pdf" };

            using (DocumentMerger merger = new DocumentMerger("demo", "demo"))
            {
                merger.Merge(inputFiles, "result.pdf");
            }

            // Open result document in default associated application (for demo purpose)
            ProcessStartInfo processStartInfo = new ProcessStartInfo("result.pdf");

            processStartInfo.UseShellExecute = true;
            Process.Start(processStartInfo);
        }
コード例 #7
0
        static void Main(string[] args)
        {
            var SourceFolder     = "PDFDocs";
            var DestinationFile  = "result.pdf";
            var IncludeSubFolder = true;

            using (DocumentMerger merger = new DocumentMerger("demo", "demo"))
            {
                merger.MergeFolder(SourceFolder, DestinationFile, IncludeSubFolder);
            }

            // Open result document in default associated application (for demo purpose)
            ProcessStartInfo processStartInfo = new ProcessStartInfo(DestinationFile);

            processStartInfo.UseShellExecute = true;
            Process.Start(processStartInfo);
        }