PDFUtil(PDF加水印,图片转PDF,PDF转图片)

<!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf -->
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.5.13</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.itextpdf/itext-asian -->
        <!--中文乱码-->
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext-asian</artifactId>
            <version>5.2.0</version>
        </dependency>
        <dependency>
            <groupId>com.itextpdf.tool</groupId>
            <artifactId>xmlworker</artifactId>
            <version>5.5.13</version>
        </dependency>

        <!-- pdf转图片 -->
        <dependency>
            <groupId>org.icepdf.os</groupId>
            <artifactId>icepdf-core</artifactId>
            <version>6.1.2</version>
        </dependency>
        


    <repositories>
        <repository>
            <id>com.e-iceblue</id>
            <url>http://repo.e-iceblue.cn/repository/maven-public/</url>
        </repository>
    </repositories>

package mirror.utils;


import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;
import mirror.file.FileList;
import org.icepdf.core.util.GraphicsRenderingHints;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.*;
import java.util.ArrayList;


/**
 * @Author: hekaikai
 * @Date: 2020/10/30 10:43
 */
public class PDFUtil {


    public static void main(String[] args) throws Exception {
        //PDF加水印
//        String pdfPath="D:\\workspace\\idea\\MirrorWeb\\target\\MirrorWeb-1.0-SNAPSHOT\\WEB-INF\\classes\\pdf\\a.pdf";
//        String resultPath="D:\\workspace\\idea\\MirrorWeb\\target\\MirrorWeb-1.0-SNAPSHOT\\WEB-INF\\classes\\pdf\\resultFile.pdf";
//        String imgPath="D:\\workspace\\idea\\MirrorWeb\\target\\MirrorWeb-1.0-SNAPSHOT\\WEB-INF\\classes\\kai.png";
//        waterMarkText(pdfPath,resultPath,"和凯凯:www.alivecaren.com");
//        waterMarkPicture(pdfPath,resultPath,imgPath);

        //图片转PDF
//        ArrayList<String> imageUrllist = new ArrayList<String>();
//        imageUrllist.add("D:\\test\\a.jpg");
//        imageUrllist.add("D:\\test\\b.jpg");
//        imageUrllist.add("D:\\test\\c.jpg");
//        imageUrllist.add("D:\\test\\d.jpg");
//        String pdfUrl = "D:\\test\\test.pdf";
//        Pdf(imageUrllist,pdfUrl);

        //PDF转图片
//        String pdfPath="D:\\workspace\\idea\\MirrorWeb\\target\\MirrorWeb-1.0-SNAPSHOT\\WEB-INF\\classes\\pdf\\a.pdf";
//        String path="D:\\test\\alive\\";
//        pdf2Pic(pdfPath,path,"aliveCaren");


    }

    /**
     * 给pdf文件加文字水印
     * @param inputFile 源文件路径
     * @param outputFile 输出文件路径
     * @param waterMarkName 水印内容
     * @return
     */
    public static boolean waterMarkText(String inputFile,String outputFile, String waterMarkName) {
        try {
            PdfReader reader = new PdfReader(inputFile);
            PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(outputFile));
            //设置生成的PDF,需要密码才能编辑
            stamper.setEncryption(null, "123".getBytes(), PdfWriter.ALLOW_ASSEMBLY, false);
            //这里的字体设置比较关键,这个设置是支持中文的写法
            BaseFont base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);
            int total = reader.getNumberOfPages() + 1;

            PdfContentByte under;
            Rectangle pageRect = null;
            for (int i = 1; i < total; i++) {
                pageRect = stamper.getReader().
                        getPageSizeWithRotation(i);
                // 计算水印X,Y坐标
                float x = 290;//pageRect.getWidth() / 2;
                float y = 400;//pageRect.getHeight() / 2;
                // 获得PDF最顶层
                under = stamper.getOverContent(i);//在内容上方加水印
                //under = stamper.getUnderContent(i);// 在内容下方加水印
                under.saveState();
                // set Transparency
                PdfGState gs = new PdfGState();
                // 设置透明度范围为0到1
                gs.setFillOpacity(0.3f);
                under.setGState(gs);
                under.beginText();
                under.setFontAndSize(base, 35);//字体大小
                under.setColorFill(BaseColor.BLACK);//字体颜色
                // 水印文字成45度角倾斜
                under.showTextAligned(Element.ALIGN_CENTER, waterMarkName, x, y, 45);
                // 添加水印文字
                under.endText();
                under.setLineWidth(1f);
                under.stroke();
            }
            stamper.close();
            reader.close();
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }


    /**
     * 给pdf文件加图片水印
     * @param inputFile 源文件路径
     * @param outputFile 输出文件路径
     * @param imagePath 图片路径
     * @return
     */
    public static boolean waterMarkPicture(String inputFile,String outputFile, String imagePath) {
        try {
            PdfReader reader = new PdfReader(inputFile);
            PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(outputFile));
            //设置生成的PDF,需要密码才能编辑
            stamper.setEncryption(null, "123".getBytes(), PdfWriter.ALLOW_ASSEMBLY, false);
            int total = reader.getNumberOfPages() + 1;
            PdfContentByte under;
            Rectangle pageRect = null;
            for (int i = 1; i < total; i++) {
                pageRect = stamper.getReader().
                        getPageSizeWithRotation(i);
                // 计算水印X,Y坐标
                float x = 290;//pageRect.getWidth() / 2;
                float y = 400;//pageRect.getHeight() / 2;
                // 获得PDF最顶层
                under = stamper.getOverContent(i);//在内容上方加水印
                //under = stamper.getUnderContent(i);// 在内容下方加水印
                under.saveState();
                // set Transparency
                PdfGState gs = new PdfGState();
                // 设置透明度范围为0到1
                gs.setFillOpacity(0.3f);
                under.setGState(gs);
                under.beginText();

                Image image = Image.getInstance(imagePath);
                // 设置坐标 绝对位置 X Y
                image.setAbsolutePosition(200, 300);
                // 设置旋转弧度
                image.setRotation(30);// 旋转 弧度
                // 设置旋转角度
                image.setRotationDegrees(45);// 旋转 角度
                // 设置等比缩放
                image.scalePercent(90);// 依照比例缩放
                // image.scaleAbsolute(200,100);//自定义大小
                // 设置透明度
                under.setGState(gs);
                // 添加水印图片
                under.addImage(image);
                // 设置透明度
                under.setGState(gs);

                //结束设置
                under.endText();
                under.stroke();
            }
            stamper.close();
            reader.close();
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }


    /**
     * 图片集合转PDF
     * @param imageUrllist
     * @param mOutputPdfFileName
     * @return
     */
    public static File Pdf(ArrayList<String> imageUrllist, String mOutputPdfFileName) {

        Document doc = new Document(PageSize.A4, 20, 20, 20, 20);
        try {
            PdfWriter
                    .getInstance(doc, new FileOutputStream(mOutputPdfFileName));
            doc.open();
            for (int i = 0; i < imageUrllist.size(); i++) {
                doc.newPage();
                BaseFont base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);
                Paragraph paragraph = new Paragraph();
                paragraph.setFont(new Font(base));
                paragraph.add("简单使用iText哈哈哈oasdf");
                doc.add(paragraph);

                Image png1 = Image.getInstance(imageUrllist.get(i));
                float heigth = png1.getHeight();
                float width = png1.getWidth();
                int percent = getPercent2(heigth, width);
                png1.setAlignment(Image.MIDDLE);
                png1.scalePercent(percent+3);// 表示是原来图像的比例;
                doc.add(png1);
            }
            doc.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (DocumentException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        File mOutputPdfFile = new File(mOutputPdfFileName);
        if (!mOutputPdfFile.exists()) {
            mOutputPdfFile.deleteOnExit();
            return null;
        }
        return mOutputPdfFile;
    }

    /**
     * 第一种解决方案 在不改变图片形状的同时,判断,如果h>w,则按h压缩,否则在w>h或w=h的情况下,按宽度压缩
     */
    public static int getPercent(float h, float w) {
        int p = 0;
        float p2 = 0.0f;
        if (h > w) {
            p2 = 297 / h * 100;
        } else {
            p2 = 210 / w * 100;
        }
        p = Math.round(p2);
        return p;
    }

    /**
     * 第二种解决方案,统一按照宽度压缩 这样来的效果是,所有图片的宽度是相等的,自我认为给客户的效果是最好的
     */
    public static int getPercent2(float h, float w) {
        int p = 0;
        float p2 = 0.0f;
        p2 = 530 / w * 100;
        p = Math.round(p2);
        return p;
    }

    /**
     * PDF 转图片
     * @param pdfPath
     * @param path 放图片的文件夹
     * @param fileName 每一个图片的名称
     * @throws Exception
     */
    public static void pdf2Pic(String pdfPath, String path, String fileName) throws Exception {
        org.icepdf.core.pobjects.Document document = new org.icepdf.core.pobjects.Document();
        document.setFile(pdfPath);
        //缩放比例
        float scale = 2.5f;
        //旋转角度
        float rotation = 0f;
        for (int i = 0; i < document.getNumberOfPages(); i++) {
            BufferedImage image = (BufferedImage)
                    document.getPageImage(i, GraphicsRenderingHints.SCREEN, org.icepdf.core.pobjects.Page.BOUNDARY_CROPBOX, rotation, scale);
            RenderedImage rendImage = image;
            try {
                File fileDir = new File(path);
                if (!fileDir.exists()) {
                    fileDir.mkdirs();
                }
                String imgName = fileName + i + ".png";
                File file = new File(path + imgName);
                ImageIO.write(rendImage, "png", file);
            } catch (IOException e) {
                e.printStackTrace();
            }
            image.flush();
        }
        document.dispose();
    }




}



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值