簡體   English   中英

itext7-自動調整圖像大小

[英]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如果您沒有為圖像定義任何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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM