缩放图像以使用iText填充多个页面

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了缩放图像以使用iText填充多个页面相关的知识,希望对你有一定的参考价值。

我正在尝试使用iText(在新的PDF文档上)缩放图像,以使其填充页面的宽度而不进行拉伸,因此可能需要几页。

我找到了很多解决方案,但它们非常复杂,我不喜欢那样编码。我到目前为止找到的最佳解决方案(来自SO上的另一个问题)是使用PdfTable但它总是使用单页,缩放图像。

// Load image from external storage
Image image = Image.getInstance(path + "/img.png");
// Calculate ratio
float width = PageSize.A4.getWidth();
float heightRatio = image.getHeight() * width / image.getWidth();
Document document = new Document();
document.open();
PdfPTable table = new PdfPTable(1);
table.setWidthPercentage(100);
PdfPCell c = new PdfPCell(image, true);
c.setBorder(PdfPCell.NO_BORDER);
c.setPadding(0);
// Set image dimensions
c.getImage().scaleToFit(width, heightRatio);
table.addCell(c);
document.add(table);
// Write PDF file
document.close();

有什么建议?

答案

好吧我终于决定采用我不想去的方式,因为它似乎是唯一的方法:将相同的图像添加到每个页面并为每个页面设置适当的垂直偏移。偏移量计算为剩余绘制的页数+剩余的空白。对于每一步,我减少页数,直到没有任何东西可以绘制。

// Open new PDF file
Document document = new Document();
PdfWriter pdfWriter = PdfWriter.getInstance(document, new FileOutputStream(getSharedDirPath() + File.separator + "file.pdf"));

document.open();
PdfContentByte content = pdfWriter.getDirectContent();

// Load image from external folder
Image image = Image.getInstance(path + "/img.png");
image.scaleAbsolute(PageSize.A4);
image.setAbsolutePosition(0, 0);

float width = PageSize.A4.getWidth();
float heightRatio = image.getHeight() * width / image.getWidth();
int nPages = (int) (heightRatio / PageSize.A4.getHeight());
float difference = heightRatio % PageSize.A4.getHeight();

while (nPages >= 0) {
    document.newPage();
    content.addImage(image, width, 0, 0, heightRatio, 0, -((--nPages * PageSize.A4.getHeight()) + difference));
}

// Write PDF file
document.close();

老实说,我不喜欢这个解决方案,我认为可以像在文本编辑器中一样自动调整尺寸,但毕竟它并不是很难.....我只花了三天时间弄清楚如何整个PDF的工作原理。

以上是关于缩放图像以使用iText填充多个页面的主要内容,如果未能解决你的问题,请参考以下文章

iOS Xcode 使背景图像缩放以填充

为啥缩放以填充比 UIImageVIew 尺寸更大的图像? (使用快速)

UIButton 背景图像水平缩放以填充同时保持纵横比

缩放图像以填充 ImageView 宽度并保持纵横比

swift - 如何在多个页面中快速缩放图像

Andengine,缩放图像以填充屏幕大小,而不保持纵横比