iTextSharp从字节数组列表中创建pdf
我有一个byte []列表,我希望将其连接成一个字节[],这将是最终的PDf。
在“page = copy.GetImportedPage(new PdfReader(p),i);”我得到一个“对象引用未设置为实例错误。
我不知道发生了什么,我已经检查了每个对象,并且没有空。
关于这个的任何想法,或另一段可以成功的代码?!
我有这个方法:
编辑
public static byte[] concatAndAddContent(List pdf) { byte [] todos; using(MemoryStream ms = new MemoryStream()) { Document doc = new Document(); doc.Open(); PdfCopy copy = new PdfCopy(doc, ms); PdfCopyFields copy2 = new PdfCopyFields(ms); PdfReader reader; foreach (byte[] p in pdf) { reader = new PdfReader(p); int pages = reader.NumberOfPages; // loop over document pages for (int i = 1; i < pages; i++) { PdfImportedPage page = copy.GetImportedPage(reader, i); PdfCopy.PageStamp stamp = copy.CreatePageStamp(page); PdfContentByte cb = stamp.GetUnderContent(); cb.SaveState(); stamp.AlterContents(); copy.AddPage(page); } } doc.Close(); todos = ms.GetBuffer(); ms.Flush(); ms.Dispose(); } return todos; }
堆栈跟踪:
[NullReferenceException: Object reference not set to an instance of an object.] iTextSharp.text.pdf.PdfImportedPage..ctor(PdfReaderInstance readerInstance, PdfWriter writer, Int32 pageNumber) +45 iTextSharp.text.pdf.PdfReaderInstance.GetImportedPage(Int32 pageNumber) +175 iTextSharp.text.pdf.PdfCopy.GetImportedPage(PdfReader reader, Int32 pageNumber) +256 SAM.Web.Classes.UtileriasReportes.concatAndAddContent(List`1 pdf) in ClassesUtileriasReportes.cs:199 SAM.Web.Classes.UtileriasReportes.ObtenReporteOdt(Int32 ordenTrabajoID, Boolean caratula, Boolean juntas, Boolean cortes, Boolean materiales, Boolean resumenMateriales) in D:MIMOSSDesarrolloSAM 2.0DesarrolloWebSolutionSAM.WebClassesUtileriasReportes.cs:168 SAM.Web.Produccion.PopupImpresionOdt.btnImprimir_Click(Object sender, EventArgs e) in PopupImpresionOdt.aspx.cs:44 System.Web.UI.WebControls.Button.OnClick(EventArgs e) +118 System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +112 System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10 System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13 System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +36 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +5563
谢谢你的时间!
我已经弄清楚了,只是所以有人可以得到解决方案:这里是:
public static byte[] concatAndAddContent(List pdf) { byte [] all; using(MemoryStream ms = new MemoryStream()) { Document doc = new Document(); PdfWriter writer = PdfWriter.GetInstance(doc, ms); doc.SetPageSize(PageSize.LETTER); doc.Open(); PdfContentByte cb = writer.DirectContent; PdfImportedPage page; PdfReader reader; foreach (byte[] p in pdf) { reader = new PdfReader(p); int pages = reader.NumberOfPages; // loop over document pages for (int i = 1; i <= pages; i++) { doc.SetPageSize(PageSize.LETTER); doc.NewPage(); page = writer.GetImportedPage(reader, i); cb.AddTemplate(page, 0, 0); } } doc.Close(); all = ms.GetBuffer(); ms.Flush(); ms.Dispose(); } return all; }
希望有所帮助!
这有效:
使用iTextSharp-LGPL 4.1.6:
public static byte[] ConcatenatePdfs(IEnumerable documents) { using (var ms = new MemoryStream()) { var outputDocument = new Document(); var writer = new PdfCopy(outputDocument, ms); outputDocument.Open(); foreach (var doc in documents) { var reader = new PdfReader(doc); for (var i = 1; i <= reader.NumberOfPages; i++) { writer.AddPage(writer.GetImportedPage(reader, i)); } writer.FreeReader(reader); reader.Close(); } writer.Close(); outputDocument.Close(); var allPagesContent = ms.GetBuffer(); ms.Flush(); return allPagesContent; } }
不确定这是否会为你解决,但尝试从第1页开始初始化GetImportedPage,而不是零,但在你的for循环中使用int i = 1
。 像这样:
// loop over document pages //was (int i = 0; i < pages; i++) { for (int i = 1; i < pages; i++) { page = copy.GetImportedPage(new PdfReader(p), i); stamp = copy.CreatePageStamp(page); PdfContentByte cb = stamp.GetUnderContent(); cb.SaveState(); stamp.AlterContents(); copy.AddPage(page); }
看看itextsharp代码可能它并不总能与同一内容上的多个读者一起使用。
我建议你试试
page = copy.GetImportedPage(reader, i);
而不是为您尝试阅读的每个页面创建一个新的阅读器。
更新:我不知道是否有帮助但是
我复制并粘贴了你的代码,我得到一个NullReferenceException但只在这一行
stamp.AlterContents();
这很奇怪,因为那是在你得到它之后。+
当传递List中的不良内容时,我能够生成Missing PDF标题,Trailer Not found等,所以我不认为它的内容有所不同p
我正在使用版本5.0.4与VS 2008中内置的源代码版本。客户端是vs 2010.也许这些解释了差异。
我最初使用上面的答案,而PDF非常大..我认为回来提供这个链接可以帮助我完全解决这个问题以及大问题。
https://stackoverflow.com/a/6752769
上述就是C#学习教程:iTextSharp从字节数组列表中创建pdf分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注---计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1003515.html