iTextSharp проблема конкатенации PDF-документов - PullRequest
0 голосов
/ 15 июня 2011

Я пытаюсь создать один PDF-файл из множества других PDF-файлов, в которые я заполняю некоторые значения формы. По сути, я выполняю слияние PDF-писем. Мой код ниже:

byte[] completedDocument = null;
using (MemoryStream streamCompleted = new MemoryStream())
{
    using (Document document = new Document())
    {
    document.Open();
    PdfCopy copy = new PdfCopy(document, streamCompleted);
    copy.Open();

    foreach (var item in eventItems)
    {
        byte[] mergedDocument = null;
        PdfReader reader = new PdfReader(pdfTemplates[item.DataTokens[NotifyTokenType.OrganisationID]]);
        using (MemoryStream streamTemplate = new MemoryStream())
        {
            using (PdfStamper stamper = new PdfStamper(reader, streamTemplate))
            {
                foreach (var token in item.DataTokens)
                {
                    if (stamper.AcroFields.Fields.Any(fld => fld.Key == token.Key.ToString()))
                    {
                        stamper.AcroFields.SetField(token.Key.ToString(), token.Value);
                    }
                }
                stamper.FormFlattening = true;
                stamper.Writer.CloseStream = false;
            }

            mergedDocument = new byte[streamTemplate.Length];
            streamTemplate.Position = 0;
            streamTemplate.Read(mergedDocument, 0, (int)streamTemplate.Length);
        }
        reader = new PdfReader(mergedDocument);

        for (int i = 1; i <= reader.NumberOfPages; i++)
        {
            document.SetPageSize(PageSize.A4);
            copy.AddPage(copy.GetImportedPage(reader, i));
        }
    }
}
completedDocument = new byte[streamCompleted.Length];
streamCompleted.Position = 0;
streamCompleted.Read(completedDocument, 0, (int)streamCompleted.Length);

}

Проблема, с которой я столкнулся, заключается в том, что при выходе из блока using (Document document = new Document()) выдается исключение нулевой ссылки.

После отладки источника iTextSharp проблема заключается в следующем методе PdfAnnotationsimp

public bool HasUnusedAnnotations() {
            return annotations.Count > 0;
        }

аннотации имеют значение null, поэтому при этом возникает исключение null ref. Есть ли что-то, что я должен сделать, чтобы создать экземпляр этого?

Ответы [ 2 ]

2 голосов
/ 16 июня 2011

Я изменил:

document.Open();
PdfCopy copy = new PdfCopy(document, streamCompleted);

на

PdfCopy copy = new PdfCopy(document, streamCompleted);
document.Open();

И это исправило проблему.Эта библиотека нуждается в лучшей обработке исключений.Когда вы делаете что-то немного не так, это ужасно падает и не дает понять, что вы сделали неправильно.Я понятия не имею, как я мог бы решить это, если бы у меня не было исходного кода.

0 голосов
/ 15 июня 2011

Какую версию iTextSharp вы используете? Класс Document не реализует IDisposable, поэтому вы не можете заключить его в блок using.

...