`

itextpdf生成pdf文件并追加页码

    博客分类:
  • java
 
阅读更多
/**
* 页眉页脚
* mark一下,原文地址:https://blog.csdn.net/ae6623/article/details/11734285/
*/

import java.io.IOException;
 
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.ColumnText;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfPageEventHelper;
import com.itextpdf.text.pdf.PdfTemplate;
import com.itextpdf.text.pdf.PdfWriter;
 
public class PdfHeaderFooter extends PdfPageEventHelper {
 
    /**
     * 页眉

     */
    public String header = "";
 
    /**
     * 文档字体大小,页脚页眉最好和文本大小一致
     */
    public int presentFontSize = 12;
 
    /**
     * 文档页面大小,最好前面传入,否则默认为A4纸张
     */
    public Rectangle pageSize = PageSize.A4;
 
    // 模板
    public PdfTemplate total;
 
    // 基础字体对象
    public BaseFont bf = null;
 
    // 利用基础字体生成的字体对象,一般用于生成中文文字
    public Font fontDetail = null;
 
    /**
     *
     * Creates a new instance of PdfReportM1HeaderFooter 无参构造方法.
     *
     */
    public PdfHeaderFooter() {
 
    }
 
    /**
     *
     * Creates a new instance of PdfReportM1HeaderFooter 构造方法.
     *
     * @param yeMei
     *            页眉字符串
     * @param presentFontSize
     *            数据体字体大小
     * @param pageSize
     *            页面文档大小,A4,A5,A6横转翻转等Rectangle对象
     */
    public PdfHeaderFooter(String yeMei, int presentFontSize, Rectangle pageSize) {
        this.header = yeMei;
        this.presentFontSize = presentFontSize;
        this.pageSize = pageSize;
    }
 
    public void setHeader(String header) {
        this.header = header;
    }
 
    public void setPresentFontSize(int presentFontSize) {
        this.presentFontSize = presentFontSize;
    }
 
    /**
     *
     * TODO 文档打开时创建模板
     *
     * @see com.itextpdf.text.pdf.PdfPageEventHelper#onOpenDocument(com.itextpdf.text.pdf.PdfWriter, com.itextpdf.text.Document)
     */
    @Override
    public void onOpenDocument(PdfWriter writer, Document document) {
        total = writer.getDirectContent().createTemplate(50, 50);// 共 页 的矩形的长宽高
    }
 
    /**
     *
     * TODO 关闭每页的时候,写入页眉,写入'第几页共'这几个字。
     *
     * @see com.itextpdf.text.pdf.PdfPageEventHelper#onEndPage(com.itextpdf.text.pdf.PdfWriter, com.itextpdf.text.Document)
     */
    @Override
    public void onEndPage(PdfWriter writer, Document document) {
 
        try {
            if (bf == null) {
                bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", false);
            }
            if (fontDetail == null) {
                fontDetail = new Font(bf, presentFontSize, Font.NORMAL);// 数据体字体
            }
        } catch (DocumentException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
 
        // 1.写入页眉
        ColumnText.showTextAligned(writer.getDirectContent(), Element.ALIGN_LEFT, new Phrase(header, fontDetail), document.left(), document.top() + 20, 0);
        
        // 2.写入前半部分的 第 X页/共
        int pageS = writer.getPageNumber();
        String foot1 = "第 " + pageS + " 页 /共";
        Phrase footer = new Phrase(foot1, fontDetail);
 
        // 3.计算前半部分的foot1的长度,后面好定位最后一部分的'Y页'这俩字的x轴坐标,字体长度也要计算进去 = len
        float len = bf.getWidthPoint(foot1, presentFontSize);
 
        // 4.拿到当前的PdfContentByte
        PdfContentByte cb = writer.getDirectContent();
 
        // 5.写入页脚1,x轴就是(右margin+左margin + right() -left()- len)/2.0F 再给偏移20F适合人类视觉感受,否则肉眼看上去就太偏左了 ,y轴就是底边界-20,否则就贴边重叠到数据体里了就不是页脚了;注意Y轴是从下往上累加的,最上方的Top值是大于Bottom好几百开外的。
        ColumnText.showTextAligned(cb, Element.ALIGN_CENTER, footer, (document.rightMargin() + document.right() + document.leftMargin() - document.left() - len) / 2.0F + 20F, document.bottom() - 20, 0);
 
        // 6.写入页脚2的模板(就是页脚的Y页这俩字)添加到文档中,计算模板的和Y轴,X=(右边界-左边界 - 前半部分的len值)/2.0F + len , y 轴和之前的保持一致,底边界-20
        cb.addTemplate(total, (document.rightMargin() + document.right() + document.leftMargin() - document.left()) / 2.0F + 20F, document.bottom() - 20); // 调节模版显示的位置
 
    }
 
    /**
     *
     * TODO 关闭文档时,替换模板,完成整个页眉页脚组件
     *
     * @see com.itextpdf.text.pdf.PdfPageEventHelper#onCloseDocument(com.itextpdf.text.pdf.PdfWriter, com.itextpdf.text.Document)
     */
    @Override
    public void onCloseDocument(PdfWriter writer, Document document) {
        // 7.最后一步了,就是关闭文档的时候,将模板替换成实际的 Y 值,至此,page x of y 制作完毕,完美兼容各种文档size。
        total.beginText();
        total.setFontAndSize(bf, presentFontSize);// 生成的模版的字体、颜色
        String foot2 = " " + (writer.getPageNumber() - 1) + " 页";
        total.showText(foot2);// 模版显示的内容
        total.endText();
        total.closePath();
    }
}




/**
* 生成pdf
*/

import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.Image;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfGState;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
import com.itextpdf.text.pdf.PdfWriter;
import com.test.dorm.domain.vo.DmAgreemeetVo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
* Created by xyh
*/
public class PdfTestServiceImpl {

    private static Logger logger = LoggerFactory.getLogger(PdfTestServiceImpl.class);

    /**
     * 追加协议内容
     *
     * @param document 原协议文档
     * @param agre     协议内容
     * @throws DocumentException
     * @throws IOException
     */
    private void addAgreement(Document document, DmAgreemeetVo agre) throws DocumentException, IOException {
        //设置字体
        BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
        Font fontChinese18 = new Font(bfChinese, 18, Font.BOLD);
        Font fontChinese16 = new Font(bfChinese, 16, Font.BOLD);
        Font fontChinese11Bold = new Font(bfChinese, 11, Font.BOLD);
        Font fontChinese11Normal = new Font(bfChinese, 11, Font.NORMAL);

        // 标题【物品放行单】
        PdfPTable subject = new PdfPTable(1);
        //设置每列宽度比例
        int width21[] = {98};
        subject.setWidths(width21);
        subject.getDefaultCell().setBorder(0);
        PdfPCell cell21 = new PdfPCell(new Paragraph("物品放行单", fontChinese16));

        cell21.setBorder(0);
        cell21.setHorizontalAlignment(Element.ALIGN_CENTER);
        subject.addCell(cell21);
        document.add(subject);
        //加入空行
        Paragraph blankRow2 = new Paragraph(18f, " ", fontChinese18);
        document.add(blankRow2);

        // 申请单号
        PdfPTable applyCodeTbl = new PdfPTable(3);
        BaseColor applyCodeBorder = new BaseColor(0xCC, 0xCC, 0xCC);
        int applyCodeCellWidth[] = {160, 30, 50};
        applyCodeTbl.setWidths(applyCodeCellWidth);
        PdfPCell applyCodeCell1 = this.setPdfPCell("", 25, fontChinese11Normal, applyCodeBorder, true, PdfPCell.BOX);
        PdfPCell applyCodeCell2 = this.setPdfPCell("申请单号:", 25, fontChinese11Normal, applyCodeBorder, true, PdfPCell.BOX);
        PdfPCell applyCodeCell3 = this.setPdfPCell(agre.getTaskId(), 25, fontChinese11Normal, applyCodeBorder, true, PdfPCell.BOX);
        applyCodeCell1.setBorder(0);
        applyCodeCell2.setBorder(0);
        applyCodeCell3.setBorder(0);
        applyCodeCell3.setHorizontalAlignment(Element.ALIGN_LEFT);
        applyCodeTbl.addCell(applyCodeCell1);
        applyCodeTbl.addCell(applyCodeCell2);
        applyCodeTbl.addCell(applyCodeCell3);
        document.add(applyCodeTbl);

        // 放行日期
        PdfPTable releaseDateTbl = new PdfPTable(2);
        BaseColor releaseDateBorder = new BaseColor(0xCC, 0xCC, 0xCC);
        int releaseDateCellWidth[] = {30, 210};
        releaseDateTbl.setWidths(releaseDateCellWidth);
        PdfPCell releaseDateCell1 = this.setPdfPCell("放行日期", 25, fontChinese11Normal, releaseDateBorder, true, PdfPCell.BOX);
        PdfPCell releaseDateCell2 = this.setPdfPCell("", 25, fontChinese11Normal, releaseDateBorder, true, PdfPCell.BOX);
        releaseDateTbl.addCell(releaseDateCell1);
        releaseDateTbl.addCell(releaseDateCell2);
        document.add(releaseDateTbl);

        //申请人信息
        PdfPTable applyUserTbl = new PdfPTable(6);
        BaseColor applyUserBorder = new BaseColor(0xCC, 0xCC, 0xCC);
        int applyUserCellWidth[] = {30, 35, 35, 35, 20, 85};
        applyUserTbl.setWidths(applyUserCellWidth);
        PdfPCell applyUserCell1 = this.setPdfPCell("申请人", 25, fontChinese11Normal, applyUserBorder, true, PdfPCell.BOX);
        PdfPCell applyUserCell2 = this.setPdfPCell("", 25, fontChinese11Normal, applyUserBorder, true, PdfPCell.BOX);
        PdfPCell applyUserCell3 = this.setPdfPCell("电话", 25, fontChinese11Normal, applyUserBorder, true, PdfPCell.BOX);
        PdfPCell applyUserCell4 = this.setPdfPCell("", 25, fontChinese11Normal, applyUserBorder, true, PdfPCell.BOX);
        PdfPCell applyUserCell5 = this.setPdfPCell("部门", 25, fontChinese11Normal, applyUserBorder, true, PdfPCell.BOX);
        PdfPCell applyUserCell6 = this.setPdfPCell("", 25, fontChinese11Normal, applyUserBorder, true, PdfPCell.BOX);
        applyUserTbl.addCell(applyUserCell1);
        applyUserTbl.addCell(applyUserCell2);
        applyUserTbl.addCell(applyUserCell3);
        applyUserTbl.addCell(applyUserCell4);
        applyUserTbl.addCell(applyUserCell5);
        applyUserTbl.addCell(applyUserCell6);

        // 携物人信息
        PdfPCell carryGoodsUserCell1 = this.setPdfPCell("携物人", 25, fontChinese11Normal, applyUserBorder, true, PdfPCell.BOX);
        PdfPCell carryGoodsUserCell2 = this.setPdfPCell("", 25, fontChinese11Normal, applyUserBorder, true, PdfPCell.BOX);
        PdfPCell carryGoodsUserCell3 = this.setPdfPCell("电话", 25, fontChinese11Normal, applyUserBorder, true, PdfPCell.BOX);
        PdfPCell carryGoodsUserCell4 = this.setPdfPCell("", 25, fontChinese11Normal, applyUserBorder, true, PdfPCell.BOX);
        PdfPCell carryGoodsUserCell5 = this.setPdfPCell("单位", 25, fontChinese11Normal, applyUserBorder, true, PdfPCell.BOX);
        PdfPCell carryGoodsUserCell6 = this.setPdfPCell("", 25, fontChinese11Normal, applyUserBorder, true, PdfPCell.BOX);
        applyUserTbl.addCell(carryGoodsUserCell1);
        applyUserTbl.addCell(carryGoodsUserCell2);
        applyUserTbl.addCell(carryGoodsUserCell3);
        applyUserTbl.addCell(carryGoodsUserCell4);
        applyUserTbl.addCell(carryGoodsUserCell5);
        applyUserTbl.addCell(carryGoodsUserCell6);
        document.add(applyUserTbl);

        // 物品列表
        PdfPTable goodsListTbl = new PdfPTable(4);
        BaseColor goodsListBorder = new BaseColor(0xCC, 0xCC, 0xCC);
        int goodsListCellWidth[] = {75, 15, 75, 75};
        goodsListTbl.setWidths(goodsListCellWidth);
        PdfPCell goodsListCell1 = this.setPdfPCell("物品名称", 25, fontChinese11Normal, goodsListBorder, true, PdfPCell.BOX);
        PdfPCell goodsListCell2 = this.setPdfPCell("数量", 25, fontChinese11Normal, goodsListBorder, true, PdfPCell.BOX);
        PdfPCell goodsListCell3 = this.setPdfPCell("规格", 25, fontChinese11Normal, goodsListBorder, true, PdfPCell.BOX);
        PdfPCell goodsListCell4 = this.setPdfPCell("型号", 25, fontChinese11Normal, goodsListBorder, true, PdfPCell.BOX);
        goodsListTbl.addCell(goodsListCell1);
        goodsListTbl.addCell(goodsListCell2);
        goodsListTbl.addCell(goodsListCell3);
        goodsListTbl.addCell(goodsListCell4);
        int goodsRows = 10;
        for (int i = 0; i < goodsRows; i++) {
            PdfPCell goodsNameCell = this.setPdfPCell("物品名称", null, fontChinese11Normal, goodsListBorder, true, PdfPCell.BOX);
            PdfPCell goodsCountCell = this.setPdfPCell(i + "", null, fontChinese11Normal, goodsListBorder, true, PdfPCell.BOX);
            PdfPCell goodsSpecificationCell = this.setPdfPCell("啊大大逻辑发阿达啊爱就爱累加方式sfsfsfdsh哈哈faaaaaaaadfsfsfdsfds福建省发送到发送到", null, fontChinese11Normal, goodsListBorder, true, PdfPCell.BOX);
            PdfPCell goodsModelCell = this.setPdfPCell("adsadjaojdddddddddddsadsa2342424234s2aa" + i, null, fontChinese11Normal, goodsListBorder, true, PdfPCell.BOX);
            goodsListTbl.addCell(goodsNameCell);
            goodsListTbl.addCell(goodsCountCell);
            goodsListTbl.addCell(goodsSpecificationCell);
            goodsListTbl.addCell(goodsModelCell);
        }
        document.add(goodsListTbl);

        // 物品所属部门
        PdfPTable goodsBelongDeptTbl = new PdfPTable(2);
        BaseColor goodsBelongDeptBorder = new BaseColor(0xCC, 0xCC, 0xCC);
        int goodsBelongDeptCellWidth[] = {30, 210};
        goodsBelongDeptTbl.setWidths(goodsBelongDeptCellWidth);
        PdfPCell goodsBelongDeptCell1 = this.setPdfPCell("物品所属部门", 25, fontChinese11Normal, goodsBelongDeptBorder, true, PdfPCell.BOX);
        PdfPCell goodsBelongDeptCell2 = this.setPdfPCell("", 25, fontChinese11Normal, goodsBelongDeptBorder, true, PdfPCell.BOX);
        goodsBelongDeptTbl.addCell(goodsBelongDeptCell1);
        goodsBelongDeptTbl.addCell(goodsBelongDeptCell2);

        // 批准人
        PdfPCell approverUserCell1 = this.setPdfPCell("批准人", 25, fontChinese11Normal, goodsBelongDeptBorder, true, PdfPCell.BOX);
        PdfPCell approverUserCell2 = this.setPdfPCell("", 25, fontChinese11Normal, goodsBelongDeptBorder, true, PdfPCell.BOX);
        goodsBelongDeptTbl.addCell(approverUserCell1);
        goodsBelongDeptTbl.addCell(approverUserCell2);

        // 出门原因
        PdfPCell outReasonCell1 = this.setPdfPCell("出门原因", 25, fontChinese11Normal, goodsBelongDeptBorder, true, PdfPCell.BOX);
        PdfPCell outReasonCell2 = this.setPdfPCell("", 25, fontChinese11Normal, goodsBelongDeptBorder, true, PdfPCell.BOX);
        goodsBelongDeptTbl.addCell(outReasonCell1);
        goodsBelongDeptTbl.addCell(outReasonCell2);

        // 备注
        PdfPCell remarkCell1 = this.setPdfPCell("备注", 25, fontChinese11Normal, goodsBelongDeptBorder, true, PdfPCell.BOX);
        PdfPCell remarkCell2 = this.setPdfPCell("", 25, fontChinese11Normal, goodsBelongDeptBorder, true, PdfPCell.BOX);
        goodsBelongDeptTbl.addCell(remarkCell1);
        goodsBelongDeptTbl.addCell(remarkCell2);

        // 注
        PdfPCell noteCell1 = this.setPdfPCell("注:", 25, fontChinese11Normal, goodsBelongDeptBorder, true, PdfPCell.BOX);
        noteCell1.setRowspan(3);
        goodsBelongDeptTbl.addCell(noteCell1);
        PdfPCell noteCell2 = this.setPdfPCell("1、放行单当日有效,逾期作废", 25, fontChinese11Normal, goodsBelongDeptBorder, true, PdfPCell.BOX);
        noteCell2.setHorizontalAlignment(Element.ALIGN_LEFT);
        goodsBelongDeptTbl.addCell(noteCell2);
        PdfPCell noteCell3 = this.setPdfPCell("2、各项内容需填写完整、准确,不得涂改、损坏", 25, fontChinese11Normal, goodsBelongDeptBorder, true, PdfPCell.BOX);
        noteCell3.setHorizontalAlignment(Element.ALIGN_LEFT);
        goodsBelongDeptTbl.addCell(noteCell3);
        PdfPCell noteCell4 = this.setPdfPCell("3、须将此物品放行单交于当值安保员", 25, fontChinese11Normal, goodsBelongDeptBorder, true, PdfPCell.BOX);
        noteCell4.setHorizontalAlignment(Element.ALIGN_LEFT);
        goodsBelongDeptTbl.addCell(noteCell4);
        document.add(goodsBelongDeptTbl);

    }

    /**
     * 填充单元格
     *
     * @param cellVal    值
     * @param height     表格高度
     * @param font       字体
     * @param lightGrey  边框颜色
     * @param borderFlag 是否显示边框  true:显示;false:不显示
     * @param borderSide 显示或不显示那个边框
     * @return
     */
    private PdfPCell setPdfPCell(String cellVal, Integer height, Font font, BaseColor lightGrey, boolean borderFlag, int borderSide) {
        PdfPCell cell = new PdfPCell(new Paragraph(cellVal, font));
        //表格高度,null表示需要自动换行展示,所以设置padding
        if (height != null) {
            cell.setFixedHeight(25);
        } else {
            cell.setPadding(4);
        }
        //水平居中
        cell.setHorizontalAlignment(Element.ALIGN_CENTER);
        //垂直居中
        cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
        //边框颜色
        cell.setBorderColor(lightGrey);

        if (!borderFlag) {
            //去掉左右边框
            cell.disableBorderSide(borderSide);
        } else {
            //添加左右边框
            cell.enableBorderSide(borderSide);
        }
        return cell;
    }

    /**
     * 加文本水印
     * @param inputFile     你的PDF文件地址
     * @param outputFile    添加水印后生成PDF存放的地址
     * @param waterMarkName 你的水印
     * @return
     */
    public static boolean waterMarkWidthText(String inputFile,
                                    String outputFile, String waterMarkName) {
        try {
            PdfReader reader = new PdfReader(inputFile);
            PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(
                    outputFile));
            //这里的字体设置比较关键,这个设置是支持中文的写法
            BaseFont base = BaseFont.createFont("STSong-Light",
                    "UniGB-UCS2-H", BaseFont.NOT_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 = pageRect.getWidth()/10;
//                float y = pageRect.getHeight()/10-10;
                // 获得PDF最顶层
                under = stamper.getOverContent(i);
                under.saveState();
                // set Transparency
                PdfGState gs = new PdfGState();
                // 设置透明度为0.2
                gs.setFillOpacity(0.8f);
                under.setGState(gs);
                under.restoreState();
                under.beginText();
                under.setFontAndSize(base, 25);
                under.setTextMatrix(30, 30);
                under.setColorFill(BaseColor.RED);
                for (int y = 0; y < 10; y++) {
                    for (int x = 0; x < 8; x++) {
                        // 水印文字成45度角倾斜
                        under.showTextAligned(Element.ALIGN_LEFT
                                , waterMarkName, 100 + 300 * x, 300 * y, 45);
                    }
                }

                // 添加水印文字
                under.endText();
                under.setLineWidth(1f);
                under.stroke();
            }
            stamper.close();
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 设置页码
     * @param writer
     * @throws DocumentException
     * @throws IOException
     */
    private void setFooter(PdfWriter writer) throws Exception {
        PdfHeaderFooter headerFooter = new PdfHeaderFooter();//就是上面那个类
        writer.setBoxSize("art", PageSize.A4);
        writer.setPageEvent(headerFooter);
    }

    /**
     * 生成pdf文件
     *
     * @param pdfFile 要生成的pdf文件
     * @param agre    pdf文件中的数据对象
     * @throws Exception
     */
    private void createPdfFile(File pdfFile, DmAgreemeetVo agre) throws Exception {
        FileOutputStream fo = new FileOutputStream(pdfFile);
        Document document1 = new Document(PageSize.A4.rotate());
        PdfWriter writer = null;
        // 初始化pdf文件写出流
        writer = PdfWriter.getInstance(document1, fo);
        this.setFooter(writer);
        document1.open();

        agre.setDepositStatus(1);
        // 追加协议内容
        this.addAgreement(document1, agre);
        document1.close();
        writer.close();
        fo.close();
    }

    /**
     * 加图片水印
     *
     * @param pdfFile          源pdf文件
     * @param pdfWatermarkFile 加水印后的pdf文件
     * @throws Exception
     */
    private void waterMarkWidthImage(File pdfFile, File pdfWatermarkFile) throws Exception {

        // 源pdf文件
        FileInputStream inputFile = new FileInputStream(pdfFile);

        PdfReader reader = new PdfReader(inputFile);
        int total = reader.getNumberOfPages() + 1;

        //实现A4纸页面 并且横向显示(不设置则为纵向)
        Document document = new Document(PageSize.A4.rotate());
        // 打开文档
        document.open();


        // 加入水印
        FileOutputStream resultOutFile = new FileOutputStream(pdfWatermarkFile);
        PdfStamper stamper = new PdfStamper(reader, resultOutFile);
        PdfContentByte waterMar = null;

        // 设置水印透明度
        PdfGState gs = new PdfGState();
        // 设置笔触字体不透明度为0.2f
        gs.setStrokeOpacity(0.8f);
        gs.setFillOpacity(0.8f);
        try {
            Image image = Image.getInstance("F:/京东logo.png");
            // 设置坐标 绝对位置 X Y
            image.setAbsolutePosition(200, 300);
            // 设置旋转弧度
            image.setRotation(30);// 旋转 弧度
            // 设置旋转角度
            image.setRotationDegrees(45);// 旋转 角度
            // 设置等比缩放
            image.scalePercent(20);// 依照比例缩放

            for (int i = 1; i < total; i++) {
                waterMar = stamper.getUnderContent(i);
                // 开始设置水印
                waterMar.beginText();
                // 设置透明度
                waterMar.setGState(gs);
                // 添加水印图片
                waterMar.addImage(image);
                //结束设置
                waterMar.endText();
                waterMar.stroke();
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            waterMar = null;
            gs = null;
            // 关闭文档
            document.close();
            stamper.close();
            inputFile.close();
            resultOutFile.close();

        }


    }

    public static void main(String[] args) throws Exception {
        //创建文件夹目录
        String dirPath = "/export/home/releasePermitDownload";
        File baseDir = new File(dirPath);
        if (!baseDir.exists()) {
            boolean mkResult = baseDir.mkdirs();
            if (!mkResult) {
                logger.error("创建目录失败:{}", baseDir.getAbsolutePath());
                return;
            }
        }
        String baseDirPath = baseDir.getPath();
        String applyErp = "xiayanghui";
        File pdfFile = new File(baseDirPath + File.separator + applyErp + System.currentTimeMillis() + ".pdf");
        DmAgreemeetVo agre = new DmAgreemeetVo();
        agre.setTaskId("FXD00000000001");
        PdfTestServiceImpl pdfTestService = new PdfTestServiceImpl();
        // 生成pdf文件
        pdfTestService.createPdfFile(pdfFile, agre);

        // 加水印
        File pdfWatermarkFile = new File(baseDirPath + File.separator + applyErp + "Watermark" + System.currentTimeMillis() + ".pdf");
        pdfTestService.waterMarkWidthImage(pdfFile, pdfWatermarkFile);

        // 记得最后删除文件
        pdfFile.delete();
        //pdfWatermarkFile.delete();


    }

}



分享到:
评论

相关推荐

    itextpdf 导出pdf 表格 自动分页中文 目录

    1. **iTextPDF**: iTextPDF是iText项目的一部分,它提供了丰富的API来生成、修改和解析PDF文档。5.5.5版本是iText的一个较新版本,增加了许多功能和性能优化。例如,它可以创建动态表单、添加图像、设置文本样式、...

    java使用itext实现pdf文件下载

    在压缩包中的`pdfDemo2`文件可能是这个小案例的源代码或者相关资源,如果你需要进一步了解实现细节,可以查看并运行这个文件。通过实践和理解这些示例,你将能够熟练地在Java项目中运用Itext处理PDF文件的下载需求。

    itextpdf按模版导出PDF(表单,表格,条码,二维码)

    在这个场景中,我们将探讨如何使用iTextPDF来根据模板生成包含表单、表格、条形码和二维码的PDF文档。以下是一个详细的步骤和知识点介绍: 1. **引入iTextPDF库** 首先,你需要在你的项目中添加iTextPDF依赖。如果...

    iText生成pdf解决中文不显示

    iText生成pdf解决中文不显示字库,pdf凉字不显示,由于生成iText插件生成pdf的时候中文会显示不出来,遇到过的是"凉"字,查到是字体库的原因,网上下载字体库msyh.ttc,生成的时候指定字体库,就可以解决了,小bug一...

    iText 实现根据pdf模板生成pdf并导入数据

    iText 实现根据pdf模板生成pdf并导入数据.....iText-5.0.6.jar....附字体jar包 很久很久之前写的了 代码见: https://github.com/thisisthis/noh-doc

    itextpdf-5.5.5.jar

    iTextPDF作为一个强大的PDF操作工具包,为开发者提供了丰富的API,使得生成、编辑PDF文件变得简单易行。本文将详细探讨iTextPDF 5.5.5版本的核心功能和使用方法。 iTextPDF是iText库的一个子项目,专注于PDF文档的...

    freemarker+itext生成PDF

    4. **生成PDF**:使用Itext读取FreeMarker处理后的结果,并将其转换为PDF文档。 在给定的文件列表中,`pom.xml`可能是Maven项目的依赖管理文件,其中会包含FreeMarker和Itext的依赖项。`src`则包含了源代码,可能...

    itextpdf签章示例

    1. itextpdf-5.5.0.jar:这是iTextPDF的核心库,包含了创建和修改PDF文档的主要功能。 2. bcpkix-jdk15on-1.64.jar:这是一个来自Bouncy Castle的加密库,提供了PKI(Public Key Infrastructure)相关功能,包括证书...

    Itext实现自动生成pdf word文件

    7. **版本控制**:提供的不同版本的iText(如`iText-2.1.5.jar`和`itextpdf-5.3.2.jar`)代表了库的发展历程,每个新版本通常包含改进和新功能。 8. **源码和文档**:`itextpdf-5.3.2-sources.jar`包含了源代码,...

    itext生成PDF开发文档

    import com.itextpdf.kernel.pdf.PdfDocument; import com.itextpdf.kernel.pdf.PdfWriter; import com.itextpdf.layout.Document; public class create_PDF { public static void main(String args[]) throws ...

    itext5生成PDF(含水印文字及图片)

    itext5生成PDF(含水印文字及图片)的源代码,操作说明详细,代码完整可用。

    使用itext生成pdf需要的jar包

    1. iText主库:`itextpdf-版本号.jar` - 这是iText的核心库,包含了生成PDF的所有基本功能。 2. Bouncy Castle库:`bcprov-jdk15on-版本号.jar` - iText在处理加密和数字签名时依赖Bouncy Castle库,因此需要将其...

    JAVA使用itextpdf实现HTML转PDF

    本主题聚焦于使用Java的iTextPDF库来完成这个任务。iTextPDF是一个强大的Java库,允许开发人员创建、修改和优化PDF文档。 首先,我们需要了解HTML和PDF之间的差异。HTML是一种标记语言,用于构建和设计网页,而PDF...

    itextpdf 解决中文不显示问题

    itextpdf 再创将pdf格式文件的时候中文不显示或者乱码问题的解决 其实目前最新版本的itexpdf即使加了asian的辅助包也不能解决中文不显示问题 因为自己试过 可能方式不对 这个绝对显示 显示不了的 分不要

    Itext生成PDF所需要的最全Jar包

    - `itextpdf`:这个模块是Itext的主要接口,包含了生成PDF所需的主要API。你可以使用这些API创建新的PDF文档,或者对已有的PDF进行操作。 在实际使用中,你需要将这些Jar包添加到你的项目类路径中,然后就可以通过...

    itextpdf实现对pdf操作的工具类

    * 提供的方法 * 1、pdf追加pdf * 2、pdf插入pdf 指定序列号下 ...* 9、批量pdf合成一份pdf并生成目录 pom引入 &lt;groupId&gt;com.itextpdf&lt;/groupId&gt; &lt;artifactId&gt;itextpdf &lt;version&gt;5.5.12 &lt;/dependency&gt;

    itextpdf -5.1.0 jar

    itextpdf-5.1.0.jar itextpdf jar; 使用java生成pdf文档需要使用该jar包

    itext5.5.10生成PDF

    本文将深入探讨iText 5.5.10在生成PDF方面的核心概念和常用方法,以及如何通过实例来理解和应用这些知识。 首先,生成PDF的基本流程包括创建PdfWriter对象、定义PdfDocument对象和添加内容。在iText中,`PdfWriter`...

    itext生成pdf报表的小demo

    &lt;artifactId&gt;itextpdf &lt;version&gt;5.5.13 ``` 这个版本的iText提供了创建PDF文档所需的基本功能。 接下来,我们来看看如何生成PDF报表。首先,创建一个新的PDF文档需要一个`Document`对象,这将作为整个PDF的容器...

    java itext生成PDF文件

    首先,`itextpdf-5.5.10.jar`是iText库的核心组件,包含了生成和操作PDF的基本功能。这个版本的iText支持PDF 1.7规范,提供了丰富的API来创建复杂的PDF文档。例如,你可以使用它创建文本、图像、链接、表单字段等...

Global site tag (gtag.js) - Google Analytics