gpt4 book ai didi

java - Itext7 - 自动调整图像大小

转载 作者:行者123 更新时间:2023-12-02 11:33:16 24 4
gpt4 key购买 nike

我使用 iText(版本 7.1.1)使用 HtmlConverter(html2pdf 版本 2.0.1)将 html 转换为 pdf:

public static ByteArrayOutputStream htmlToPDFStream(String htmlBody)
throws DocumentException, IOException {
ConverterProperties props = new ConverterProperties();

FontProvider fp = new DefaultFontProvider(true, false, false);
for (String font : FONTS) {
FontProgram fontProgram = FontProgramFactory.createFont(font);
fp.addFont(fontProgram);
}

props.setFontProvider(fp);

com.itextpdf.kernel.pdf.PdfWriter writer = new com.itextpdf.kernel.pdf.PdfWriter(outputStream);
PdfDocument pdf = new PdfDocument(writer);
Document document = new Document(pdf);

List<IElement> elements = HtmlConverter.convertToElements(new ByteArrayInputStream(htmlBody.getBytes(StandardCharsets.UTF_8)), props);
for (IElement element : elements) {
document.add((IBlockElement)element);
}
document.close();
return outputStream;
}

如果 HTML 字符串包含小图像(小于默认页面大小 A4),效果很好。但如果我的图像大于默认页面宽度,结果将是 pdf 中的裁剪图像。

如果图像大于默认的 pdf 页面大小,有什么方法可以告诉 iText 自动调整大小吗?

最佳答案

布局中的图像具有自动缩放属性,这应该会导致所需的行为。您需要定义一个自定义 ITagWorker 才能将此属性实际添加到生成的图像元素中。

您还必须定义一个自定义 ITagWorkerFactory 才能对图像使用新的 ITagWorker

代码非常简单,您只需将所有内容小心地结合在一起即可:

class CustomImageWorker extends ImgTagWorker {
public CustomImageWorker(IElementNode element, ProcessorContext context) {
super(element, context);
}

@Override
public IPropertyContainer getElementResult() {
return ((Image)super.getElementResult()).setAutoScale(true);
}
}

ITagWorkerFactory customFactory = new DefaultTagWorkerFactory() {
@Override
public ITagWorker getCustomTagWorker(IElementNode tag, ProcessorContext context) {
if (TagConstants.IMG.equals(tag.name())) {
return new CustomImageWorker(tag, context);
} else {
return null;
}
}
};

之后,只需将标签工厂设置为 Prop :props.setTagWorkerFactory(customFactory);

CSS 级别的另一个解决方案是根据媒体设备设置(例如设备宽度和高度)指定不同的图像宽度和高度。请参阅 @media CSS 规则文档。

UPD 如果您没有为图像定义任何 widthheight CSS 属性,您可以直接将其尺寸与页面尺寸进行比较,但请记住 px 到 pt 的转换率。示例:

@Override
public IPropertyContainer getElementResult() {
Image result = ((Image)super.getElementResult());
if (!processed) {
float imageWidth = result.getImageScaledWidth();
float pageMargin = 36 * 2;
float maxWidth = PageSize.A4.getWidth() - pageMargin;
float maxHeight = PageSize.A4.getHeight() - pageMargin;
if (imageWidth * 0.75 > maxWidth) {
result.scaleToFit(maxWidth / 0.75f, maxHeight / 0.75f);
}
processed = true;
}
return result;
}

关于java - Itext7 - 自动调整图像大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49131575/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com