ItextSharp Комбинирайте PDF грешка

От време на време продължавам да получавам тази грешка при комбиниране на PDF файлове. Не съм сигурен какво означава съобщението за грешка.

Неуспешно възстановяване: трейлърът не е намерен.;

System.Exception: Възникна грешка при опит за комбиниране на PDF файл [\xxxx\xxxx\9140\9140.3.46843.305403720000.10282014.pdf] с други PDF файлове. ---> iTextSharp.text.exceptions.InvalidPdfException: Повторното изграждане е неуспешно: трейлърът не е намерен.; Оригинално съобщение: PDF startxref не е намерен. в iTextSharp.text.pdf.PdfReader..ctor(IRandomAccessSource byteSource, Boolean partialRead, Byte[] ownerPassword, X509Certificate сертификат, ICipherParameters certificateKey, Boolean closeSourceOnConstructorError) в iTextSharp.text.pdf.PdfReader..ctor(String име на файл) в xxxx. SSUtilities.PDFUtility.ConcatenateFiles(String[] pathOfFilesToConcatenate, String pathOfFileToCombineInto)

Кодът:

string currentFile = string.Empty;

        try
        {
            int pageOffset = 0;
            int f = 0;

            Document document = null;
            PdfCopy writer = null;

            while (f < pathOfFilesToConcatenate.Length)
            {
                currentFile = pathOfFilesToConcatenate[f];

                // we create a reader for a certain document
                PdfReader reader = new PdfReader(pathOfFilesToConcatenate[f]);
                reader.ConsolidateNamedDestinations();
                // we retrieve the total number of pages
                int n = reader.NumberOfPages;
                pageOffset += n;
                if (f == 0)
                {
                    // step 1: creation of a document-object
                    document = new Document(reader.GetPageSizeWithRotation(1));
                    // step 2: we create a writer that listens to the document
                    writer = new PdfCopy(document, new FileStream(pathOfFileToCombineInto, FileMode.Create));
                    // step 3: we open the document
                    document.Open();
                }
                // step 4: we add content

                for (int i = 0; i < n; )
                {
                    ++i;
                    if (writer != null)
                    {
                        PdfImportedPage page = writer.GetImportedPage(reader, i);
                        writer.AddPage(page);
                    }
                }

                PRAcroForm form = reader.AcroForm;
                if (form != null && writer != null)
                {
                    //writer.CopyAcroForm(reader);
                    writer.Close();
                }
                f++;
            }
            // step 5: we close the document
            if (document != null)
            {
                document.Close();
            }
        }
        catch (Exception ex)
        {
            _logger.Error(new Exception("Encountered error while trying to combine PDF file [" + currentFile + "] to other PDF's.", ex));
            throw ex;
        }

person JohnK    schedule 11.12.2014    source източник
comment
случва ли се постоянно с едни и същи документи или е периодична грешка?   -  person Matt Coubrough    schedule 12.12.2014
comment
прекъсващ. Става с няколко документа.   -  person JohnK    schedule 12.12.2014
comment
Трябва да знаем (1) версията на iText, която се използва, (2) броя на байтовете в края на файла, преди да се появи %%EOF, и (3) двата реда, предхождащи %% EOF. Старите версии бяха по-малко толерантни от новите версии по отношение на безсмислици във файла. На втория ред преди %%EOF не е xref, вашите PDF файлове може да страдат от по-сериозен проблем.   -  person Bruno Lowagie    schedule 12.12.2014
comment
Знам, че използваме 5.5.3 за dll версия. Заявка 2 и 3 ще отнеме няколко дни, за да получите подробностите.   -  person JohnK    schedule 12.12.2014
comment
Комбинирате ли PDF файлове, които вие сте направили преди? Питам, защото има два много често срещани, но неправилни модела, които непрекъснато виждаме тук, които всъщност добавят боклук в края на PDF. Първият е използването на MemoryStream и извикването на GetBuffer() вместо ToArray(). Вторият е по-базиран на ASP.Net, но има не-ASP.Net еквиваленти и това е записване директно в потока Response.Output и след това извикване на Response.Write() на PdfDocument.   -  person Chris Haas    schedule 12.12.2014
comment
да Ние комбинираме предварително направени pdf файлове. Ако сте прави в общите модели, които описвате по-горе, как да коригираме проблема?   -  person JohnK    schedule 15.12.2014
comment
За да добавя към коментара си по-рано относно честотата на грешката, проблемът, който имаме, се случва само с може би 3 документа от 1000, обработени при всяко изпълнение.   -  person JohnK    schedule 16.12.2014
comment
Класът PdfCopy на itextsharp е безнадеждно повреден. Това е генератор на изключения. Вместо това използвайте остарелия клас PdfCopyFields. Все още не е годен за пускане, но може да се използва, ако имате търпение.   -  person 15ee8f99-57ff-4f92-890c-b56153    schedule 23.07.2015