zoukankan      html  css  js  c++  java
  • Itext5常用操作

    Itext

    官网

    Maven坐标

    <properties>
        <itextpdf.version>5.5.6</itextpdf.version>
    </properties>
    
    <dependencies>
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>${itextpdf.version}</version>
        </dependency>
        <dependency>
            <groupId>com.itextpdf.tool</groupId>
            <artifactId>xmlworker</artifactId>
            <version>${itextpdf.version}</version>
        </dependency>
        <!--中文支持-->
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext-asian</artifactId>
            <version>5.2.0</version>
        </dependency>
    </dependencies>
    

    Java代码

    常用

    块、短语、段落、图片、超链接等对象

    [官网](https://itextpdf.com/en)
    
    ## Maven坐标
    
    ​```xml
    <properties>
        <itextpdf.version>5.5.6</itextpdf.version>
    </properties>
    
    <dependencies>
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>${itextpdf.version}</version>
        </dependency>
        <dependency>
            <groupId>com.itextpdf.tool</groupId>
            <artifactId>xmlworker</artifactId>
            <version>${itextpdf.version}</version>
        </dependency>
        <!--中文支持-->
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext-asian</artifactId>
            <version>5.2.0</version>
        </dependency>
    </dependencies>
    

    Java代码

    常用

    块、短语、段落、图片、超链接等对象

    //new一个Document对象,设置纸张大小
    Document document = new Document(PageSize.A4);
    //解析器
    PdfWriter writer= PdfWriter.getInstance(document, new FileOutputStream("D://pdfText.pdf"));
    //添加PDF属性
    /*document.addAuthor("作者");
    document.addTitle("标题");
    document.addSubject("主题");
    document.addKeywords("关键字");*/
    /*页边距*/
    document.setMargins(10, 20, 30, 40);
    
    //打开document
    document.open();
    
    /***添加新段落***/
    document.add(new Paragraph("Hello world"));  //英文段落添加成功
    //字体的设置,如颜色,字体,大小等
    Font titlefontChinese = new Font(bfChinese, 22, Font.BOLD, BaseColor.BLACK);
    Paragraph title_hmc = new Paragraph("添加中文段落",titlefontChinese);
    title_hmc.setAlignment(Element.ALIGN_CENTER);
    title_hmc.setSpacingBefore(30f);
    title_hmc.setSpacingAfter(20f);
    document.add(title_hmc);  //中文段落添加成功
    
    
    //添加新的空白页
    document.newPage();
    writer.setPageEmpty(true); //显示空白页
    
    /*Chunk:块对象,可配置字符间距、字符+背景色、背景色的矩形大小可任意调整*/
    document.newPage();
    document.add(new Chunk("中文输出: ", getChineseFont()));
    Chunk tChunk2 = new Chunk("输出的内容", getChineseFont());
    tChunk2.setBackground(BaseColor.CYAN, 1f, 0.5f, 1f, 1.5f); // 设置背景色
    tChunk2.setTextRise(6); // 上浮
    tChunk2.setUnderline(0.2f, -2f); // 下划线
    document.add(tChunk2);
    document.add(Chunk.NEWLINE); // 新建一行
    
    /*Phrase:短语可配置行间距、不会另起一行*/
    document.newPage();
    document.add(new Phrase("Phrase: "));
    Phrase tPhrase = new Phrase();
    Chunk name = new Chunk("Chunk1");
    name.setUnderline(0.2f, -2f);
    tPhrase.add(name);
    tPhrase.add(Chunk.NEWLINE);// 放在容器中好用
    tPhrase.add(new Chunk("换行Chunk: ", getChineseFont()));
    tPhrase.add(new Chunk("Chunk2"));
    tPhrase.setLeading(14f);// 行间距
    document.add(tPhrase);
    
    /*Paragraph:段落*/
    document.newPage();
    Paragraph info = new Paragraph("New page");
    info.setLeading(20f); //设置行距
    info.setSpacingBefore(5f);// 设置段落上空白
    info.setSpacingAfter(10f);// 设置段落下空白
    info.setFirstLineIndent(24);// 首行缩进
    info.setIndentationLeft(12);// 左缩进
    info.setIndentationRight(12);// 右缩进
    info.setAlignment(Element.ALIGN_CENTER);  //设置居中
    document.add(info);
    
    /*Image:图片,继承自Rectangle,scaleToFit设置大小,setAbsolutePosition设置绝对位置*/
    document.newPage();
    Image img = Image.getInstance("C:\Users\Administrator\Pictures\img10B6-36.jpg");
    img.setAlignment(Image.LEFT);  //对齐方式
    img.setBorder(Image.BOX);  //边框
    img.setBorderWidth(10);  //边框宽度
    img.setBorderColor(BaseColor.WHITE);  //边框颜色
    img.scaleToFit(800, 600);// 大小
    img.setRotationDegrees(-3);// 旋转
    document.add(img);
    
    /*Anchor:超链接和锚点对象*/
    document.newPage();
    Paragraph paragraph = new Paragraph();
    Anchor anchor = new Anchor("锚点文字", getChineseFont());
    anchor.setName("achorName"); // 设置锚点的名字
    anchor.setReference("http://www.baidu.com");// 连接
    paragraph.add(anchor);
    paragraph.add(String.format(": %d sites", 10000));
    document.add(paragraph);
    
    //关闭document
    document.close();
    

    表格

    Document document = new Document(PageSize.A4.rotate());
    //解析器
    PdfWriter writer= PdfWriter.getInstance(document, new FileOutputStream("D://pdftable.pdf"));
    /*页边距*/
    document.setMargins(10, 20, 30, 40);
    //打开document
    document.open();
    
    /*table:表格*/
    document.newPage();
    //中文字体
    BaseFont bfChinese = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
    Font fontChinese = new Font(bfChinese, 12, Font.NORMAL);
    
    int colNumber = 6;
    // 创建有6列的表格
    PdfPTable datatable = new PdfPTable(colNumber);
    // 定义表格的宽度
    int[] cellsWidth = { 1, 1, 1, 1, 1, 1 };
    datatable.setWidths(cellsWidth);// 单元格宽度
    //datatable.setTotalWidth(300f);//表格的总宽度
    //datatable.setWidthPercentage(100);// 表格的宽度百分比
    datatable.getDefaultCell().setPadding(2);// 单元格的间隔
    datatable.getDefaultCell().setBorderWidth(2);// 边框宽度
    //设置表格的底色
    datatable.getDefaultCell().setBackgroundColor(BaseColor.GREEN);
    datatable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_CENTER);
    //跨行跨列表格
    PdfPCell pdfPCell; // 单元格
    /*跨列*/
    pdfPCell = new PdfPCell(new Phrase("大标题--跨6列", getChineseFont()));
    pdfPCell.setHorizontalAlignment(Element.ALIGN_CENTER);  //水平居中
    pdfPCell.setColspan(6);// 跨3列
    datatable.addCell(pdfPCell);
    /*跨行*/
    pdfPCell = new PdfPCell(new Phrase("标题一跨2行", getChineseFont()));
    pdfPCell.setHorizontalAlignment(Element.ALIGN_CENTER);  //水平居中
    pdfPCell.setVerticalAlignment(Element.ALIGN_MIDDLE);  //垂直居中
    pdfPCell.setRowspan(2);// 跨2行
    datatable.addCell(pdfPCell);
    pdfPCell = new PdfPCell(new Phrase("标题二跨2行", getChineseFont()));
    pdfPCell.setHorizontalAlignment(Element.ALIGN_CENTER);  //水平居中
    pdfPCell.setVerticalAlignment(Element.ALIGN_MIDDLE);  //垂直居中
    pdfPCell.setRowspan(2);// 跨2行
    datatable.addCell(pdfPCell);
    pdfPCell = new PdfPCell(new Phrase("标题三跨2行", getChineseFont()));
    pdfPCell.setHorizontalAlignment(Element.ALIGN_CENTER);  //居中
    pdfPCell.setVerticalAlignment(Element.ALIGN_MIDDLE);  //垂直居中
    pdfPCell.setColspan(2);// 跨3列
    pdfPCell.setRowspan(1);// 跨2行
    datatable.addCell(pdfPCell);
    pdfPCell = new PdfPCell(new Phrase("标题四跨2行", getChineseFont()));
    pdfPCell.setHorizontalAlignment(Element.ALIGN_CENTER);  //居中
    pdfPCell.setVerticalAlignment(Element.ALIGN_MIDDLE);  //垂直居中
    pdfPCell.setRowspan(2);// 跨2行
    datatable.addCell(pdfPCell);
    pdfPCell = new PdfPCell(new Phrase("标题五跨2行", getChineseFont()));
    pdfPCell.setHorizontalAlignment(Element.ALIGN_CENTER);  //居中
    pdfPCell.setVerticalAlignment(Element.ALIGN_MIDDLE);  //垂直居中
    pdfPCell.setRowspan(2);// 跨2行
    datatable.addCell(pdfPCell);
    pdfPCell = new PdfPCell(new Phrase("3子标题", getChineseFont()));
    pdfPCell.setHorizontalAlignment(Element.ALIGN_CENTER);  //居中
    datatable.addCell(pdfPCell);
    datatable.addCell(pdfPCell);
    // 添加表头元素
    for (int i = 0; i < colNumber; i++) {
        datatable.addCell(new Paragraph("中文内容"+i, fontChinese));
    }
    // 添加表格的内容
    for (int i = 0; i < colNumber; i++) {
        datatable.addCell(new Paragraph("Content"+i, fontChinese));
    }
    // 空白表格
    for (int i = 0; i < colNumber; i++) {
        PdfPCell cell = new PdfPCell(new Paragraph(""));  //设置内容为空的表格
        cell.setFixedHeight(10);// 单元格高度
        datatable.addCell(cell);  //添加到表格
    }
    datatable.setSpacingAfter(40f);// 设置表格下面空白行
    document.add(datatable);// 把表格加入文档
    
    //关闭document
    document.close();
    

    获取默认字体

    /**
     * 获取中国字体
     * @return
     */
    public static Font getChineseFont() {
        BaseFont bfChinese;  //确认支持中文
        Font fontChinese = null;  //字体的设置,如颜色,字体,大小等
        try {
            bfChinese = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
            // fontChinese = new Font(bfChinese, 12, Font.NORMAL);
            fontChinese = new Font(bfChinese, 12, Font.NORMAL, BaseColor.BLACK);
        } catch (DocumentException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return fontChinese;
    }
    

    合并PDF

    /** 合並pdf文件
     * @param files 要合並文件数组(绝对路劲{ "D:\a1.pdf", "D:\a2.pdf" })
     * @param savepath 合并后新产生的文件绝对路径如D:\a.pdf
     */
    public static void mergePdfFiles(String[] files, String savepath){
        try {
            //创建一个与a.pdf相同纸张大小的document
            /*PdfReader pdfReader = new PdfReader(files[0]);
            Rectangle pageSize = pdfReader.getPageSize(1);
            pdfReader.close(); //关闭流,不然会一直占用*/
            //创建A4大小的document
            Document document = new Document(PageSize.A4);
            PdfCopy copy = new PdfCopy(document, new FileOutputStream(savepath));
            document.open();
            for (int i = 0; i < files.length; i++) {  //遍历文件路径集合
                //一个一个的遍历现有的PDF
                PdfReader reader = null;  //获取文件
                try {
                    reader = new PdfReader(files[i]);
                } catch (IOException e) {
                    continue;  //如果文件不存在,则继续合并下一个文件
                }
                int n = reader.getNumberOfPages();  //获取文件总页数
    
                for (int j = 1; j <= n; j++) {  //遍历页数,放入document
                    document.newPage();  //新页
                    PdfImportedPage page = copy.getImportedPage(reader, j);  //从文件中的指定页码拿出page
                    copy.addPage(page);  //将page放入PdfCopy
                }
                reader.close();  //关闭流
            }
            document.close();
    
        }catch (DocumentException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    

    添加水印

    /**
     * 给pdf文件添加水印
     * @param InPdfFile 要加水印的原pdf文件路径
     * @param outPdfFile 加了水印后要输出的路径
     * @param textMark 水印文字
     * @param textWidth 文字横坐标
     * @param textHeight 文字纵坐标
     * @throws Exception
     */
    public static void addPdfTextMark(String InPdfFile, String outPdfFile, String textMark,int textWidth,
                                      int textHeight) throws Exception {
        PdfReader reader = new PdfReader(InPdfFile, "PDF".getBytes());
        PdfStamper stamp = new PdfStamper(reader, new FileOutputStream(new File(outPdfFile)));
        PdfContentByte under;
        BaseFont font = BaseFont.createFont("C:/WINDOWS/Fonts/SIMSUN.TTC,1", "Identity-H", true);// 使用系统字体
        int pageSize = reader.getNumberOfPages();// 原pdf文件的总页数
        for(int i = 1; i <= pageSize; i++) {
            under = stamp.getUnderContent(i);// 水印在之前文本下
            // under = stamp.getOverContent(i);//水印在之前文本上
            under.beginText();
            under.setColorFill(BaseColor.GRAY);// 文字水印 颜色
            under.setFontAndSize(font, 38);// 文字水印 字体及字号
            under.setTextMatrix(textWidth, textHeight);// 文字水印 起始位置
            under.showTextAligned(Element.ALIGN_CENTER, textMark, textWidth, textHeight, 45);
            under.endText();
        }
        stamp.close();// 关闭
    }
    
    
    /**
     * 给pdf文件添加图片水印
     * @param InPdfFile 要加水印的原pdf文件路径
     * @param outPdfFile 加了水印后要输出的路径
     * @param markImagePath 水印图片路径
     * @param imgWidth 图片横坐标
     * @param imgHeight 图片纵坐标
     * @throws Exception
     */
    public static void addPdfImgMark(String InPdfFile, String outPdfFile, String markImagePath,int imgWidth, int imgHeight) throws Exception {
        PdfReader reader = new PdfReader(InPdfFile, "PDF".getBytes());
        PdfStamper stamp = new PdfStamper(reader, new FileOutputStream(new File(outPdfFile)));
    
        PdfContentByte under;
        PdfGState gs1 = new PdfGState();
        gs1.setFillOpacity(0.3f);// 透明度设置
        Image img = Image.getInstance(markImagePath);// 插入图片水印
        img.setAbsolutePosition(imgWidth, imgHeight); // 坐标
        img.setRotation(-20);// 旋转 弧度
        img.setRotationDegrees(45);// 旋转 角度
        // img.scaleAbsolute(200,100);//自定义大小
        // img.scalePercent(50);//依照比例缩放
    
        int pageSize = reader.getNumberOfPages();// 原pdf文件的总页数
        for(int i = 1; i <= pageSize; i++) {
            under = stamp.getUnderContent(i);// 水印在之前文本下
            // under = stamp.getOverContent(i);//水印在之前文本上
            under.setGState(gs1);// 图片水印 透明度
            under.addImage(img);// 图片水印
        }
    
        stamp.close();// 关闭
        // // 删除不带水印文件
        //File tempfile = new File(InPdfFile);
        //	if(tempfile.exists()) {
        //	tempfile.delete();
        //}
    }
    

    //new一个Document对象,设置纸张大小
    Document document = new Document(PageSize.A4);
    //解析器
    PdfWriter writer= PdfWriter.getInstance(document, new FileOutputStream("D://pdfText.pdf"));
    //添加PDF属性
    /document.addAuthor("作者");
    document.addTitle("标题");
    document.addSubject("主题");
    document.addKeywords("关键字");
    /
    /页边距/
    document.setMargins(10, 20, 30, 40);

    //打开document
    document.open();

    //添加新段落
    document.add(new Paragraph("Hello world"));

    //添加新的空白页
    document.newPage();
    writer.setPageEmpty(true); //显示空白页

    /Chunk:块对象,可配置字符间距、字符+背景色、背景色的矩形大小可任意调整/
    document.newPage();
    document.add(new Chunk("中文输出: ", getChineseFont()));
    Chunk tChunk2 = new Chunk("输出的内容", getChineseFont());
    tChunk2.setBackground(BaseColor.CYAN, 1f, 0.5f, 1f, 1.5f); // 设置背景色
    tChunk2.setTextRise(6); // 上浮
    tChunk2.setUnderline(0.2f, -2f); // 下划线
    document.add(tChunk2);
    document.add(Chunk.NEWLINE); // 新建一行

    /Phrase:短语可配置行间距、不会另起一行/
    document.newPage();
    document.add(new Phrase("Phrase: "));
    Phrase tPhrase = new Phrase();
    Chunk name = new Chunk("Chunk1");
    name.setUnderline(0.2f, -2f);
    tPhrase.add(name);
    tPhrase.add(Chunk.NEWLINE);// 放在容器中好用
    tPhrase.add(new Chunk("换行Chunk: ", getChineseFont()));
    tPhrase.add(new Chunk("Chunk2"));
    tPhrase.setLeading(14f);// 行间距
    document.add(tPhrase);

    /Paragraph:段落/
    document.newPage();
    Paragraph info = new Paragraph("New page");
    info.setLeading(20f); //设置行距
    info.setSpacingBefore(5f);// 设置段落上空白
    info.setSpacingAfter(10f);// 设置段落下空白
    info.setFirstLineIndent(24);// 首行缩进
    info.setIndentationLeft(12);// 左缩进
    info.setIndentationRight(12);// 右缩进
    info.setAlignment(Element.ALIGN_CENTER); //设置居中
    document.add(info);

    /Image:图片,继承自Rectangle,scaleToFit设置大小,setAbsolutePosition设置绝对位置/
    document.newPage();
    Image img = Image.getInstance("C:UsersAdministratorPicturesimg10B6-36.jpg");
    img.setAlignment(Image.LEFT); //对齐方式
    img.setBorder(Image.BOX); //边框
    img.setBorderWidth(10); //边框宽度
    img.setBorderColor(BaseColor.WHITE); //边框颜色
    img.scaleToFit(800, 600);// 大小
    img.setRotationDegrees(-3);// 旋转
    document.add(img);

    /Anchor:超链接和锚点对象/
    document.newPage();
    Paragraph paragraph = new Paragraph();
    Anchor anchor = new Anchor("锚点文字", getChineseFont());
    anchor.setName("achorName"); // 设置锚点的名字
    anchor.setReference("http://www.baidu.com");// 连接
    paragraph.add(anchor);
    paragraph.add(String.format(": %d sites", 10000));
    document.add(paragraph);

    //关闭document
    document.close();

    ### 表格
    
    ​```java
    Document document = new Document(PageSize.A4.rotate());
    //解析器
    PdfWriter writer= PdfWriter.getInstance(document, new FileOutputStream("D://pdftable.pdf"));
    /*页边距*/
    document.setMargins(10, 20, 30, 40);
    //打开document
    document.open();
    
    /*table:表格*/
    document.newPage();
    //中文字体
    BaseFont bfChinese = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
    Font fontChinese = new Font(bfChinese, 12, Font.NORMAL);
    
    int colNumber = 6;
    // 创建有6列的表格
    PdfPTable datatable = new PdfPTable(colNumber);
    // 定义表格的宽度
    int[] cellsWidth = { 1, 1, 1, 1, 1, 1 };
    datatable.setWidths(cellsWidth);// 单元格宽度
    //datatable.setTotalWidth(300f);//表格的总宽度
    //datatable.setWidthPercentage(100);// 表格的宽度百分比
    datatable.getDefaultCell().setPadding(2);// 单元格的间隔
    datatable.getDefaultCell().setBorderWidth(2);// 边框宽度
    //设置表格的底色
    datatable.getDefaultCell().setBackgroundColor(BaseColor.GREEN);
    datatable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_CENTER);
    //跨行跨列表格
    PdfPCell pdfPCell; // 单元格
    /*跨列*/
    pdfPCell = new PdfPCell(new Phrase("大标题--跨6列", getChineseFont()));
    pdfPCell.setHorizontalAlignment(Element.ALIGN_CENTER);  //水平居中
    pdfPCell.setColspan(6);// 跨3列
    datatable.addCell(pdfPCell);
    /*跨行*/
    pdfPCell = new PdfPCell(new Phrase("标题一跨2行", getChineseFont()));
    pdfPCell.setHorizontalAlignment(Element.ALIGN_CENTER);  //水平居中
    pdfPCell.setVerticalAlignment(Element.ALIGN_MIDDLE);  //垂直居中
    pdfPCell.setRowspan(2);// 跨2行
    datatable.addCell(pdfPCell);
    pdfPCell = new PdfPCell(new Phrase("标题二跨2行", getChineseFont()));
    pdfPCell.setHorizontalAlignment(Element.ALIGN_CENTER);  //水平居中
    pdfPCell.setVerticalAlignment(Element.ALIGN_MIDDLE);  //垂直居中
    pdfPCell.setRowspan(2);// 跨2行
    datatable.addCell(pdfPCell);
    pdfPCell = new PdfPCell(new Phrase("标题三跨2行", getChineseFont()));
    pdfPCell.setHorizontalAlignment(Element.ALIGN_CENTER);  //居中
    pdfPCell.setVerticalAlignment(Element.ALIGN_MIDDLE);  //垂直居中
    pdfPCell.setColspan(2);// 跨3列
    pdfPCell.setRowspan(1);// 跨2行
    datatable.addCell(pdfPCell);
    pdfPCell = new PdfPCell(new Phrase("标题四跨2行", getChineseFont()));
    pdfPCell.setHorizontalAlignment(Element.ALIGN_CENTER);  //居中
    pdfPCell.setVerticalAlignment(Element.ALIGN_MIDDLE);  //垂直居中
    pdfPCell.setRowspan(2);// 跨2行
    datatable.addCell(pdfPCell);
    pdfPCell = new PdfPCell(new Phrase("标题五跨2行", getChineseFont()));
    pdfPCell.setHorizontalAlignment(Element.ALIGN_CENTER);  //居中
    pdfPCell.setVerticalAlignment(Element.ALIGN_MIDDLE);  //垂直居中
    pdfPCell.setRowspan(2);// 跨2行
    datatable.addCell(pdfPCell);
    pdfPCell = new PdfPCell(new Phrase("3子标题", getChineseFont()));
    pdfPCell.setHorizontalAlignment(Element.ALIGN_CENTER);  //居中
    datatable.addCell(pdfPCell);
    datatable.addCell(pdfPCell);
    // 添加表头元素
    for (int i = 0; i < colNumber; i++) {
        datatable.addCell(new Paragraph("中文内容"+i, fontChinese));
    }
    // 添加表格的内容
    for (int i = 0; i < colNumber; i++) {
        datatable.addCell(new Paragraph("Content"+i, fontChinese));
    }
    // 空白表格
    for (int i = 0; i < colNumber; i++) {
        PdfPCell cell = new PdfPCell(new Paragraph(""));  //设置内容为空的表格
        cell.setFixedHeight(10);// 单元格高度
        datatable.addCell(cell);  //添加到表格
    }
    datatable.setSpacingAfter(40f);// 设置表格下面空白行
    document.add(datatable);// 把表格加入文档
    
    //关闭document
    document.close();
    

    获取默认字体

    /**
     * 获取中国字体
     * @return
     */
    public static Font getChineseFont() {
        BaseFont bfChinese;  //确认支持中文
        Font fontChinese = null;  //字体的设置,如颜色,字体,大小等
        try {
            bfChinese = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
            // fontChinese = new Font(bfChinese, 12, Font.NORMAL);
            fontChinese = new Font(bfChinese, 12, Font.NORMAL, BaseColor.BLACK);
        } catch (DocumentException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return fontChinese;
    }
    

    合并PDF

    /** 合並pdf文件
     * @param files 要合並文件数组(绝对路劲{ "D:\a1.pdf", "D:\a2.pdf" })
     * @param savepath 合并后新产生的文件绝对路径如D:\a.pdf
     */
    public static void mergePdfFiles(String[] files, String savepath) throws Exception{
        try {
            //创建一个与a.pdf相同纸张大小的document
            /*PdfReader pdfReader = new PdfReader(files[0]);
            Rectangle pageSize = pdfReader.getPageSize(1);
            pdfReader.close(); //关闭流,不然会一直占用*/
            //创建A4大小的document
            Document document = new Document(PageSize.A4);
            PdfCopy copy = new PdfCopy(document, new FileOutputStream(savepath));
            document.open();
            for (int i = 0; i < files.length; i++) {  //遍历文件路径集合
                //一个一个的遍历现有的PDF
                PdfReader reader = new PdfReader(files[i]);  //获取文件
                int n = reader.getNumberOfPages();  //获取文件总页数
    
                for (int j = 1; j <= n; j++) {  //遍历页数,放入document
                    document.newPage();  //新页
                    PdfImportedPage page = copy.getImportedPage(reader, j);  //从文件中的指定页码拿出page
                    copy.addPage(page);  //将page放入PdfCopy
                }
                reader.close();  //关闭流
            }
            document.close();
    
        } catch (IOException e) {
            e.printStackTrace();
        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }
    

    添加水印

    /**
     * 给pdf文件添加水印
     * @param InPdfFile 要加水印的原pdf文件路径
     * @param outPdfFile 加了水印后要输出的路径
     * @param textMark 水印文字
     * @param textWidth 文字横坐标
     * @param textHeight 文字纵坐标
     * @throws Exception
     */
    public static void addPdfTextMark(String InPdfFile, String outPdfFile, String textMark,int textWidth,
                                      int textHeight) throws Exception {
        PdfReader reader = new PdfReader(InPdfFile, "PDF".getBytes());
        PdfStamper stamp = new PdfStamper(reader, new FileOutputStream(new File(outPdfFile)));
        PdfContentByte under;
        BaseFont font = BaseFont.createFont("C:/WINDOWS/Fonts/SIMSUN.TTC,1", "Identity-H", true);// 使用系统字体
        int pageSize = reader.getNumberOfPages();// 原pdf文件的总页数
        for(int i = 1; i <= pageSize; i++) {
            under = stamp.getUnderContent(i);// 水印在之前文本下
            // under = stamp.getOverContent(i);//水印在之前文本上
            under.beginText();
            under.setColorFill(BaseColor.GRAY);// 文字水印 颜色
            under.setFontAndSize(font, 38);// 文字水印 字体及字号
            under.setTextMatrix(textWidth, textHeight);// 文字水印 起始位置
            under.showTextAligned(Element.ALIGN_CENTER, textMark, textWidth, textHeight, 45);
            under.endText();
        }
        stamp.close();// 关闭
    }
    
    
    /**
     * 给pdf文件添加图片水印
     * @param InPdfFile 要加水印的原pdf文件路径
     * @param outPdfFile 加了水印后要输出的路径
     * @param markImagePath 水印图片路径
     * @param imgWidth 图片横坐标
     * @param imgHeight 图片纵坐标
     * @throws Exception
     */
    public static void addPdfImgMark(String InPdfFile, String outPdfFile, String markImagePath,int imgWidth, int imgHeight) throws Exception {
        PdfReader reader = new PdfReader(InPdfFile, "PDF".getBytes());
        PdfStamper stamp = new PdfStamper(reader, new FileOutputStream(new File(outPdfFile)));
    
        PdfContentByte under;
        PdfGState gs1 = new PdfGState();
        gs1.setFillOpacity(0.3f);// 透明度设置
        Image img = Image.getInstance(markImagePath);// 插入图片水印
        img.setAbsolutePosition(imgWidth, imgHeight); // 坐标
        img.setRotation(-20);// 旋转 弧度
        img.setRotationDegrees(45);// 旋转 角度
        // img.scaleAbsolute(200,100);//自定义大小
        // img.scalePercent(50);//依照比例缩放
    
        int pageSize = reader.getNumberOfPages();// 原pdf文件的总页数
        for(int i = 1; i <= pageSize; i++) {
            under = stamp.getUnderContent(i);// 水印在之前文本下
            // under = stamp.getOverContent(i);//水印在之前文本上
            under.setGState(gs1);// 图片水印 透明度
            under.addImage(img);// 图片水印
        }
    
        stamp.close();// 关闭
        // // 删除不带水印文件
        //File tempfile = new File(InPdfFile);
        //	if(tempfile.exists()) {
        //	tempfile.delete();
        //}
    }
    
    如果这篇文章对你有用,麻烦关注一下本人微信公众号,关注送福利哦~
    微信公众号二维码
    不定期安利各种插件,编程技巧,编程思想,欢迎交流~
  • 相关阅读:
    Java多线程 ReadWriteLock、StampedLock用法
    Java多线程基础
    Java中创建多线程
    Java中多线程同步
    Java多线程 synchronized与ReentrantLock用法
    Linux6配置bond链路聚合
    Bash Shell命令流程
    location uri 添加 / 和不添加 / 的区别?
    Nginx负载均衡健康检查nginx_upstream_check_module
    Zabbix4.0源码安装基于LNMP
  • 原文地址:https://www.cnblogs.com/aeolian/p/14384477.html
Copyright © 2011-2022 走看看