提取页面会导致 NullReferenceException

Extracting a page results in NullReferenceException

我正在尝试测试从 PDF 文档中提取单个页面,但每次尝试时都会收到 NullReferenceException

var document = new Document();
var stream = new MemoryStream();
var writer = PdfWriter.GetInstance(document, stream);

document.Open();
document.Add(new Paragraph("This is page 1."));
document.NewPage();
document.Add(new Paragraph("This is page 2."));
document.Close();

var copystream = new MemoryStream();
var copy = new PdfCopy(document, copystream);
copy.Open();
var reader = new PdfReader(stream.ToArray());
var page = copy.GetImportedPage(reader, 2);
copy.AddPage(page);
copy.Close(); // code throws exception here

我已经尝试添加 writer.CloseStream = false,但我仍然得到相同的 NullReferenceException:

Object reference not set to an instance of an object.
   at iTextSharp.text.Document.get_Left()
   at iTextSharp.text.pdf.PdfDocument.SetNewPageSizeAndMargins()
   at iTextSharp.text.pdf.PdfDocument.NewPage()
   at iTextSharp.text.pdf.PdfDocument.Close()
   at iTextSharp.text.pdf.PdfCopy.Close()
   at iTextTest.Controllers.HomeController.Index() in line 41

我查看了 PdfDocument 的来源,可在此处找到:http://sourceforge.net/p/itextsharp/code/HEAD/tree/trunk/src/core/iTextSharp/text/pdf/PdfDocument.cs#l2334

PdfDocument 在方法 SetNewPageSizeAndMargins 的开头将私有字段 nextPageSize 的值分配给字段 pageSize。要停止 nextPageSize 成为 null(因此导致您的 pageSize 被设置为 null 并在下次访问时触发 NullReferenceException)调用 SetPageSize关闭副本之前的文档。

要保持​​默认页面大小,请按如下方式调用 SetPageSize

document.SetPageSize(document.PageSize);

这很可能是 PdfDocument class 开发人员的疏忽,我怀疑这是为了为 nextPageSize 设置默认值,但事实并非如此。

请像这样更改您的代码:

var document = new Document();
var stream = new MemoryStream();
var writer = PdfWriter.GetInstance(document, stream);

document.Open();
document.Add(new Paragraph("This is page 1."));
document.NewPage();
document.Add(new Paragraph("This is page 2."));
document.Close();

document = new Document(); // this is the line you need to add
var copystream = new MemoryStream();
var copy = new PdfCopy(document, copystream);
copy.Open();
var reader = new PdfReader(stream.ToArray());
var page = copy.GetImportedPage(reader, 2);
copy.AddPage(page);
copy.Close(); // code throws exception here

您正在重用 document 用于从头开始创建新文档的对象。 document 实例已经关闭。当您在 PdfCopy 的上下文中使用 document 时,您需要一个新的 Document 实例。