使用iTextSharp将数据库图片字节插入PDF字节时遇无页面错误
解决iTextSharp报错:"The Document has no page."
嘿,我一眼就看出问题所在了——你在代码里同时混用了两种互斥的PDF处理模式:一边用Document和PdfWriter尝试创建全新PDF,但这个空的Document根本没添加任何页面,触发了报错;另一边又用PdfStamper去修改原有的PDF,而PdfStamper本身就负责输出修改后的文件,完全不需要额外的Document/PdfWriter组合。
核心问题拆解
Document+PdfWriter是用来从零创建新PDF的流程,必须手动添加页面(比如document.NewPage())才能避免“无页面”错误PdfStamper是用来修改已有PDF的工具,它基于原PDF的结构直接修改,不需要额外创建空文档
修正后的代码(本地文件版)
直接用PdfStamper处理原PDF,全程抛弃Document和PdfWriter:
// 生成临时文件路径 string fileName = "~/AuthDoc/" + Convert.ToString(consentMain.AppointmentId) + ".pdf"; string newFile = System.Web.Hosting.HostingEnvironment.MapPath(fileName); // 使用using语句自动管理资源,避免手动关闭的麻烦 using (PdfReader reader = new PdfReader(consentDoc)) // 从数据库获取的PDF字节流初始化Reader using (FileStream fs = new FileStream(newFile, FileMode.Create, FileAccess.Write)) using (PdfStamper stamper = new PdfStamper(reader, fs)) { // 获取第一页的上层内容层(用来叠加图片) PdfContentByte pdfContentByte = stamper.GetOverContent(1); // 从数据库读取图片字节流并转为iTextSharp Image对象 iTextSharp.text.Image patientSign = iTextSharp.text.Image.GetInstance(consentMain.PatientSign); // 设置图片在页面上的绝对位置 patientSign.SetAbsolutePosition(100, 100); // 将图片添加到PDF页面 pdfContentByte.AddImage(patientSign); // stamper会在using块结束时自动关闭,无需手动调用Close() } // 读取修改后的PDF字节流返回 byte[] bytes = System.IO.File.ReadAllBytes(newFile); return bytes;
更高效的内存流版本(避免本地文件)
如果是Web场景,推荐直接在内存中处理,不用生成临时文件:
byte[] modifiedPdfBytes; using (PdfReader reader = new PdfReader(consentDoc)) using (MemoryStream ms = new MemoryStream()) using (PdfStamper stamper = new PdfStamper(reader, ms)) { PdfContentByte pdfContentByte = stamper.GetOverContent(1); iTextSharp.text.Image patientSign = iTextSharp.text.Image.GetInstance(consentMain.PatientSign); patientSign.SetAbsolutePosition(100, 100); pdfContentByte.AddImage(patientSign); // 确保所有修改都写入内存流 stamper.Close(); modifiedPdfBytes = ms.ToArray(); } return modifiedPdfBytes;
额外注意事项
- 确保从数据库读取的原PDF
consentDoc本身至少有1页,如果原PDF可能为空,需要先判断reader.NumberOfPages > 0,必要时用stamper.InsertPage()添加空白页 - 图片位置的坐标是基于PDF的左下角为原点(0,0),如果位置不对可以调整
SetAbsolutePosition的参数
内容的提问来源于stack exchange,提问作者Hitesh
相关产品推荐
相关产品推荐

