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

如何用iText7将超A4幅面图片分页转PDF以避免裁切?

解决iText7长图片转PDF自动分页问题

原代码仅对图片按宽度缩放,当缩放后高度超过单页A4可用高度时,超出部分会被裁切。要实现自动分页完整显示,需要计算图片缩放后的总高度,将图片切割为多个适配单页高度的片段,逐页添加到PDF中。

修改后的完整代码

static void ConvertToPdf(string imagePath, string OutputPath)
{
    ImageData imageData = ImageDataFactory.Create(imagePath);
    PdfDocument pdfDocument = new PdfDocument(new PdfWriter(OutputPath));
    PageSize pageSize = PageSize.A4;
    
    // 设置页面可用区域(左右各25边距,上下各25边距)
    float availableWidth = pageSize.GetWidth() - 50;
    float availableHeight = pageSize.GetHeight() - 50;
    
    // 计算图片缩放比例(按宽度适配页面)
    float scale = availableWidth / imageData.GetWidth();
    float scaledImageHeight = imageData.GetHeight() * scale;
    
    // 计算需要的总页数
    int totalPages = (int)Math.Ceiling(scaledImageHeight / availableHeight);
    
    for (int pageIndex = 0; pageIndex < totalPages; pageIndex++)
    {
        // 添加新页面
        PdfPage page = pdfDocument.AddNewPage(pageSize);
        Document document = new Document(pdfDocument, pageSize);
        document.SetMargins(25, 25, 25, 25); // 设置边距和可用区域对应
        
        // 计算当前页要显示的图片垂直范围(源图片坐标,Y轴从上到下)
        float startYInSource = imageData.GetHeight() - (pageIndex + 1) * (availableHeight / scale);
        float endYInSource = imageData.GetHeight() - pageIndex * (availableHeight / scale);
        
        // 处理最后一页的边界,避免超出图片范围
        if (startYInSource < 0)
        {
            startYInSource = 0;
        }
        
        // 截取图片的对应部分
        ImageData subsetImage = imageData.Subset(0, startYInSource, imageData.GetWidth(), endYInSource - startYInSource);
        Image image = new Image(subsetImage);
        
        // 缩放截取的图片到页面可用宽度
        image.SetWidth(availableWidth);
        image.SetAutoScaleHeight(true);
        
        // 添加到当前页面
        document.Add(image);
    }
    
    pdfDocument.Close();
}

关键逻辑说明

  • 计算可用区域:定义页面的宽高边距,确保图片不会贴边显示
  • 缩放比例计算:按页面可用宽度计算图片的缩放比例,保证图片宽度适配页面
  • 分页数量计算:通过缩放后的总高度除以单页可用高度,向上取整得到需要的页数
  • 图片切割:使用ImageData.Subset()方法截取图片的对应垂直片段,确保每一页只显示适配单页高度的部分
  • 逐页添加:循环创建页面,将切割后的图片片段添加到对应页面中

内容的提问来源于stack exchange,提问作者sara

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 17:42:28