2015-01-05 134 views
0

提取一个页面的结果,我想测试从PDF文档中的单个页面的提取,但我发现了一个NullReferenceException每当我尝试。中的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 
+0

刚刚添加,我的不好。的 –

+0

可能重复[什么是一个NullReferenceException,如何解决呢?(http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-do-i-fix-it) – Servy

+1

那么这似乎是iTextSharp中的一个错误。他们可能希望在那里添加空处理并抛出适当的异常,如“无边距设置”或任何根本原因。 [浏览来源:'Left'属性不'返回pageSize.GetLeft(marginLeft);'](http://sourceforge.net/p/itextsharp/code/HEAD/tree/trunk/src/core/iTextSharp/text /Document.cs),其中'pageSize'大概是'null'。 – CodeCaster

回答

1

请改变你这样的代码:

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实例。

0

我已经审查了PdfDocument源作为可以在这里找到:http://sourceforge.net/p/itextsharp/code/HEAD/tree/trunk/src/core/iTextSharp/text/pdf/PdfDocument.cs#l2334

PdfDocument在方法SetNewPageSizeAndMargins开始时将专用字段nextPageSize的值分配给字段pageSize。要停止nextPageSizenull(并因此导致您的pageSize被设置为null,并触发NullReferenceException当它在下一次访问)关闭副本之前呼吁文档SetPageSize

保持默认页面大小,请拨打SetPageSize如下:

document.SetPageSize(document.PageSize); 

这很可能是由PdfDocument类,我怀疑开发商的监督,就是要设定nextPageSize默认值并不是。

+0

我在'copy.AddPage(page)'后面放了'copy.SetPageSize(document.PageSize)',但我仍然在'copy.Close()'上得到相同的异常。 –

+0

我的错误。请把它放在文件上。这是拷贝关闭文档引发异常的文档。更新了我的答案。 –

+0

我在'document.Close()'之前添加了'document.SetPageSize(document.PageSize)',但我仍然得到抛出的异常。我浏览了源代码,看起来问题的确在'nextPageSize'中,因为它仍然是'null'。 –