提取页面会导致 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
实例。
我正在尝试测试从 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
实例。