Java 使用itextPdf7操作pdf,写入照片这一篇就够了

Posted 程序媛一枚~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 使用itextPdf7操作pdf,写入照片这一篇就够了相关的知识,希望对你有一定的参考价值。

itextPdf已更新到7,本文将走入最新的itextpdf 7教程

这篇博客将介绍如何使用itextPdf7在pdf中插入图片,包括插入N*M的图片、图片重叠、一张接一张图像、相邻图像、图片与文字相邻、一个单元格多图像、单元格多图片与文字并存、单元格多块内容、单元格中复杂文本图片位置设置。

1. 效果图

1.1 M*N列图片(无边界&有边界)

生成5行4列图片的PDF,有边界框效果图如下:

生成5行4列图片的PDF,无边界框效果图如下:

1.2 图片重叠

图片重叠

1.3 文字背景图片

1.4 图片与文字相邻 & 图片文字Rowspan样式


图片与文字同一行,RowSpan样式:

1.5 一个单元格多图片 & 多图片文本内容

一个单元格多图片

一个单元格中多块内容(图片&空格或者文字多次叠加)

单元格中多块内容

1.6 单元格中文本图片位置设置

单元格中文本图片位置设置

单元格中文本图片位置复杂设置:

2. 源代码

2.0 maven pom配置

	 <dependencies>
			 <!--创建itextpdf7-->
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>pdftest</artifactId>
            <version>7.2.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>kernel</artifactId>
            <version>7.2.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>layout</artifactId>
            <version>7.2.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

    <repositories>
        <repository>
            <releases>
                <enabled>false</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
            <id>itext-snapshot</id>
            <name>iText Repository - snapshots</name>
            <url>https://repo.itextsupport.com/snapshot</url>
        </repository>
        <repository>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
            <id>itext-releases</id>
            <name>iText Repository - releases</name>
            <url>https://repo.itextsupport.com/releases</url>
        </repository>
        <repository>
            <releases>
                <enabled>false</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
            <id>apache.snapshots</id>
            <name>Apache Development Snapshot Repository</name>
            <url>https://repository.apache.org/content/repositories/snapshots/</url>
        </repository>
    </repositories>

2.1 M*N图片(有边界 & 无边界)

package com.ocr.itepdf;

import com.itextpdf.io.image.ImageDataFactory;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.borders.Border;
import com.itextpdf.layout.element.Cell;
import com.itextpdf.layout.element.Image;
import com.itextpdf.layout.element.Table;
import com.itextpdf.layout.properties.HorizontalAlignment;
import com.itextpdf.layout.properties.UnitValue;
import com.itextpdf.layout.properties.VerticalAlignment;

import java.io.File;
import java.net.MalformedURLException;

public class ImagesNextToEachOther {
    public static final String DEST = "E:\\\\mat\\\\itepdf\\\\image_next_to_each_other2.pdf";

    public static final String IMG1 = "D:\\\\20210905\\\\images\\\\ml.jpg";
    public static final String IMG2 = "D:\\\\20210905\\\\images\\\\circle.png";

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

        new ImagesNextToEachOther().manipulatePdf(DEST);
    }

    protected void manipulatePdf(String dest) throws Exception {
        PdfDocument pdfDoc = new PdfDocument(new PdfWriter(dest));
        Document doc = new Document(pdfDoc);

        int col = 4; // 图片列
        int row = 5; // 图片行
        Table table = new Table(UnitValue.createPercentArray(col)).useAllAvailableWidth();

        for (int i = 0; i < row; i++) {
            for (int j = 0; j < col; j++) {
                if (j % 2 == 0) {
                    table.addCell(createImageCell(IMG1));
                } else {
                    table.addCell(createImageCell(IMG2));
                }
            }
        }

        doc.add(table);
        doc.close();
    }

    private static Cell createImageCell(String path) throws MalformedURLException {
        Image img = new Image(ImageDataFactory.create(path));

        // 设置图片自动缩放,img.setAutoScale(true)
        // 设置图片宽度 img.setWidth
        // 设置cell宽度、高度 setWidth
        // 设置cell无边界框 setBorder
        // 设置水平、垂直对其方式 setHorizontalAlignment、setVerticalAlignment
        return new Cell().add(img.setAutoScale(true).setWidth(UnitValue.createPercentValue(100)))
//                .setWidth(50)
//                .setHeight(50)
                .setBorder(Border.NO_BORDER)
                .setHorizontalAlignment(HorizontalAlignment.CENTER)
                .setVerticalAlignment(VerticalAlignment.MIDDLE);
    }
}

2.2 图片重叠

[图片重叠](https://github.com/seminar2012/i7js-examples/blob/develop/src/main/java/com/itextpdf/samples/sandbox/tables/AddOverlappingImage.java)

2.3 文字背景图片

[文字背景图片](https://github.com/seminar2012/i7js-examples/blob/develop/src/main/java/com/itextpdf/samples/sandbox/tables/ImageBackground.java)

2.4 图片与文字相邻 & 图片文字Rowspan样式

图片与文字相邻 & 图片文字Rowspan样式

2.5 一个单元格多图片 & 多图片文本内容

表格多图片与文字并存

一个单元格多图片

2.6 单元格中文本图片位置设置

单元格中文本图片位置设置

参考

以上是关于Java 使用itextPdf7操作pdf,写入照片这一篇就够了的主要内容,如果未能解决你的问题,请参考以下文章

在 java 中转换 PDF 文件版本(不仅是标题版本!)

java如何创建pdf文件,并将数据库数据写入pdf

在java中将HTML表格写入PDF [重复]

Java编辑PDF写入文字 插入图片

百度文库的实现——java利用openoffice,word转pdf

如何将 ResponseBody(在我的情况下为 PDF)写入外部存储? java.lang.IllegalStateException 的问题:已关闭