itextpdf导出pdf格式数据,添加水印

import java.io.IOException;

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.Phrase;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.ColumnText;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfGState;
import com.itextpdf.text.pdf.PdfPageEventHelper;
import com.itextpdf.text.pdf.PdfWriter;

public class PdfFileExportUtil {

    private static Font pdf8Font = null;

    private static Font pdf20Font = null;

    /**
     * 
     * 设置PDF创建者信息
     * 
     * @param pdfDocument
     */

    public static Document setCreatorInfo(Document pdfDocument) {

        if (pdfDocument == null) {

            return null;

        }

        // 文档属性
        pdfDocument.addTitle("XX公司PDF文档");
        pdfDocument.addAuthor("XXX公司");
        pdfDocument.addSubject("XX分析页");
        pdfDocument.addKeywords("综合分析");// 文档关键字信息
        pdfDocument.addCreator("XX数据平台");// 应用程序名称
        return pdfDocument;
    }

    /**
     * 
     * 获取中文字符集且是8号字体,常用作表格内容的字体格式
     * 
     * @param fullFilePath
     */

    public static Font getChinese8Font() throws DocumentException, IOException {
        final String os1 = System.getProperty("os.name").toLowerCase();
        BaseFont bfChinese=null;
        if (pdf8Font == null) {
            // 设置中文字体和字体样式
            if("linux".equals(os1)){//此处使用系统字体
                bfChinese=BaseFont.createFont("/usr/share/fonts/chinese/TrueType/ukai.ttf", 
                        BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
            }else{
                bfChinese = BaseFont.createFont("c:\\windows\\fonts\\simkai.ttf",
                        BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
            }
            pdf8Font = new Font(bfChinese, 8, Font.NORMAL);

        }

        return pdf8Font;
    }

    /**
     * 
     * 获取中文字符集且是8号字体,常用作文字水印信息
     * 
     * @param fullFilePath
     */

    public static Font getChinese20Font() throws DocumentException, IOException {
        final String os1 = System.getProperty("os.name").toLowerCase();
        BaseFont bfChinese=null;
        if (pdf20Font == null) {
            // 设置中文字体和字体样式
            if("linux".equals(os1)){
                bfChinese=BaseFont.createFont("/usr/share/fonts/chinese/TrueType/ukai.ttf", 
                        BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
            }else{
                bfChinese = BaseFont.createFont("c:\\windows\\fonts\\simkai.ttf",
                        BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
            }
            pdf20Font = new Font(bfChinese);
            pdf20Font.setSize(20);
            pdf20Font.setColor(BaseColor.LIGHT_GRAY);
        }

        return pdf20Font;
    }

    /**
     * 
     * 设置成只读权限
     * 
     * @param pdfWriter
     */

    public static PdfWriter setReadOnlyPDFFile(PdfWriter pdfWriter)
            throws DocumentException {

        pdfWriter.setEncryption(null, null, PdfWriter.ALLOW_PRINTING,
                PdfWriter.STANDARD_ENCRYPTION_128);

        return pdfWriter;
    }

    /**
     * 
     * 变更一个图片对象的展示位置和角度信息
     * 
     * @param waterMarkImage
     * 
     * @param xPosition
     * 
     * @param yPosition
     * 
     * @return
     */

    public static Image getWaterMarkImage(Image waterMarkImage,
            float xPosition, float yPosition) {

        waterMarkImage.setAbsolutePosition(xPosition, yPosition);// 坐标

        waterMarkImage.setRotation(-20);// 旋转 弧度

        waterMarkImage.setRotationDegrees(-45);// 旋转 角度

        waterMarkImage.scalePercent(100);// 依照比例缩放
        return waterMarkImage;
    }

    /**
     * 
     * 为PDF分页时创建添加文本水印的事件信息
     */

    public class TextWaterMarkPdfPageEvent extends PdfPageEventHelper {

        private String waterMarkText;

        public TextWaterMarkPdfPageEvent(String waterMarkText) {

            this.waterMarkText = waterMarkText;

        }

        public void onEndPage(PdfWriter writer, Document document) {

            try {

                float pageWidth = document.right() + document.left();// 获取pdf内容正文页面宽度

                float pageHeight = document.top() + document.bottom();// 获取pdf内容正文页面高度

                // 设置水印字体格式

                Font waterMarkFont = PdfFileExportUtil.getChinese20Font();

                PdfContentByte waterMarkPdfContent = writer.getDirectContent();//决定了水印图层高低
                Phrase phrase = new Phrase(waterMarkText, waterMarkFont);
                for(int i = 0 ; i < 100; i ++){
                    for(int j = 0 ; j < 20 ; j ++ ){
                        ColumnText.showTextAligned(waterMarkPdfContent,Element.ALIGN_CENTER, phrase,pageWidth * 0.8f * j, pageHeight * 0.16f * i, 45);
                    }
                }

            } catch (DocumentException de) {

                de.printStackTrace();

                System.err.println("pdf watermark font:" + de.getMessage());

            } catch (IOException de) {

                de.printStackTrace();

                System.err.println("pdf watermark font:" + de.getMessage());

            }

        }

    }

    /**
     * 
     * 为PDF分页时创建添加图片水印的事件信息
     */

    public class PictureWaterMarkPdfPageEvent extends PdfPageEventHelper {

        private String waterMarkFullFilePath;

        private Image waterMarkImage;

        public PictureWaterMarkPdfPageEvent(String waterMarkFullFilePath) {

            this.waterMarkFullFilePath = waterMarkFullFilePath;

        }

        public void onEndPage(PdfWriter writer, Document document) {

            try {

                float pageWidth = document.right() + document.left();// 获取pdf内容正文页面宽度

                float pageHeight = document.top() + document.bottom();// 获取pdf内容正文页面高度

                PdfContentByte waterMarkPdfContent = writer.getDirectContent();

                // 仅设置一个图片实例对象,整个PDF文档只应用一个图片对象,极大减少因为增加图片水印导致PDF文档大小增加

                if (waterMarkImage == null) {

                    waterMarkImage = Image.getInstance(waterMarkFullFilePath);

                }
                // 添加水印图片,文档正文内容采用横向三列,竖向两列模式增加图片水印
                for(int i = 0 ; i < 100; i ++){
                    for(int j = 0 ; j < 4 ; j ++ ){
                        waterMarkPdfContent.addImage(getWaterMarkImage(waterMarkImage,pageWidth * 0.3f * j , pageHeight * 0.05f * i));
                    }
                }

                PdfGState gs = new PdfGState();
                gs.setFillOpacity(0.8f);// 设置透明度为0.2
                gs.setStrokeOpacity(0.8f);
                gs.setOverPrintStroking(true);
                waterMarkPdfContent.setGState(gs);

            } catch (DocumentException de) {

                de.printStackTrace();

                System.err.println("pdf watermark font:" + de.getMessage());

            } catch (IOException de) {

                de.printStackTrace();

                System.err.println("pdf watermark font:" + de.getMessage());

            }

        }

    }

    /**
     * 
     * 为PDF分页时创建添加header和footer信息的事件信息
     */

    public class HeadFootInfoPdfPageEvent extends PdfPageEventHelper {

        public HeadFootInfoPdfPageEvent() {

        }

        public void onEndPage(PdfWriter writer, Document document) {

            try {

                PdfContentByte headAndFootPdfContent = writer
                        .getDirectContent();
                
                headAndFootPdfContent.saveState();

                headAndFootPdfContent.beginText();
                final String os1 = System.getProperty("os.name").toLowerCase();
                BaseFont bfChinese=null;
                if("linux".equals(os1)){
                    bfChinese=BaseFont.createFont("/usr/share/fonts/chinese/TrueType/ukai.ttf", 
                            BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
                }else{
                    bfChinese = BaseFont.createFont("c:\\windows\\fonts\\simkai.ttf",
                            BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
                }

                headAndFootPdfContent.setFontAndSize(bfChinese, 10);

                // 文档页头信息设置

                float x = document.top(-20);

                // 页头信息左面

                headAndFootPdfContent.showTextAligned(
                        PdfContentByte.ALIGN_LEFT,

                        "综合分析",

                        document.left(), x, 0);

                // 页头信息中间

                headAndFootPdfContent.showTextAligned(
                        PdfContentByte.ALIGN_CENTER,

                        "第" + writer.getPageNumber() + "页",

                        (document.right() + document.left()) / 2,

                        x, 0);

                // 页头信息右面

                headAndFootPdfContent.showTextAligned(
                        PdfContentByte.ALIGN_RIGHT,

                        "XXX公司",

                        document.right(), x, 0);

                // 文档页脚信息设置

                float y = document.bottom(-20);

                // 页脚信息左面

                headAndFootPdfContent.showTextAligned(
                        PdfContentByte.ALIGN_LEFT,

                        "--",

                        document.left(), y, 0);

                // 页脚信息中间

                headAndFootPdfContent.showTextAligned(
                        PdfContentByte.ALIGN_CENTER,

                        "-",

                        (document.right() + document.left()) / 2,

                        y, 0);

                // 页脚信息右面

                headAndFootPdfContent.showTextAligned(
                        PdfContentByte.ALIGN_RIGHT,

                        "--",

                        document.right(), y, 0);

                headAndFootPdfContent.endText();

                headAndFootPdfContent.restoreState();

            } catch (DocumentException de) {

                de.printStackTrace();

                System.err.println("pdf watermark font:" + de.getMessage());

            } catch (IOException de) {

                de.printStackTrace();

                System.err.println("pdf watermark font:" + de.getMessage());

            }

        }

    }
}

//resultlist为pdf表格中数据

public String exportPdf(String title,List resultlist,String fileName,HttpServletResponse response){
        try{
            String waterMarkName="XXX";
        // 第一步,实例化一个document对象  
          Document document = new Document();  
          // 第三步,设置字符  
          BaseFont bfChinese=null;
          final String os1 = System.getProperty("os.name").toLowerCase();
          System.out.println("=============================="+os1);
            // 设置中文字体和字体样式
          if("linux".equals(os1)){
                bfChinese=BaseFont.createFont("/usr/share/fonts/chinese/TrueType/ukai.ttf", 
                        BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
          }else{
                bfChinese = BaseFont.createFont("c:\\windows\\fonts\\simkai.ttf",
                        BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
          }
          Font fontZH = new Font(bfChinese, 12.0F, 0);  
          //如果是浏览器通过request请求需要在浏览器中输出则使用下面方式  
          ByteArrayOutputStream buff=new ByteArrayOutputStream();
          // 第四步,将pdf文件输出到磁盘  
          PdfWriter writer = PdfWriter.getInstance(document, buff);
          //writer=PdfFileExportUtil.setReadOnlyPDFFile(writer);
          // 第五步,打开生成的pdf文件  
          document.open();
          PdfFileExportUtil pdfFileExportUtil = new PdfFileExportUtil();
          //添加水印
          writer.setPageEvent(pdfFileExportUtil.new TextWaterMarkPdfPageEvent("XXXXXXXX"));
          //添加页眉页脚
          //writer.setPageEvent(pdfFileExportUtil.new HeadFootInfoPdfPageEvent());
          // 第六步,设置内容  
          document.add(new Paragraph(new Chunk(title, fontZH).setLocalDestination(title)));  
          document.add(new Paragraph("\n"));  
          // 创建table,注意这里的9是9列的意思,下面通过table.addCell添加的时候必须添加整行内容的所有列  
          PdfPTable table = new PdfPTable(9);  
          //table.setWidthPercentage(100.0F);
          //table.setTotalWidth(1000.0F);//设置表格的总宽度
          table.setTotalWidth(new float[] {50.0F,50.0F,70.0F,100.0F,50.0F,50.0F,50.0F,50.0F,50.0F});//设置表格的各列宽度
          //table.setWidths(new int[] {1,1,1,2,1,1,1,1,1});
          table.setLockedWidth(true);
          table.setHeaderRows(1);  
          table.getDefaultCell().setHorizontalAlignment(1);  
          table.addCell(new Paragraph("X1", fontZH));  
          table.addCell(new Paragraph("X2", fontZH));  
          table.addCell(new Paragraph("X3", fontZH));
          int record=resultlist.size();
            for (int i = 0; i < record; i++) {
                Object[] objArr =(Object[]) resultlist.get(i);
                for(int j=0;j<objArr.length;j++){                
                    table.addCell(new Paragraph(objArr[j] == null ? "" : objArr[j].toString(),fontZH));
                }
            }
          document.add(table);  
          document.add(new Paragraph("\n"));
          document.add(new Paragraph(new Chunk(title, fontZH).setLocalDestination(title2)));  
          document.add(new Paragraph("\n"));  
          // 第七步,关闭document  
          document.close();
          iStream=new ByteArrayInputStream(buff.toByteArray());
          response.reset();
            response.setContentType("application/x-msdownload;charset=utf-8");
            response.setHeader("Content-Disposition", "attachment;filename=" + new String((fileName+ ".pdf").getBytes("gbk"), "iso-8859-1"));
            ServletOutputStream oStream = response.getOutputStream();
            BufferedInputStream bis = null;
            BufferedOutputStream bos = null;
            try {
                bis = new BufferedInputStream(iStream);
                bos = new BufferedOutputStream(oStream);
                byte[] buffer = new byte[2048];
                int bytesRead;
                while(-1 != (bytesRead = bis.read(buffer,0,buffer.length))){
                    bos.write(buffer,0 ,bytesRead);
                }
            } catch (Exception e) {
                throw e;
            } finally {
                try {
                    if(bis != null){
                        bis.close();
                    }
                    if(bos != null){
                        bos.close();
                    }
                    if(iStream != null){
                        iStream.close();
                    }
                    if(oStream != null){
                        oStream.close();
                    }
                    if(buff != null){
                        buff.close();
                    }
                } catch (Exception e2) {
                    e2.printStackTrace();
                }

            }
        }catch(Exception e){
            e.getStackTrace();
        }
        return "success";
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值