[英]Itext7 - Auto resize image
我使用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;
}
}
};
之后,只需將標簽工廠設置為props: props.setTagWorkerFactory(customFactory);
CSS級別的另一種解決方案是根據媒體設備設置(例如設備的寬度和高度)指定不同的圖像寬度和高度。 請參閱@media
CSS規則文檔。
UPD如果您沒有為圖像定義任何width
或height
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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.