代码 – 多张图片合并成PDF(每页宽高即是当前页面图片的宽高)- itextpdf

导读:本篇文章讲解 代码 – 多张图片合并成PDF(每页宽高即是当前页面图片的宽高)- itextpdf,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

1. 多张图片转成PDF(每页PDF的宽高是当前页面图片的宽高)

7.2.3版本

文档(创建多页自定义宽高页面): https://kb.itextpdf.com/home/it7kb/faq/how-to-create-a-document-with-unequal-page-sizes

图片(页面放置大图片): https://kb.itextpdf.com/home/it7kb/faq/how-to-create-a-document-with-unequal-page-sizes


依赖

        <!-- https://mvnrepository.com/artifact/com.itextpdf/itext7-core -->
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext7-core</artifactId>
            <version>7.2.3</version>
            <type>pom</type>
        </dependency>
官方示例


创建多页自定义宽高页面(官方示例代码)

PdfDocument pdf = new PdfDocument(new PdfWriter(dest));
Rectangle one = new Rectangle(70,140);
Rectangle two = new Rectangle(700,400);
Document document = new Document(pdf, new PageSize(one));
document.setMargins(2, 2, 2, 2);
Paragraph p = new Paragraph("Hi");
document.add(p);
document.add(new AreaBreak(new PageSize(two)));
document.setMargins(20, 20, 20, 20);
document.add(p);
document.close();


页面放置大图片(官方示例代码)

package com.itextpdf.samples.sandbox.images;

import com.itextpdf.kernel.geom.PageSize;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.kernel.pdf.PdfReader;
import com.itextpdf.kernel.pdf.PdfDictionary;
import com.itextpdf.kernel.pdf.PdfName;
import com.itextpdf.kernel.pdf.PdfStream;
import com.itextpdf.kernel.pdf.xobject.PdfImageXObject;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Image;

import java.io.File;

public class LargeImage1 {
    public static final String DEST = "./target/sandbox/images/large_image1.pdf";

    public static final String SRC = "./src/main/resources/pdfs/large_image.pdf";

    public static void main(String[] args) throws Exception {
        File file = new File(DEST);
        file.getParentFile().mkdirs();

        new LargeImage1().manipulatePdf(DEST);
    }

    protected void manipulatePdf(String dest) throws Exception {
        PdfDocument resultDoc = new PdfDocument(new PdfWriter(dest));
        PdfDocument srcDoc = new PdfDocument(new PdfReader(SRC));

        // Assume that there is a single XObject in the source document
        // and this single object is an image.
        PdfDictionary pageDict = srcDoc.getFirstPage().getPdfObject();
        PdfDictionary pageResources = pageDict.getAsDictionary(PdfName.Resources);
        PdfDictionary pageXObjects = pageResources.getAsDictionary(PdfName.XObject);
        PdfName imgRef = pageXObjects.keySet().iterator().next();
        PdfStream imgStream = pageXObjects.getAsStream(imgRef);
        PdfImageXObject imgObject = new PdfImageXObject((PdfStream) imgStream.copyTo(resultDoc));
        Image image = new Image(imgObject);
        image.scaleToFit(14400, 14400);
        image.setFixedPosition(0, 0);

        srcDoc.close();

        PageSize pageSize = new PageSize(image.getImageScaledWidth(), image.getImageScaledHeight());
        Document doc = new Document(resultDoc, pageSize);
        doc.add(image);

        doc.close();
    }
}

多图合并成PDF


基于上述两个官方Demo进行代码合并-从而支持多张图片合并PDF

package work.linruchang;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.io.FileUtil;
import com.itextpdf.io.image.ImageDataFactory;
import com.itextpdf.kernel.geom.PageSize;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.AreaBreak;
import com.itextpdf.layout.element.Image;
import lombok.SneakyThrows;

import java.io.File;
import java.util.List;

/**
 * @author LinRuChang
 * @version 1.0
 * @date 2022/09/03
 * @since 1.8
 **/
public class OthreTest2 {


    @SneakyThrows
    public static Image toItexImage(File imageFile) {
        return new Image(ImageDataFactory.create(imageFile.getAbsolutePath()));
    }

    @SneakyThrows
    public static File imagesToPdf(List<File> imageFiles, File targetPdfFilePath) {
        if (CollUtil.isNotEmpty(imageFiles) && targetPdfFilePath != null) {
            // 创建PDF实例
            PdfWriter pdfWriter = new PdfWriter(targetPdfFilePath);
            // 管理跟踪、添加的内容
            PdfDocument pdfDocument = new PdfDocument(pdfWriter);

            File firstImageFile = CollUtil.getFirst(imageFiles);
            Image firstImage = toItexImage(firstImageFile);
            Document document = new Document(pdfDocument, new PageSize(Convert.toFloat(firstImage.getImageWidth()), Convert.toFloat(firstImage.getImageHeight())));
            document.add(firstImage);

            List<File> removeFirstImageList = CollUtil.removeAny(imageFiles, firstImageFile);
            removeFirstImageList.stream()
                    .map(OthreTest2::toItexImage)
                    .forEachOrdered(image -> {
                        document.add(new AreaBreak(new PageSize(Convert.toFloat(image.getImageWidth()), Convert.toFloat(image.getImageHeight()))));
                        document.setMargins(10, 10, 10, 10);
                        document.add(image);
                    });

            document.close();
            return targetPdfFilePath;
        }
        return null;
    }

    public static void main(String[] args) {
        List<File> imagesFiles = CollUtil.list(false, FileUtil.file("D:\\截图3\\合并截图0-版权信息.jpg"), FileUtil.file("D:\\截图3\\合并截图1-小桥老树致微信读书朋友的一封信+独家视频.jpg"));
        File resultPdf = FileUtil.file("D:\\截图3\\test.pdf");
        imagesToPdf(imagesFiles, resultPdf);
    }


}

在这里插入图片描述



在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/46348.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!