Java获取图纸信息(PDF与图片类型的转换)

博客介绍了在Java项目中,将PDF转图片、二进制流文件转PDF、二进制文件流转PNG或JPEG图片,以及下载PDF或PNG图纸到本地的方法。因直接在浏览器展示PDF有兼容性问题,可转为图片展示。还给出了引入依赖、具体实例、输出图片流等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

生产过程从厂家获取图纸(PDF转图片,二进制流文件转PDF,二进制文件流转PNG\JEPG图片,下载PDF\PNG图纸到本地)

有些时候我们需要在项目中展示PDF,但是直接在浏览器中加入PDF展示的插件,存在兼容性问题,某些浏览器显示效果不理想,所以我们可以将PDF转为图片,然后以图片的方式展示。

产品特点
Apache 的 PDF box免费,速度稍慢
E-iceblue 的Spire.PDF收费,速度快,功能强大,支持转多种格式

1. 引入依赖

如果是Maven程序,则在pom.xml进行如下配置,然后导入:

<!-- https://mvnrepository.com/artifact/org.apache.pdfbox/pdfbox-tools -->
<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>fontbox</artifactId>
    <version>2.0.18</version>
</dependency>
<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>pdfbox</artifactId>
    <version>2.0.18</version>
</dependency>

<!-- https://mvnrepository.com/artifact/e-iceblue/spire.pdf -->
<dependency>
    <groupId>e-iceblue</groupId>
    <artifactId>spire.pdf</artifactId>
    <version>4.11.1</version>
</dependency>
<repositories>
    <repository>
        <id>com.e-iceblue</id>
        <url>https://repo.e-iceblue.cn/repository/maven-public/</url>
    </repository>
</repositories>

2. 实例一

Java 将PDF转为透明背景的图片

  1. 实例化PdfDocument类的对象。
  2. 调用PdfDocument. loadFromFile(String filename)方法。
  3. 调用PdfDocument. getConvertOptions().setPdfToImageOptions(int bgTransparentValue)方法设置转换后的图片背景透明度。
  4. for循环PDF每一页,使用PdfDocument.saveAsImage(int pageIndex)方法将PDF页面保存为图片。
	public static void main(String[] args) throws IOException {
        PdfDocument pdfDocument = new PdfDocument();
        pdfDocument.loadFromFile("D:\\File_liudy23\\test\\test02.pdf");
		pdfDocument.getConvertOptions().setPdfToImageOptions(100);
        for (int i = 0; i < pdfDocument.getPages().getCount(); i++) {
            BufferedImage image = pdfDocument.saveAsImage(i);
            File file = new File(String.format("D:\\File_liudy23\\test\\ToImage%d.png", i));
            ImageIO.write(image, "PNG", file);
        }
        pdfDocument.close();
    }

3. 实例二

1、get方法获取远端传过来的PDF二进制文件,在前端进行展示
	public static void get(String url, Map<String, String> params, HttpServletResponse response) {
        try {
            log.info("get调用地址url=" + url + " 参数:" + params.toString());
            CloseableHttpClient httpClient = HttpClients.createDefault();
            for (String key : params.keySet()) {
                String value = params.get(key);
                if ("authorization".equals(key)) {
                    continue;
                }
                if (url.contains("?")) {
                    url += "&" + key + "=" + value;
                } else {
                    url += "?" + key + "=" + value;
                }
            }
            String authorization = "";
            if (StringUtils.isNotEmpty(params.get("authorization"))) {
                authorization = params.get("authorization");
            }
            HttpGet httpGet = new HttpGet(url);
            httpGet.addHeader("Content-Type", "application/json;charset=UTF-8");
            httpGet.setHeader("Accept", "application/json");
            httpGet.setHeader("Authorization", authorization);
            // 连接主机服务超时时间  请求超时时间  数据读取超时时间
            RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(10000)
                    .setConnectionRequestTimeout(10000)
                    .setSocketTimeout(10000)
                    .build();
            httpGet.setConfig(requestConfig);
            CloseableHttpResponse res = httpClient.execute(httpGet);
            if (res.getStatusLine().getStatusCode() == 200) {
                // 直接读取内容
                HttpEntity entity = res.getEntity();
                // 输出流
                InputStream is = entity.getContent();
                // 借助传过来的HttpServletResponse,生成输出流
                ServletOutputStream os = response.getOutputStream();
                byte[] bytes = new byte[1024];
                int n;
                while ((n = is.read(bytes)) != -1) {
                	// 需要加0,n,不然转换后的图片可能会失真
                    os.write(bytes, 0, n);
                    os.flush();
                }
                log.info("get调用返回:");
                os.flush();
                os.close();
                is.close();
                httpClient.close();
                res.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
2、将请求远端链接,返回的内容以字符串的形式返回
	public static String get(String url, Map<String, String> params) {
        try {
            log.info("get调用地址url=" + url + " 参数:" + params.toString());
            CloseableHttpClient httpClient = HttpClients.createDefault();
            for (String key : params.keySet()) {
                String value = params.get(key);
                if ("authorization".equals(key)) {
                    continue;
                }
                if (url.contains("?")) {
                    url += "&" + key + "=" + value;
                } else {
                    url += "?" + key + "=" + value;
                }
            }
            String authorization = "";
            if (StringUtils.isNotEmpty(params.get("authorization"))) {
                authorization = params.get("authorization");
            }
            HttpGet httpGet = new HttpGet(url);
            httpGet.addHeader("Content-Type", "application/json;charset=UTF-8");
            httpGet.setHeader("Accept", "application/json");
            httpGet.setHeader("Authorization", authorization);
            // 连接主机服务超时时间  请求超时时间  数据读取超时时间
            RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(10000)
                    .setConnectionRequestTimeout(10000)
                    .setSocketTimeout(10000)
                    .build();
            httpGet.setConfig(requestConfig);
            CloseableHttpResponse response = httpClient.execute(httpGet);
            String resStr = null;
            if (response.getStatusLine().getStatusCode() == 200) {
                HttpEntity entity = response.getEntity();
                if (entity != null) {
                	// 可能包含结果,信息,修在链接等内容。
                    resStr = EntityUtils.toString(entity, "UTF-8");
                }
                log.info("get调用返回:" + resStr);
                httpClient.close();
                response.close();
            }
            return resStr;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
3、二进制流直接转换为图片
	public static void get03(String url, Map<String, String> params, HttpServletResponse response) {
        try {
            logger.info("get调用地址url=" + url + " 参数:" + params.toString());
            CloseableHttpClient httpClient = HttpClients.createDefault();
            for (String key : params.keySet()) {
                String value = params.get(key);
                if ("authorization".equals(key)) {
                    continue;
                }
                if (url.contains("?")) {
                    url += "&" + key + "=" + value;
                } else {
                    url += "?" + key + "=" + value;
                }
            }
            String authorization = "";
            if (ToolUtil.isNotEmpty(params.get("authorization"))) {
                authorization = params.get("authorization");
            }
            HttpGet httpGet = new HttpGet(url);
//            httpGet.addHeader("Content-Type", "application/json;charset=UTF-8");
//            httpGet.setHeader("Accept", "application/json");
            httpGet.setHeader("Authorization", authorization);
            // 连接主机服务超时时间--请求超时时间--数据读取超时时间
            RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(10000)
                    .setConnectionRequestTimeout(10000)
                    .setSocketTimeout(10000)
                    .build();
            httpGet.setConfig(requestConfig);
            CloseableHttpResponse res = httpClient.execute(httpGet);
            if (res.getStatusLine().getStatusCode() == 200) {
                HttpEntity entity = res.getEntity();
                InputStream is = entity.getContent();
                ServletOutputStream os = response.getOutputStream();
                PDDocument pdDocument = PDDocument.load(is);
                PDFRenderer pdfRenderer = new PDFRenderer(pdDocument);
                BufferedImage bufferedImage = pdfRenderer.renderImage(0);
                // todo 多页pdf待转化
                ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
                ImageIO.write(bufferedImage,"png", byteArrayOutputStream);
                byte[] bytes = byteArrayOutputStream.toByteArray();
                os.write(bytes, 0, bytes.length);
//                ImageIO.write(bufferedImage, "png", new File("D:\\tmp\\liudy23\\ToImage02.png"));
                os.close();
                is.close();
                httpClient.close();
                res.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
//        return null;
    }
4、pdf-pic
    public static void pdfToImage02() throws IOException {
        PdfDocument pdfDocument = new PdfDocument();
//        pdfDocument.loadFromStream(in);
        pdfDocument.loadFromFile("D:\\File_liudy23\\test\\test02.pdf");
        BufferedImage bufferedImage = pdfDocument.saveAsImage(0);
//        PDDocument pdDocument = PDDocument.load(Base64Utils.decodeFromString(base64String));
//        PDFRenderer pdfRenderer = new PDFRenderer(pdDocument);
//        BufferedImage bufferedImage = pdfRenderer.renderImage(0);
        ImageIO.write(bufferedImage,"png", new File("D:\\File_liudy23\\test\\ToImage66.png"));
    }
    public static void pdfToImage03(HttpServletResponse response) throws IOException {
        PdfDocument pdfDocument = new PdfDocument();
        pdfDocument.loadFromFile("D:\\File_liudy23\\test\\test02.pdf");
        BufferedImage bufferedImage01 = pdfDocument.saveAsImage(0);

        ByteArrayOutputStream os = new ByteArrayOutputStream();
        ImageIO.write(bufferedImage01,"png", os);
        System.out.println(Arrays.toString(os.toByteArray()));
        ServletOutputStream outputStream = response.getOutputStream();
        outputStream.write(os.toByteArray(), 0, os.toByteArray().length);
//        PDDocument pdDocument = PDDocument.load(Base64Utils.decodeFromString(base64String));
//        PDFRenderer pdfRenderer = new PDFRenderer(pdDocument);
//        BufferedImage bufferedImage = pdfRenderer.renderImage(0);
//        ImageIO.write(bufferedImage,"png", new File("ToImage.png"));
    }

4. PDF-图片流-输出

    @GetMapping("/img")
    public void imgtest(HttpServletResponse response) throws IOException {
        // 生成PDF二进制流文件
        PdfDocument pdfDocument = new PdfDocument();
        pdfDocument.loadFromFile("D:\\File_liudy23\\test\\test02.pdf");
        BufferedImage bufferedImage = pdfDocument.saveAsImage(0);
        // 图片流转二进制数组
        ByteArrayOutputStream os = new ByteArrayOutputStream(1024);
        ImageIO.write(bufferedImage, "png", os);
        byte[] bytes = os.toByteArray();
        System.out.println(Arrays.toString(bytes));
        ServletOutputStream outputStream = response.getOutputStream();
//        outputStream.write(bytes);
        outputStream.write(bytes,0,bytes.length);
    }

5. 下载文件到本地

ImageIO.write(bufferedImage, "png", new File("D:\\tmp\\liudy23\\ToImage02.png"));

6. 调整图片清晰度

方法1:
	public static void pdfToImage04() throws IOException {
        InputStream is = new FileInputStream("D:\\File_liudy23\\test\\test02.pdf");
        PDDocument pdDocument = PDDocument.load(is);
        PDFRenderer pdfRenderer = new PDFRenderer(pdDocument);
        BufferedImage bufferedImage = pdfRenderer.renderImage(0,5);
        // pdfRenderer.renderImageWithDPI(0,350);
        ImageIO.write(bufferedImage,"png", new File("D:\\File_liudy23\\test\\ToImage70.png"));
        is.close();
    }
    
	// 调整清晰度函数
	public BufferedImage renderImage(int pageIndex, float scale) throws IOException {
        return this.renderImage(pageIndex, scale, ImageType.RGB);
    }
    public BufferedImage renderImageWithDPI(int pageIndex, float dpi) throws IOException {
        return this.renderImage(pageIndex, dpi / 72.0F, ImageType.RGB);
    }
方法2:
    public static void pdfToImage02() throws IOException {
        PdfDocument pdfDocument = new PdfDocument();
//        pdfDocument.loadFromStream(in);
        pdfDocument.loadFromFile("D:\\File_liudy23\\test\\test02.pdf");
//        BufferedImage bufferedImage = pdfDocument.saveAsImage(0);
        BufferedImage bufferedImage = pdfDocument.saveAsImage(0, PdfImageType.Bitmap, 500, 500);
//        PDDocument pdDocument = PDDocument.load(Base64Utils.decodeFromString(base64String));
//        PDFRenderer pdfRenderer = new PDFRenderer(pdDocument);
//        BufferedImage bufferedImage = pdfRenderer.renderImage(0);
        ImageIO.write(bufferedImage,"png", new File("D:\\File_liudy23\\test\\ToImage71.png"));
    }
    // 调整清晰度函数
    public BufferedImage saveAsImage(int pageIndex, PdfImageType type, int dpiX, int dpiY) {
        return this.spr  (pageIndex, type, dpiX, dpiY).spr  ();
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值