如何用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
相关产品推荐
相关产品推荐

