使用iTextSharp(C#)实现PDF文档新增扫描页面的问题
解决iTextSharp生成多页扫描PDF只保留最后一页及文件过大问题
问题根源
- 文档重复打开导致内容覆盖:你把
document.Open()放在了while循环内部,每次扫描时都会重新打开PDF文档,这会清空之前写入的所有页面内容,最终只保留最后一次扫描的页面。 - 不必要的Bitmap转换增加体积:将扫描得到的字节流先转成Bitmap再转成iTextSharp的Image,会引入额外的图像编码开销,导致生成的PDF文件体积变大。
修正后的代码
bool continueScanning = true; var scanDirectory = Environment.ExpandEnvironmentVariables("%USERPROFILE%/AppData/Local/Temp") + @"\docs\"; System.IO.Directory.CreateDirectory(scanDirectory); string pdfPath = Path.Combine(scanDirectory, "doc" + DateTime.Now.ToString("hhmmss") + ".pdf"); // 初始化文档和写入器 Document document = new Document(PageSize.A4); PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(pdfPath, FileMode.Create)); // 只打开一次文档,放在循环外 document.Open(); while (continueScanning) { var dialog = new WIA.CommonDialog(); ImageFile image = dialog.ShowAcquireImage(AlwaysSelectDevice: true); byte[] imgBytes = (byte[])image.FileData.get_BinaryData(); // 直接用字节流创建iTextSharp图像,跳过Bitmap转换 iTextSharp.text.Image pdfImage = iTextSharp.text.Image.GetInstance(imgBytes); // 除了第一页,每次扫描前先新增页面 if (!document.NewPage()) { MessageBox.Show("Failed to create new page."); break; } pdfImage.ScaleToFit(document.PageSize); pdfImage.SetAbsolutePosition(0, 0); pdfImage.Alignment = iTextSharp.text.Image.ALIGN_TOP; document.Add(pdfImage); continueScanning = (MessageBox.Show("Continue scanning?", "Scan", MessageBoxButtons.YesNo) == DialogResult.Yes); } // 关闭文档和写入器 document.Close(); writer.Close();
关键改动说明
- 将
document.Open()移至循环外:确保文档只被打开一次,所有扫描页面都会追加到同一个PDF中,不会被覆盖。 - 移除Bitmap转换步骤:直接使用扫描得到的原始字节流创建iTextSharp的Image对象,避免不必要的图像格式转换,大幅减小PDF文件体积。
- 调整
NewPage()调用时机:第一次扫描时,document.Open()会自动创建第一页,后续每次扫描前调用NewPage()来新增页面,确保每页扫描件都对应独立的PDF页面。
内容的提问来源于stack exchange,提问作者user3309231
相关产品推荐
相关产品推荐

