【PDFBox】PDFBox操作PDF文档之添加本地图片、添加网络图片、图片宽高自适应、图片水平垂直居中对齐

这篇具有很好参考价值的文章主要介绍了【PDFBox】PDFBox操作PDF文档之添加本地图片、添加网络图片、图片宽高自适应、图片水平垂直居中对齐。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这篇文章,主要介绍PDFBox操作PDF文档之添加本地图片、添加网络图片、图片宽高自适应、图片水平垂直居中对齐。

目录

一、PDFBox操作图片

1.1、添加本地图片

(1)案例代码

(2)运行效果

(3)方法介绍

1.2、添加网络图片

(1)案例代码

(2)运行效果

1.3、图片宽高自适应(图片缩放)

(1)图片缩放代码

1.4、读取图片

(1)案例代码

(2)运行效果


一、PDFBox操作图片

PDFBox可以向PDF文档中添加图片对象,使用PDImageXObject表示一个图片对象,对PDF文档的内容进行操作,都需要借助于PDPageContentStream页面内容流对象来完成,PDFBox将每一个PDF页面中的所有文本、图片、表单等内容看作一个流,通过流的方式来完成内容的添加、删除、修改等操作。这里首先介绍如何使用PDFBox添加图片对象到PDF文档里面。

1.1、添加本地图片

(1)案例代码

添加本地图片,也就是读取当前磁盘中的图片,然后将这个图片写入到PDPageContentStream页面内容流里面,案例代码如下:

package pdfbox.demo.image;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;

/**
 * @version 1.0.0
 * @Date: 2023/7/15 14:51
 * @Author ZhuYouBin
 * @Description: PDFBox操作图片
 */
public class PDFBoxImageUtil {

    /**
     * 将给定路径的图片,保存到pdf文件里面
     * @param imgPath 图片路径
     * @param destPdf 生成的pdf文件路径
     * @return 返回生成的pdf文件路径
     */
    public static String generateImageToPdf(String imgPath, String destPdf) {
        try {
            // 1、创建PDF文档对象
            PDDocument doc = new PDDocument();
            // 2、创建Page页面对象
            PDPage page = new PDPage(PDRectangle.A4);
            // 3、创建图片对象
            PDImageXObject image = PDImageXObject.createFromFile(imgPath, doc);
            // 4、创建页面内容流,指定操作哪个文档中的哪个页面
            PDPageContentStream stream = new PDPageContentStream(doc, page);
            stream.drawImage(image, 10, 10); // 绘制图片到PDF页面里面
            stream.close(); // 关闭页面内容流
            doc.addPage(page); // 添加页面到PDF文档
            doc.save(destPdf); // 保存PDF文档
            doc.close(); // 关闭PDF文档
        } catch (Exception e) {
            e.printStackTrace();
        }
        return destPdf;
    }

    public static void main(String[] args) {
        String imgPath = "E:\\demo\\001.jpg";
        String destPdf = "E:\\demo\\img.pdf";
        generateImageToPdf(imgPath, destPdf);
    }
}

(2)运行效果

【PDFBox】PDFBox操作PDF文档之添加本地图片、添加网络图片、图片宽高自适应、图片水平垂直居中对齐,【WPSP笔记】,pdf,PDFBox,PDFBox添加图片,PDFBox图片宽高自适应,图片水平垂直居中对齐

(3)方法介绍

PDImageXObject类中提个了一些静态方法,常见的有下面这些:

  • createFromFile(imagePath,doc)方法:采用File文件的方式读取本地磁盘中的图片。
    • imagePath参数:图片的路径。
    • doc参数:PDF文档对象。
  • getImage()方法:返回BufferedImage图片对象。
  • getSuffix()方法:返回图片的后缀类型,例如:jpg、png等。

1.2、添加网络图片

PDFBox中是没有提供读取网络图片的方法,但是可以采用下面这种方式实现读取网络图片的功能,思路如下:

  • 第一步:使用URL对象将网络图片下载到本地磁盘上。
  • 第二步:使用createFromFile()方法从本地磁盘读取刚刚下载的网络图片。

(1)案例代码

package pdfbox.demo.image;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.UUID;

/**
 * @version 1.0.0
 * @Date: 2023/7/15 15:01
 * @Author ZhuYouBin
 * @Description: PDFBox操作图片,添加网络图片到PDF文档
 */
public class PDFBoxImageUtil {

    /**
     * 将给定路径的图片,保存到pdf文件里面
     * @param imgPath 图片路径
     * @param destPdf 生成的pdf文件路径
     * @return 是否生成成功
     */
    public static String generateImageToPdf(String imgPath, String destPdf) {
        try {
            // 1、创建PDF文档对象
            PDDocument doc = new PDDocument();
            // 2、创建Page页面对象
            PDPage page = new PDPage(PDRectangle.A4);
            // 3、创建图片对象
            PDImageXObject image;
            boolean isTemp = false;
            String tempPath = null;
            if (imgPath.startsWith("http://") || imgPath.startsWith("https://")) {
                isTemp = true;
                tempPath = downloadImage(imgPath, null);
                image = PDImageXObject.createFromFile(tempPath, doc);
            } else {
                image = PDImageXObject.createFromFile(imgPath, doc);
            }
            // 4、创建页面内容流,指定操作哪个文档中的哪个页面
            PDPageContentStream stream = new PDPageContentStream(doc, page);
            stream.drawImage(image, 10, 10); // 绘制图片到PDF页面里面
            stream.close(); // 关闭页面内容流
            doc.addPage(page); // 添加页面到PDF文档
            doc.save(destPdf); // 保存PDF文档
            doc.close(); // 关闭PDF文档
            // 图片添加成功之后需要删除本地临时文件
            if (isTemp) {
                new File(tempPath).delete();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return destPdf;
    }

    /**
     * 下载网络图片到本地
     * @param imgPath 网络图片地址
     * @param fileName 文件名称
     * @return 返回本地图片的临时路径
     */
    public static String downloadImage(String imgPath, String fileName) {
        try {
            URLConnection conn = new URL(imgPath).openConnection();
            String contentType = conn.getContentType();
            System.out.println(contentType);
            // 创建临时文件目录保存图片
            File file = new File("temp");
            if (!file.exists() && !file.mkdirs()) {
                throw new RuntimeException("临时目录创建失败");
            }
            if (fileName == null || fileName.trim().equals("")) {
                fileName = UUID.randomUUID().toString();
            }
            InputStream is = conn.getInputStream();
            byte[] data = new byte[1024];
            int len;
            // 下载文件到本地临时目录
            switch (contentType) {
                case "image/jpeg":fileName += ".jpeg"; break;
                case "image/gif": fileName += ".gif"; break;
                case "image/webp":
                case "image/png": fileName += ".png"; break;
            }
            fileName = file.getAbsolutePath() + File.separator + fileName;
            FileOutputStream fos = new FileOutputStream(fileName);
            while ((len = is.read(data)) != -1) {
                fos.write(data, 0, len);
            }
            fos.close();
            is.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return fileName;
    }

    public static void main(String[] args) {
        String imgPath = "https://www.toopic.cn/public/uploads/small/1658043938262165804393852.jpg";
        String destPdf = "E:\\demo\\img.pdf";
        generateImageToPdf(imgPath, destPdf);
    }
}

(2)运行效果

【PDFBox】PDFBox操作PDF文档之添加本地图片、添加网络图片、图片宽高自适应、图片水平垂直居中对齐,【WPSP笔记】,pdf,PDFBox,PDFBox添加图片,PDFBox图片宽高自适应,图片水平垂直居中对齐

1.3、图片宽高自适应(图片缩放)

前面已经能够将图片添加到PDF文档中了,但是可以发现,我们添加的图片尺寸太大的时候,超过PDF文档部分就会被遮挡,如何解决这个问题呢???对于这个问题,可以采用缩放图片的方式来解决,思路如下所示:

  • 第一步:获取图片的实际宽度、高度(JDK中获取到的图片宽高单位是【px】,需要将【px】转换成【pt】单位,转换规则:1pt = 3/4 px)。
  • 第二步:获取到PDF文档的宽度、高度(PDFBox中获取到的宽度、高度是采用【pt】作为单位的)。
  • 第三步:图片的实际宽高和PDF文档的宽高进行比较,计算缩放比例。

(1)图片缩放代码

package pdfbox.demo.image;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.UUID;

/**
 * @version 1.0.0
 * @Date: 2023/7/15 15:11
 * @Author ZhuYouBin
 * @Description: PDFBox操作图片,图片宽高自动缩放
 */
public class PDFBoxImageUtil {

    /**
     * 将给定路径的图片,保存到pdf文件里面
     *
     * @param imgPath 图片路径
     * @param destPdf 生成的pdf文件路径
     * @return 返回生成的pdf文件路径
     */
    public static boolean generateImageToPdf(String imgPath, String destPdf) {
        try {
            // 1、创建PDF文档对象
            PDDocument doc = new PDDocument();
            // 2、创建Page页面对象
            PDPage page = new PDPage(PDRectangle.A4);
            // 3、创建图片对象
            PDImageXObject image;
            if (imgPath.startsWith("http://") || imgPath.startsWith("https://")) {
                String tempPath = downloadImage(imgPath, null);
                image = PDImageXObject.createFromFile(tempPath, doc);
                imgPath = tempPath;
            } else {
                image = PDImageXObject.createFromFile(imgPath, doc);
            }
            // 4、创建页面内容流,指定操作哪个文档中的哪个页面
            PDPageContentStream stream = new PDPageContentStream(doc, page);
            // 获取图片的宽高
            float[] imageWH = getImageWH(imgPath, page.getMediaBox());
            stream.drawImage(image, imageWH[0], imageWH[1], imageWH[2], imageWH[3]); // 绘制图片到PDF页面里面
            stream.close(); // 关闭页面内容流
            doc.addPage(page); // 添加页面到PDF文档
            doc.save(destPdf); // 保存PDF文档
            doc.close(); // 关闭PDF文档
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    /**
     * 获取图片的宽度、高度,单位是【pt】
     *
     * @param imgPath 图片路径
     * @param box     PDF文档页面矩形区域对象,可以获取到矩形区域的宽高
     * @return 返回缩放之后的图片宽高
     */
    public static float[] getImageWH(String imgPath, PDRectangle box) {
        try {
            File file = new File(imgPath);
            InputStream is = new FileInputStream(file);
            // 判断是不是网络上的图片
            if (imgPath.startsWith("http://") || imgPath.startsWith("https://")) {
                is = new URL(imgPath).openStream();
            }
            BufferedImage bi = ImageIO.read(is);
            // px 转换成 pt 单位
            float xAxis;
            float yAxis;
            int w = bi.getWidth();
            int h = bi.getHeight();
            float width = (float) (w * 3.0 / 4); // 这里是因为 1pt = 3/4 px,pt和px单位转换
            float height = (float) (h * 3.0 / 4);
            float pw = box.getWidth() - 60; // 这里减不减60没啥关系,只是设置一下空白间距
            float ph = box.getHeight() - 60; // 这里减不减60没啥关系,只是设置一下空白间距
            if (width > pw) {
                float scale = pw / width;  // 缩放比列
                width = pw; // 宽度等于页面宽度
                height = height * scale; // 高度自动缩放
            } else {
                float scale = ph / height;  // 缩放比列
                height = ph; // 高度等于页面高度
                width = width * scale;  // 宽度自动缩放
            }
            // 计算图片在X、Y轴上的显示位置
            xAxis = (box.getWidth() - width) / 2; // X轴居中对齐
//            yAxis = box.getHeight() - height - 10; // 距离页面顶部10个pt
            yAxis = (box.getHeight() - height) / 2; // Y轴垂直居中对齐
            return new float[]{xAxis, yAxis, width, height};
        } catch (Exception e) {
            e.printStackTrace();
        }
        return new float[]{0, 0, 0, 0};
    }

    /**
     * 下载网络图片到本地
     * @param imgPath 网络图片地址
     * @param fileName 文件名称
     * @return 返回本地图片的临时路径
     */
    public static String downloadImage(String imgPath, String fileName) {
        try {
            URLConnection conn = new URL(imgPath).openConnection();
            String contentType = conn.getContentType();
            // 创建临时文件目录保存图片
            File file = new File("temp");
            if (!file.exists() && !file.mkdirs()) {
                throw new RuntimeException("临时目录创建失败");
            }
            if (fileName == null || fileName.trim().equals("")) {
                fileName = UUID.randomUUID().toString().replaceAll("-", "");
            }
            InputStream is = conn.getInputStream();
            byte[] data = new byte[1024];
            int len;
            // 下载文件到本地临时目录
            switch (contentType) {
                case "image/jpeg":fileName += ".jpeg"; break;
                case "image/gif": fileName += ".gif"; break;
                case "image/webp":
                case "image/png": fileName += ".png"; break;
            }
            fileName = file.getAbsolutePath() + File.separator + fileName;
            FileOutputStream fos = new FileOutputStream(fileName);
            while ((len = is.read(data)) != -1) {
                fos.write(data, 0, len);
            }
            fos.close();
            is.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return fileName;
    }

    public static void main(String[] args) {
        String imgPath = "https://www.toopic.cn/public/uploads/small/1658043938262165804393852.jpg";
        String destPdf = "E:\\demo\\img.pdf";
        generateImageToPdf(imgPath, destPdf);
    }
}

1.4、读取图片

PDFBox也可以从PDF文档中读取图片,然后将其保存到本地磁盘中,保存图片可以使用JDK中提供的ImageIO类,这个类中提供了一个write()方法,可以将图片对象写入到File文件里面。

(1)案例代码

package pdfbox.demo.image;

import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDResources;
import org.apache.pdfbox.pdmodel.graphics.PDXObject;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;

/**
 * @version 1.0.0
 * @Date: 2023/7/15 15:11
 * @Author ZhuYouBin
 * @Description: PDFBox操作图片,从PDF文档中【读取图片】,并且保存到本地
 */
public class PDFBoxImageUtil {

    /**
     * 从给定的pdf文档里面,获取指定页面中的所有图片,并且保存到本地目录下
     * <p>
     *     pdf文档中的图片都是BASE64编码,我们能够获取到的也就只能是图片对应的BASE64字符串。
     *     所以,还需要将图片的BASE64字符串编码转换成对应的图片文件
     * </p>
     * @param pdfPath PDF文档路径
     * @param imagePath 生成的图片路径以及名称
     * @param pageNum 获取第几页的图片
     * @return 返回提取的图片本地路径
     */
    public static String readerImageFromPdf(String pdfPath, String imagePath, int pageNum) {
        try {
            // 1、加载PDF文档
            PDDocument doc = PDDocument.load(new File(pdfPath));
            // 2、遍历所有Page页面,找到指定的page页面获取图片
            int pages = doc.getNumberOfPages();
            for (int i = 0; i < pages; i++) {
                if (i != pageNum) {
                    continue;
                }
                // 获取当前Page页面
                PDPage page = doc.getPage(i);
                // 获取对应页面的资源对象
                PDResources resources = page.getResources();
                // 遍历当前页面所有内容,找出图片对象
                for (COSName cosName : resources.getXObjectNames()) {
                    PDXObject pdxObject = resources.getXObject(cosName);
                    // 判断是不是图片对象
                    if (pdxObject instanceof PDImageXObject) {
                        // 获取图片对象
                        BufferedImage image = ((PDImageXObject) pdxObject).getImage();
                        // 保存到本地磁盘里面
                        ImageIO.write(image, "JPEG", new File(imagePath));
                    }
                }
            }
            doc.close(); // 关闭PDF文档
        } catch (Exception e) {
            e.printStackTrace();
        }
        return imagePath;
    }

    public static void main(String[] args) {
        String imgPath = "E:\\img\\002.jpg";
        String destPdf = "E:\\demo\\img.pdf";
        readerImageFromPdf(destPdf, imgPath, 0);
    }
}

(2)运行效果

【PDFBox】PDFBox操作PDF文档之添加本地图片、添加网络图片、图片宽高自适应、图片水平垂直居中对齐,【WPSP笔记】,pdf,PDFBox,PDFBox添加图片,PDFBox图片宽高自适应,图片水平垂直居中对齐

到此,PDFBox操作图片就介绍完啦。

综上,这篇文章结束了,主要介绍PDFBox操作PDF文档之添加本地图片、添加网络图片、图片宽高自适应、图片水平垂直居中对齐。文章来源地址https://www.toymoban.com/news/detail-588027.html

到了这里,关于【PDFBox】PDFBox操作PDF文档之添加本地图片、添加网络图片、图片宽高自适应、图片水平垂直居中对齐的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java使用pdfbox将pdf转图片

    目前比较主流的两种转pdf的方式,就是pdfbox和icepdf,两种我都尝试了下,icepdf解析出来有时候会出现中文显示不出来,网上的解决方式又特别麻烦,不是安装字体,就是重写底层类,所以我选择了pdfbox 在windows上好好的,x86_64的linux上也好好的,就是arm架构的linux上会出现 网上

    2024年02月10日
    浏览(58)
  • JAVA 实现PDF转图片(pdfbox版)

    依赖: pdf存放路径 正文开始: pdf转换多张图片、长图 展示效果: 附加:小程序预览wxml代码 依赖: pdf存放路径 正文开始: pdf转换多张图片、长图

    2024年02月06日
    浏览(58)
  • Java使用pdfbox进行pdf和图片之间的转换

    pdfbox是Apache开源的一个项目,支持pdf文档操作功能。 官网地址: Apache PDFBox | A Java PDF Library 支持的功能如下图. 引入依赖

    2024年02月06日
    浏览(54)
  • Java 利用pdfbox将图片和成到pdf指定位置

    业务背景:用户在手机APP上进行签名,前端将签完名字的图片传入后端,后端合成新的pdf. 废话不多说,上代码: 注意:前端传过来的图片必须是透明的,否则合成的时候签名处会有边框        

    2024年02月09日
    浏览(65)
  • 【itext7】itext7操作PDF文档之创建PDF文档、加载PDF文档、添加空白页、操作PDF页面、itext中的常见类及其方法

    这篇文章,主要介绍itext7操作PDF文档之创建PDF文档、加载PDF文档、添加空白页、操作PDF页面、itext中的常见类及其方法。 目录 一、itext7操作PDF 1.1、itext7介绍 1.2、引入itext-core依赖 1.3、创建PDF文档 1.4、加载PDF文档 1.5、操作PDF页面 1.6、添加空白页面 二、itext常见类和方法 2.1、

    2024年02月16日
    浏览(47)
  • Spire.PDF for .NET【文档操作】演示:合并 PDF 文件并添加页码

    需要合并 PDF 的原因有很多。例如,合并 PDF 文件允许您打印单个文件,而不是为打印机排队多个文档,组合相关文件通过减少要搜索和组织的文件数量来简化管理和存储多个文档的过程。在本文中,您将学习如何使用Spire.PDF for .NET将多个 PDF 文档合并为一个 PDF 文档,以及如

    2024年04月09日
    浏览(80)
  • java中pdfbox处理pdf常用方法(读取、写入、合并、拆分、写文字、写图片)

    方法代码: 测试用例: 2.1写文字 方法代码: 测试用例: A.pdf: A2.pdf: 2.2写图片 方法代码: 测试用例: A.pdf: pic.jpg: A2.pdf: 方法代码: 测试用例: 方法代码: 测试用例: 引用链接: (17条消息) 使用Apache PDFBox实现拆分、合并PDF_似有风中泣的博客-CSDN博客 (17条消息) Java使用P

    2024年02月11日
    浏览(128)
  • Java给PDF文档添加水印信息

            在word生成pdf后,或者上传pdf文件,用户希望给pdf文档添加水印信息,具体代码如下   一. 首先pom中需要引入 核心代码如下,写在某个 service 下面 用到的实体类  方法测试

    2024年02月09日
    浏览(48)
  • 使用itext7为pdf文档添加水印

    iText7是一款功能强大的开源PDF处理库,用于创建、编辑和处理PDF文档。相比于iTextSharp,iText7具有更先进的功能和更好的性能。 添加水印是iText7的一个常见应用场景。水印可以用于保护文档的版权,标识文档的状态或来源等。使用iText7添加水印可以通过以下步骤实现: 导入

    2024年04月22日
    浏览(37)
  • 如何通过C++ 给PDF文档添加文字水印

    因PDF文档具有较好的稳定性和兼容性,现在越来越多的合同、研究论文、报告等都采用PDF格式。为了进一步保护这些重要文档内容免受未经授权的复制或使用,我们可以添加水印以表明其状态、所有权或用途。针对工作中可能出现的在 C++ 应用程序中给 PDF 文档添加文字水印的

    2024年02月05日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包