You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用iTextSharp(C#)实现PDF文档新增扫描页面的问题

解决iTextSharp生成多页扫描PDF只保留最后一页及文件过大问题

问题根源

  1. 文档重复打开导致内容覆盖:你把document.Open()放在了while循环内部,每次扫描时都会重新打开PDF文档,这会清空之前写入的所有页面内容,最终只保留最后一次扫描的页面。
  2. 不必要的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 06:36:02