iText 7操作pdf简单应用

iText简单demo

iText 7官网
(代码是从官网搬过来略做修改)
在这里插入图片描述
简单介绍两句,iText 主要是对pdf进行操作,下面两个demo主要是简单生成pdf和在pdf中插入水印(图片水印和文字水印),其他功能以后有空再看,感兴趣的可以上官网看看,示例更多。
废话不多说,直接上代码

一、maven依赖

	<properties>
        <itext.version>7.1.12</itext.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>kernel</artifactId>
            <version>${itext.version}</version>
        </dependency>
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>io</artifactId>
            <version>${itext.version}</version>
        </dependency>
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>layout</artifactId>
            <version>${itext.version}</version>
        </dependency>
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>forms</artifactId>
            <version>${itext.version}</version>
        </dependency>
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>pdfa</artifactId>
            <version>${itext.version}</version>
        </dependency>
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>pdftest</artifactId>
            <version>${itext.version}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.18</version>
        </dependency>
        <dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>pdfbox</artifactId>
            <version>2.0.9</version>
        </dependency>
    </dependencies>

二、demo代码

简单生成pdf

package com.desolo.demo;

import com.itextpdf.io.image.ImageDataFactory;
import com.itextpdf.kernel.colors.DeviceGray;
import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.kernel.pdf.xobject.PdfFormXObject;
import com.itextpdf.layout.Canvas;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Image;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.property.TextAlignment;

import java.io.File;
import java.io.IOException;

public class HelloPdf {

    public static final String DEST = "D:/test/itext/chapter01/hello_world.pdf";

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

    public void createPdf(String dest) throws IOException {
        //Initialize PDF writer
        PdfWriter writer = new PdfWriter(dest);

        //Initialize PDF document
        PdfDocument pdf = new PdfDocument(writer);

        // Initialize document
        Document document = new Document(pdf);

        //Add paragraph to the document
        for(int i = 0;i<51;i++){
            document.add(new Paragraph("Hello World!*****************************AAAAAAAAAAAAAAAAAAAAAAA*************************"+i));
        }
        
//插入图片
/**
	Image(ImageDataFactory.create("D:\\img\\car.jpg")), "Bruno"))
	Image参数为图片和水印内容
	这边水印不支持中文,想要支持中文的话看下面的demo,需要引入字体库,可能		还有其它解决方案,需要试试
*/
        document.add(getWatermarkedImage(pdf, new Image(ImageDataFactory.create("D:\\img\\car.jpg")), "Bruno"));
//        Document doc = new Document(pdfDoc);

        document.add(getWatermarkedImage(pdf, new Image(ImageDataFactory.create("D:\\img\\dog.bmp")), "dog"));

        document.add(getWatermarkedImage(pdf, new Image(ImageDataFactory.create("D:img\\logo.png")), "logo"));

        Image image = new Image(ImageDataFactory.create("D:\\img\\senator.jpg"));

        image.scaleToFit(400, 700);

        document.add(getWatermarkedImage(pdf, image, "Bruno and Ingeborg"));

        //Close document
        document.close();
    }

    public Image getWatermarkedImage(PdfDocument pdfDoc, Image img, String watermark) {

        float width = img.getImageScaledWidth();

        float height = img.getImageScaledHeight();

        PdfFormXObject template = new PdfFormXObject(new Rectangle(width, height));

        new Canvas(template, pdfDoc).

                add(img).

                setFontColor(DeviceGray.BLACK).//setFont(PdfFont.).

                showTextAligned(watermark, width / 2, height / 2, TextAlignment.CENTER, (float) Math.PI / 6);

        return new Image(template);

    }


}

生成水印(图片和文字)

package com.desolo.demo;

import com.itextpdf.io.font.PdfEncodings;
import com.itextpdf.io.image.ImageData;
import com.itextpdf.io.image.ImageDataFactory;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfPage;
import com.itextpdf.kernel.pdf.PdfReader;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.kernel.pdf.canvas.PdfCanvas;
import com.itextpdf.kernel.pdf.extgstate.PdfExtGState;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.property.TextAlignment;
import com.itextpdf.layout.property.VerticalAlignment;

import java.io.File;

public class ImgBakTest {
    public static final String DEST = "D:\\test\\itext\\dest.pdf";
    public static final String IMG = "D:\\test\\img\\test.png";
    public static final String SRC = "D:\\test\\itext\\test.pdf";
    public static final String FONT = "D:\\test\\itext\\SIMHEI.TTF";

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

        new ImgBakTest().manipulatePdf(DEST);
    }

    protected void manipulatePdf(String dest) throws Exception {
        PdfDocument pdfDoc = new PdfDocument(new PdfReader(SRC), new PdfWriter(dest));
        Document doc = new Document(pdfDoc);
//        PdfFont font = PdfFontFactory.createFont(StandardFonts.HELVETICA);
        PdfFont font = PdfFontFactory.createFont(FONT, PdfEncodings.IDENTITY_H, false);
        //没有字体库的话用上面注释掉的即可,只是不支持中文
        Paragraph paragraph = new Paragraph("My watermark (中文)")
                .setFont(font)
                .setFontSize(30);
        ImageData img = ImageDataFactory.create(IMG);

        float w = img.getWidth();
        float h = img.getHeight();

        PdfExtGState gs1 = new PdfExtGState().setFillOpacity(0.5f);

        // Implement transformation matrix usage in order to scale image
        for (int i = 1; i <= pdfDoc.getNumberOfPages(); i++) {

            PdfPage pdfPage = pdfDoc.getPage(i);
            Rectangle pageSize = pdfPage.getPageSizeWithRotation();

            // When "true": in case the page has a rotation, then new content will be automatically rotated in the
            // opposite direction. On the rotated page this would look as if new content ignores page rotation.
            pdfPage.setIgnorePageRotationForContent(true);

            float x = (pageSize.getLeft() + pageSize.getRight()) / 2;
            float y = (pageSize.getTop() + pageSize.getBottom()) / 2;
            PdfCanvas over = new PdfCanvas(pdfDoc.getPage(i));
            over.saveState();
            over.setExtGState(gs1);
//            if (i % 2 == 1) {
//                doc.showTextAligned(paragraph, x, y, i, TextAlignment.CENTER, VerticalAlignment.TOP, 0);
//            } else {
                over.addImageWithTransformationMatrix(img, w, 0, 0, h, x - (w / 2), y - (h / 2), false);
//                over.addImage(img, w, 0, 0, h, x - (w / 2), y - (h / 2), false);
//            }
			/**
				这边发现将生成图片水印和文字水印的放一起,会在图片水印上也能看见文字水印,这是我这边实现的一个需求,图片水印上加文字水印。
			*/
            over.addImage(img, w, 0, 0, h, x - (w / 2), y - (h / 2), false);
            doc.showTextAligned(paragraph, x, y, i, TextAlignment.CENTER, VerticalAlignment.TOP, 0);
            over.restoreState();
        }
        doc.close();
    }
}

end…告辞…
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
itext7是一个用于创建和处理PDF文件的开源库。它可以通过编程方式对PDF文件进行各种操作,包括去除文本水印。 要去除PDF文本水印,我们可以使用itext7的文本提取功能来获取PDF页面上的所有文本内容。然后,我们可以检查每个提取的文本字符串,找到包含水印文本的行,并将其删除或替换。 以下是一个简单的实现示例: 1. 导入相关的itext7库: import com.itextpdf.kernel.pdf.PdfDocument; import com.itextpdf.kernel.pdf.PdfReader; import com.itextpdf.kernel.pdf.PdfWriter; import com.itextpdf.layout.Document; import com.itextpdf.layout.element.Paragraph; 2. 加载带有水印的PDF文件: PdfDocument pdfDocument = new PdfDocument(new PdfReader("input.pdf"), new PdfWriter("output.pdf")); Document document = new Document(pdfDocument); String watermarkText = "水印文本"; 3. 使用文本提取功能获取PDF页面上的所有文本内容: String extractedText = document.getPdfDocument().getPage(1).getPdfObject().toString(); 4. 检查提取的文本字符串并将包含水印文本的行删除或替换: String[] lines = extractedText.split("\\n"); for (int i = 0; i < lines.length; i++) { if (lines[i].contains(watermarkText)) { lines[i] = ""; // or replace with desired text } } 5. 将修改后的文本重新写入PDF文档: Paragraph modifiedText = new Paragraph(String.join("\n", lines)); document.add(modifiedText); document.close(); 6. 最后,保存并关闭PDF文档: pdfDocument.close(); 通过以上步骤,我们可以使用itext7库去除PDF文本水印。请注意,这只是一个简单的示例,实际应用中可能需要更详细的处理逻辑来解决各种复杂情况。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值