1. 程式人生 > 其它 >iText 7操作pdf簡單應用

iText 7操作pdf簡單應用

技術標籤:文件操作工具java

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…告辭…
在這裡插入圖片描述