首页 > 其他分享 >pdf转单张或多张图片

pdf转单张或多张图片

时间:2024-03-25 12:13:07浏览次数:23  
标签:import File new pdf 图片 单张 dir pdfFile

package wuxu.test;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

import javax.imageio.ImageIO;

import org.apache.commons.io.FileUtils;
import org.apache.pdfbox.Loader;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.ImageType;
import org.apache.pdfbox.rendering.PDFRenderer;
import org.apache.pdfbox.tools.imageio.ImageIOUtil;

/**
 * pdf 工具类
 *
 * @author AnJia
 * @since 2021-09-09 16:05
 */
public class Pdf3Png2 {

    public static void main(String [] args) throws IOException{
        // pdf转换成单张图片
        convertPdf2Image("D:\\1234\\123.pdf", "D:\\", "sample.png");
        // pdf转换成多张
        //convertPdf2Images("https://file-examples-com.github.io/uploads/2017/10/file-sample_150kB.pdf", System.getProperty("java.io.tmpdir") + "anjia", "sample.png");
    }

    /**
     * 将pdf转成一张图片,如果要输出的文件已经存在,则不会进行转换
     *
     * @param url      pdf url
     * @param fileName 文件名带png后缀,例如 xxxx.png
     * @param dir      存放文件夹,如果不存在会自动创建
     * @return 文件,如果报错,则会返回null
     * @throws IOException 文件下载失败
     */
    public static File convertPdf2Image(String url, String dir, String fileName) throws IOException {
       /* File pdfFile = new File(new File(dir).getAbsolutePath() + File.separator + fileName + ".pdf");
        pdfFile.getParentFile().mkdirs();
        FileUtils.copyURLToFile(new URL(url), pdfFile);*/
        File pdfFile = new File(url);
        return convertPdf2Image(pdfFile, dir, fileName);
    }

    /**
     * 将pdf转成一张图片,如果要输出的文件已经存在,则不会进行转换
     *
     * @param pdfFile  pdf 文件
     * @param fileName 文件名带png后缀,例如 xxxx.png
     * @param dir      存放文件夹,如果不存在会自动创建
     * @return 文件,如果报错,则会返回null
     */
    public static File convertPdf2Image(File pdfFile, String dir, String fileName) {
        File pngFile = new File(new File(dir).getAbsolutePath() + File.separator + fileName);
        if (pngFile.exists()) {
            return pngFile;
        }
        try (final PDDocument document = Loader.loadPDF(pdfFile)) {
            PDFRenderer pdfRenderer = new PDFRenderer(document);
            // 不知道图片的宽和高,所以先定义个null
            BufferedImage pdfImage = null;
            // pdf有多少页
            int pageSize = document.getNumberOfPages();
            int y = 0;
            for (int i = 0; i < pageSize; ++i) {
                // 每页pdf内容
                BufferedImage bim = pdfRenderer.renderImageWithDPI(i, 180, ImageType.RGB);
                // 如果是第一页需要初始化 BufferedImage
                if (Objects.isNull(pdfImage)) {
                    System.out.print(bim.getWidth());
                    // 假设每页一样宽,一样高,高度就是每页高度*总页数
                    pdfImage = new BufferedImage(bim.getWidth(),
                        bim.getHeight() * pageSize, BufferedImage.TYPE_INT_ARGB);
                }
                // 将每页pdf画到总的pdfImage上,x坐标=0,y坐标=之前所有页的高度和
                pdfImage.getGraphics().drawImage(bim, 0, y, null);
                y += bim.getHeight();
            }

            assert pdfImage != null;
            ImageIO.write(pdfImage, "png", pngFile);
            return pngFile;
        } catch (Exception ex) {
            //log.error("pdf转换png失败", ex);
            System.out.print("失败" + ex + "meaage:" + ex.getMessage());
        }
        return null;
    }

    /**
     * 将pdf转换成多张图片(1页pdf转换成1张图片),如果要输出的图片已经存在,则不会进行转换
     *
     * @param url          pdf url
     * @param dir          存放目录
     * @param baseFileName pdf文件名
     * @return 如果转换成功会返回 图片文件list,如果失败会返回null
     * @throws IOException 下载文件失败
     */
    public static List<File> convertPdf2Images(String url, String dir, String baseFileName) throws IOException {
        File pdfFile = new File(dir + File.separator + baseFileName + ".pdf");
        pdfFile.getParentFile().mkdirs();
        FileUtils.copyURLToFile(new URL(url), pdfFile);
        return convertPdf2Images(pdfFile, dir, baseFileName);
    }

    /**
     * 将pdf转换成多张图片(1页pdf转换成1张图片),如果要输出的图片已经存在,则不会进行转换
     *
     * @param pdfFile      pdf 文件
     * @param dir          存放目录
     * @param baseFileName pdf文件名
     * @return 如果转换成功会返回 图片文件list,如果失败会返回null
     */
    public static List<File> convertPdf2Images(File pdfFile, String dir, String baseFileName) {
        List<File> images = null;
        File directory = new File(dir);
        directory.mkdirs();
        try (final PDDocument document = Loader.loadPDF(pdfFile)) {
            PDFRenderer pdfRenderer = new PDFRenderer(document);
            // pdf有多少页
            int pageSize = document.getNumberOfPages();
            images = new ArrayList<>(pageSize);
            File pageFile;
            for (int i = 0; i < pageSize; ++i) {
                pageFile = new File(String.format("%s%s%s-%s.png", directory.getAbsolutePath(), File.separator, baseFileName, i));
                if (pageFile.exists()) {
                    continue;
                }
                BufferedImage bim = pdfRenderer.renderImageWithDPI(i, 300, ImageType.RGB);
                ImageIOUtil.writeImage(bim, pageFile.getAbsolutePath(), 300);
                images.add(pageFile);
            }
        } catch (Exception ex) {
            //log.error("pdf转换png失败", ex);
            System.out.print("失败" + ex);
        }
        return images;

    }
}

 

标签:import,File,new,pdf,图片,单张,dir,pdfFile
From: https://www.cnblogs.com/wuxu/p/18094087

相关文章

  • 2024 年 8 个最佳 PDF 转 JPG 转换器[免费和付费]
    虽然PDF(便携式文档文件)是一种流行的文档共享格式,但有时您可能希望将PDF文件转换为JPG,然后在网页或社交媒体上共享它们。在本文中,我们将讨论适用于Windows10和11的出色PDF到JPG转换器的所有特性。与图像不同,PDF文件可以说更难集成到网页中。另一方面,仅拖放图像即......
  • ASP.NET Core 切分、合并 PDF
    继续使用DocNET:https://github.com/GowenGit/docnetNuget:Install-PackageDocnet.Core切分PDF注意,DocNET的Split方法的索引是从0开始的,所以我们认为的获取PDF的第三到第五页,在DocNET的Split方法其实是从第二到第四页…publicstaticboolSplitPdf(string......
  • 【技术贴】Windows 11桌面出现“了解此图片”图标?一招教你轻松解决!
        亲爱的朋友们,大家好!近期,随着Windows11的更新与普及,一些用户反映他们的电脑桌面上意外出现了一个名为“了解此图片”的图标,并且桌面背景还会不请自来地自动更换,让人感到既困惑又无奈。    如果你也遇到了同样的问题,而且正在寻找一种简单快捷的方法来摆脱......
  • 使用AI技术(单张图片或文字)生产3D模型 —— Ai生成3D模型的时代来了
    地址:https://www.bilibili.com/video/BV1A2421P7pH/视频用到的工具voxcraft体验地址:https://voxcraft.ai/......
  • 纯前端实现 JPG 图片压缩 | canvas
    在线Demo体验地址→:https://demos.sugarat.top/pages/jpg-compress/前言在迭代图床应用时,需要用到图片压缩,在之前分享了使用UPNG.js压缩PNG图片,这里记录分享一下如何处理JPG图片。搜罗调研了一圈,JPG图片的处理,基本都是围绕canvas展开的。掘金:前端实现图片压......
  • Adobe的PDF编辑软件Acrobat Pro DC 2024.001.20604版本下载与安装教程
    目录前言一、AcrobatProDC2024安装二、使用配置总结前言PDF格式(缩写为便携式文档格式和便携式文档格式)的发展始于1990年。这种格式用于以类似于打印文档的固定格式呈现包含文本、图像和其他要求的文档。Adobe在1993年发布了专有的Acrobat软件,首次展示了对这种......
  • NCV8702MX33TCG电源管理线性稳压器芯片中文资料PDF数据手册引脚图图片价格
    产品概述:NCV8702是一款200mA低漏静止电流、低漏线性稳压器,带超低噪声特性。它的低噪音结合高电源抑制比(PSRR)使其特别适用于射频、音频或成像应用。该器件采用先进的BiCMOS工艺制造,可提供低电流耗量和卓越噪声性能的强大组合。NCV8702可稳定使用小型低值1µ电容器......
  • NCV7718CDPR2G半桥驱动器规格书PDF数据手册引脚图图片价格参数概概述
    产品概述:NCV7718是一款六角半桥驱动器,具有专为汽车和工业运动控制应用设计的保护功能。NCV7718具有独立的控制和诊断功能。该器件可在正向、反向、制动和高阻抗状态下运行。驱动器通过16位SPI接口进行控制,并且菊花链兼容规格书参数:引脚图:......
  • NCV7351D13R2G收发器芯片中文资料规格书PDF数据手册引脚图参数图片价格特性
    产品概述:NCV7351CAN收发器是控制器区域网络(CAN)协议控制器和物理总线之间的接口,可在12V和24V系统中使用。该收发器为总线提供差分发射功能,向CAN控制器提供差分接收功能。NCV7351是CAN高速收发器系列的新增产品,是NCV734xCAN独立收发器和AMIS42665、AMIS306......
  • NCV8703MX33TCG 线性稳压器芯片中文资料规格书PDF数据手册引脚图图片价格
    产品概述:NCV8703是一款低噪音、低功耗和低漏线性稳压器。该器件具有优异的噪音和PSRR规格,适用于使用射频接收器、成像传感器、音频处理器或需要外部洁净电源的任何部件的产品。NCV8703使用创新的自适应接地电流电路可确保轻负载调节下的超低接地电流。规格书参数:引脚图......