如何缩放图片适配PDF页面:消除白边并控制页面尺寸
解决方案:让图片转PDF的页面尺寸接近标准纸张且无白边
核心思路
- 当选择标准纸张尺寸时,先计算图片与目标纸张的适配缩放因子,确保图片能完整放进纸张的同时,最大化利用纸张空间
- 缩放图片后,将PDF页面尺寸直接设为缩放后的图片尺寸,消除白边的同时,让页面尺寸尽可能接近目标标准纸张
修改后的CreateDoc方法代码
private void CreateDoc(string srcFilename, string folder, PageSize pageSize) { string dstFilename = System.IO.Path.Combine(folder, System.IO.Path.GetFileNameWithoutExtension(srcFilename) + ".pdf"); using PdfWriter writer = new(dstFilename); using PdfDocument pdfDocument = new(writer); iText.IO.Image.ImageData imageData = iText.IO.Image.ImageDataFactory.Create(srcFilename); iText.Layout.Element.Image image = new(imageData); iText.Kernel.Geom.Rectangle? targetPageRect = null; float scaleFactor = 1f; if (pageSize == PageSize.ImageSize) { // 保持原逻辑:页面尺寸与图片一致 targetPageRect = new(0, 0, (float)image.GetImageWidth(), (float)image.GetImageHeight()); } else { targetPageRect = pageSize.PdfSize(); if (targetPageRect == null) throw new Exception("Page size not supported!"); // 计算缩放因子:取宽、高比例中的较小值,确保图片完整适配目标纸张 float widthRatio = targetPageRect.GetWidth() / image.GetImageWidth(); float heightRatio = targetPageRect.GetHeight() / image.GetImageHeight(); scaleFactor = Math.Min(widthRatio, heightRatio); // 计算缩放后的图片尺寸,作为最终页面尺寸 float scaledWidth = image.GetImageWidth() * scaleFactor; float scaledHeight = image.GetImageHeight() * scaleFactor; targetPageRect = new iText.Kernel.Geom.Rectangle(0, 0, scaledWidth, scaledHeight); // 应用缩放因子到图片 image.ScaleAbsolute(scaledWidth, scaledHeight); } if (targetPageRect == null) throw new Exception("Page not created!"); // 使用缩放后的图片尺寸创建文档 iText.Layout.Document document = new(pdfDocument, new iText.Kernel.Geom.PageSize(targetPageRect)); // 图片位置居中(因页面尺寸与图片一致,实际偏移量为0,保留逻辑兼容) float offX = (targetPageRect.GetWidth() - image.GetImageScaledWidth()) / 2; float offY = (targetPageRect.GetHeight() - image.GetImageScaledHeight()) / 2; image.SetFixedPosition(offX, offY); document.SetMargins(0, 0, 0, 0); document.Add(image); }
关键修改说明
- 缩放因子计算:通过对比图片与目标纸张的宽、高比例,取最小值作为缩放因子,保证图片缩放后不会超出纸张边界,同时是能适配的最大比例。
- 页面尺寸调整:将PDF页面尺寸设为缩放后的图片尺寸,彻底消除白边,且这个尺寸是最接近目标标准纸张的可能值。
- 图片缩放方式:改用
ScaleAbsolute直接设置缩放后的宽高,比ScaleToFit更直观,避免潜在的尺寸计算偏差。
内容的提问来源于stack exchange,提问作者weirdgyn
相关产品推荐
相关产品推荐

