You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android新手使用iText转换HTML到PDF时图片缩小问题求助

解决iText转换HTML到PDF时图片变小的问题

嘿,作为Android开发新手碰到这个问题太正常啦!我当初用iText做HTML转PDF的时候也踩过这个坑,给你几个实用的解决思路,亲测有效:

1. 先检查HTML里的图片标签设置

XMLWorker对CSS的支持有限,如果你的图片只靠CSS设置尺寸,大概率会被忽略。直接在<img>标签里明确指定width和height属性是最稳妥的,比如:

<img src="your_image.jpg" width="600" height="400" />

这样iText能直接读取到你期望的图片尺寸,不会随便缩放。

2. 自定义ImageProvider接管图片加载

默认的图片加载逻辑可能会自动缩放图片适配PDF页面,你可以写一个自定义的ImageProvider来强制保留原图尺寸:

class CustomAssetImageProvider extends AbstractImageProvider {
    private final AssetManager assetManager;

    public CustomAssetImageProvider(AssetManager assetManager) {
        this.assetManager = assetManager;
    }

    @Override
    public Image getImage(String src, Map<String, String> attrs, ChainedProperties chain, HtmlPipelineContext context) {
        try {
            // 从assets加载图片
            InputStream inputStream = assetManager.open(src);
            Image image = Image.getInstance(inputStream);
            
            // 强制使用图片原始尺寸,不自动缩放
            image.scaleAbsolute(image.getWidth(), image.getHeight());
            return image;
        } catch (IOException | BadElementException e) {
            e.printStackTrace();
            return super.getImage(src, attrs, chain, context);
        }
    }
}

然后在处理HTML转换时,把这个自定义Provider设置进去:

PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(file));
document.open();

InputStream htmlPath = getAssets().open(filename + ".html");

// 构建自定义处理管道
CSSResolver cssResolver = XMLWorkerHelper.getInstance().getDefaultCssResolver(true);
HtmlPipelineContext htmlContext = new HtmlPipelineContext(null);
htmlContext.setTagFactory(Tags.getHtmlTagProcessorFactory());
// 设置自定义图片Provider
htmlContext.setImageProvider(new CustomAssetImageProvider(getAssets()));

// 组装管道并处理
PdfWriterPipeline pdfPipeline = new PdfWriterPipeline(document, writer);
HtmlPipeline htmlPipeline = new HtmlPipeline(htmlContext, pdfPipeline);
CssResolverPipeline cssPipeline = new CssResolverPipeline(cssResolver, htmlPipeline);

XMLWorker worker = new XMLWorker(cssPipeline, true);
XMLParser parser = new XMLParser(worker);
parser.parse(htmlPath);

document.close();

3. 调整PDF页面尺寸适配图片

如果你的图片本身尺寸很大,默认的A4页面(宽度595pt)会自动把图片缩放到页面宽度内。你可以根据图片尺寸自定义PDF页面大小:

// 先加载图片获取尺寸
Image sampleImg = Image.getInstance(getAssets().open("your_image.jpg"));
// 创建和图片尺寸匹配的PDF文档
Document document = new Document(new Rectangle(sampleImg.getWidth(), sampleImg.getHeight()));

或者给页面设置足够的边距,避免图片被挤压:

Document document = new Document(PageSize.A4, 10, 10, 10, 10); // 减小边距,给图片更多空间

4. 用CSS强制图片尺寸

如果不想改HTML标签,也可以通过自定义CSS来强制图片按原始尺寸显示,把这段CSS添加到CSSResolver里:

cssResolver.addCss("img { width: auto !important; height: auto !important; max-width: 100%; }", true);

这段CSS会让图片保持原始宽高比例,同时不会超出页面宽度。

内容的提问来源于stack exchange,提问作者N.Cream

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:50:20