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



    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


    依赖

            
            <dependency>
                <groupId>com.itextpdfgroupId>
                <artifactId>itext7-coreartifactId>
                <version>7.2.3version>
                <type>pomtype>
            dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    官方示例


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

    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();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11


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

    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();
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    多图合并成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);
        }
    
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67

    在这里插入图片描述



    在这里插入图片描述

  • 相关阅读:
    React 模态框的设计(七)整合与测试
    java基础学习总结
    前端 JS 经典:浏览器中 ESModule 的工作原理
    站在QA的角度浅谈软件测试流程
    推荐一款.NET开源跨平台的开箱即用的DNS服务器软件
    数据结构--7.2.1排序算法(冒泡、直接选择、直接插入)
    Spring概述
    用中文编程工具编写的代码实现如图所示效果,请分享一下用你所学的编程语言写下这个代码,大家一起交流学习
    【Exploit trick】利用poll_list对象构造kmalloc-32任意释放 (corCTF 2022-CoRJail)
    多路由复用页面组件问题
  • 原文地址:https://blog.csdn.net/weixin_39651356/article/details/126679630