我在使用 iTextSharp 时遇到问题。我有一张 20000x1000 的图像,我必须将其放入页面尺寸为 A1 水平的 PDF 中。棘手的是,我需要调整 PDF 图像的高度并打印相对于图像的多页宽度。
我尝试过这样做,但它生成了一个包含单页的 PDF,并且图像调整了宽度和高度。
Rectangle pageSize = PageSize.A1;
Document doc = new Document(pageSize.Rotate(), 10f, 10f, 10f, 10f);
PdfWriter writer = PdfWriter.GetInstance(doc, new FileStream(@"C:\TestFiles\Default.pdf", FileMode.Create));
doc.Open();
Image image = Image.GetInstance(@"C:\TestFiles\image.png");
PdfPTable table = new PdfPTable(1);
table.WidthPercentage = 100;
PdfPCell c = new PdfPCell(image, true);
c.Border = PdfPCell.NO_BORDER;
c.Padding = 5;
c.Image.ScaleAbsoluteHeight(pageSize.Height);
table.AddCell(c);
doc.Add(table);
doc.Close();
预先感谢您的帮助。
最佳答案
使用表格不能满足您的要求。
首先让我们看看如何缩放图像以使高度适应旋转的 A1 文档的高度:
Image image = Image.GetInstance(@"C:\TestFiles\image.png");
image.ScaleToFit(image.ScaledWidth, PageSize.A1.Width);
ScaleToFit()
方法缩放图像以使其适合矩形。在这种情况下,我们不希望宽度减小,因此我们将该矩形的宽度定义为等于原始图像的宽度。我们确实想要缩放高度,使其适合旋转的 A1 页面的高度。当我们旋转 A1 页面时,我们必须使用 PageSize.A1.Width
而不是 PageSize.A1.Height
。
- 假设您有一张尺寸为 500 x 1500 的图像,则缩放后的图像尺寸将为 500 x 2000,因为该图像适合 500 x 1684 的矩形。
- 假设您有一张尺寸为 500 x 2000 的图像,则缩放后的图像将为 421 x 1684。高度将减小以适合旋转的 A1 页面,宽度也将相应减小。
- 假设您有一张 5000 x 2000 的图像,则缩放后的图像将为 4210 x 1684。
现在我们必须根据需要多次添加相同的图像,直到渲染出完整的图像。请注意,图像字节只会在 PDF 中存储一次:这些字节会在每个页面中重复使用。
Float offset = 0;
while (offset <= img.ScaledWidth) {
document.NewPage();
img.SetAbsolutePosition(-offset, 0);
document.Add(img);
offset += PageSize.A1.HEIGHT;
}
上面的代码片段发生了什么?在第一页上,我们将图像添加到位置(0, 0)
,这意味着图像的左下角将与页面的左下角重合。
如果图像适合页面,例如如果宽度缩放得小于新的偏移量 (2384
),则不会触发新页面。如果图像不适合页面(例如,因为缩放宽度为 4210,大于 2384),则会创建一个新页面,并且将添加相同的图像并添加新的偏移量(例如 (-2384, 0)
)。
假设缩放后的图片宽度确实是4210,页面宽度是2384,那么添加第二页后的偏移量就是4768,大于4210,所以不会有第三页。
关于image - iTextSharp 水平多页超宽图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40867312/