← 返回文章

PDF 中嵌入图片

使用 IText7 库 在 PDF 中嵌入图片

介绍

IText 7 处理 dpf 非常强大。有非常多实用的功能。目前的需求是在 pdf 中嵌入一张 六维图。 参考了 IText7 中的部分示例,实现了这个功能,在此记录一下。

代码

import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.io.image.ImageDataFactory;
import com.itextpdf.layout.element.Image;
import com.itextpdf.kernel.pdf.PdfReader;
import java.io.File;

public class SimpleTable {  
    public static final String IMG1 = "./src/main/resources/123.jpg";  // 将要嵌入的图片的地址
    public static final String DEST = "results/result.pdf";    // 最终合成的 pdf 的地址
    public static final String SRC = "results/data.pdf";   // 原 pdf 的地址

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

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

        // 导入图片,设置图片的宽和高,设置图片的相对位置
        Image image = new Image(ImageDataFactory.create(IMG1)).scaleAbsolute(100, 100).setFixedPosition(1, 250, 100);

        doc.add(image);
        pdfDoc.close();
    }

原理

在写完之后,发现原理非常简单。 Itext7 是不能直接在原 pdf 上直接嵌入图片的。 按我的理解(没有深入看源码),它是将原 pdf 中的数据获取出来,然后添加上嵌入的 图片 数据,最终输出到一个新的 pdf 文件中。

还有一个特殊点,在于设置图片在 pdf 中的相对位置,竟然是在 new Image 的时候进行设置。而不是在 doc.add 的时候设置。

疑惑点

  1. 设置图片在 pdf 的相对位置。
  2. 为什么不能直接在原 pdf 上嵌入图片

END