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

50 篇文章 2 订阅
8 篇文章 1 订阅

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 单元格中文本图片位置设置

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

参考

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Java使用ItextPdf填充已有的PDF表格并且分页,需要使用ItextPdfPdfReader和PdfStamper类。 首先,需要创建一个PdfReader对象来读取原始PDF文件。然后,需要创建一个PdfStamper对象来写入新的内容。接下来,使用PdfStamper对象的getAcroFields方法获取表单字段列表,并使用setField方法设置表单字段的值。如果表单需要分页,可以使用PdfStamper的insertPage方法插入新的页面,然后使用addAnnotation方法添加表单字段到新的页面。 以下是一个示例代码: ```java PdfReader reader = new PdfReader("original.pdf"); PdfStamper stamper = new PdfStamper(reader, new FileOutputStream("filled.pdf")); AcroFields form = stamper.getAcroFields(); // Set field values form.setField("name", "John Doe"); form.setField("address", "123 Main St."); // Insert new page for additional fields stamper.insertPage(2, reader.getPageSize(1)); PdfContentByte cb = stamper.getOverContent(2); // Add additional fields to new page TextField tf = new TextField(stamper.getWriter(), new Rectangle(100, 100, 200, 200), "newField"); PdfFormField field = tf.getTextField(); cb.addAnnotation(field, 2); stamper.close(); reader.close(); ``` 在这个示例中,我们读取了名为"original.pdf"的原始PDF文件,并创建了一个名为"filled.pdf"的新PDF文件。我们使用PdfStamper对象的getAcroFields方法获取表单字段列表,并使用setField方法设置表单字段的值。我们还使用insertPage方法在第二页插入了一个新页面,并使用addAnnotation方法添加了一个新的表单字段到新页面。 注意,PdfStamper对象必须在完成后关闭,以便将所有更改写入新的PDF文件。同样,PdfReader对象也需要在完成后关闭。 希望这可以帮助你开始使用ItextPdf填充已有的PDF表格并且分页。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序媛一枚~

您的鼓励是我创作的最大动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值