PDF插入图片报错 java.io.IOException: http://xxx.png is not a recognized imageformat.

背景

在完成pdf生成需求时,pdf里需要插入图片,结果报错java.io.IOException: http://xxx.png is not a recognized imageformat. 但是如果将 url 粘贴到浏览器中,则会返回正确的图像。如果使用本地图片,也可以成功。
在这里插入图片描述

原因

如果从 URL 请求图像,它必须实际指向该图像。如果 URL 指向一个网页,然后重定向到另一个 URL(或者 URL 的返回代码是重定向),那么将失败。而浏览器默认是不允许在 https 里面引用 http 资源的,一般都会弹出提示框。此处我使用了http开头的图片地址,所以当我访问该图片的时候相当于重定向了(https -> http,如下图),所以pdf获取图片失败了。

这本质上是由于 getInstance() 方法了解如何使用 HTTP 定位协议来获取文件,但对 HTTP 协议的了解不足以成为 HTTP 客户端。
在这里插入图片描述

解决方法

  1. 使用 https 的地址(用域名访问远程图片)
  2. 将图像存储在程序中的文件中,再通过代码动态获取图片在程序里的路径。(代码如下)
/**
     * 动态获取资源目录下资源的路径
     * @param fileName 资源文件名   如:STSONG.TTF
     * @param newChildPath 新文件所在子路径  如:/font
     * @return 资源最终所在路径
     * @throws IOException
     */
    public static String getFileDynamic(String fileName,String newChildPath) throws IOException {
        // 获取类路径下的文件路径
        File path = new File(ResourceUtils.getURL("classpath:").getPath());
        if (!path.exists()) {
            path = new File("");
        }
        log.info("path = {}", path.getAbsolutePath());
        File upload = new File(path.getAbsolutePath(), newChildPath);
        if (!upload.exists()) {
            upload.mkdirs();
        }
        String resources = upload.getAbsolutePath() + File.separator + fileName;
        log.info("resources = {}", resources);
        return resources;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值