iTextSharp问题连接PDF文档

时间:2011-06-15 16:00:02

标签: c# itextsharp itext

我正在尝试从一堆其他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 个答案:

答案 0 :(得分:2)

我改变了:

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

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

它解决了这个问题。该库需要更好的异常处理。如果你做了一些稍微错误的事情,它就会惨不忍睹,并且不会让你知道你做错了什么。如果我没有源代码,我不知道如何能解决这个问题。

答案 1 :(得分:0)

您使用的是什么版本的iTextSharp? Document类未实现IDisposable,因此您无法将其包装在using块中。