java生成pdf并下载(添加图片及水印)

java生成pdf并下载(添加图片及水印)

首先pom文件需要导入下面两个包

<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itextpdf</artifactId>
    <version>5.5.13</version>
</dependency>

<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itext-asian</artifactId>
    <version>5.2.0</version>
</dependency>

controller加入以下方法就可以实现功能了

@RequestMapping(value = "/downLoadPdf")
public void download(HttpServletResponse response, HttpServletRequest request) throws Exception{
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        /* 解决中文无法显示:使用iTextAsian.jar包中的字体 */
        BaseFont baseFont = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
        Font font_normal = new Font(baseFont, 18, Font.NORMAL);
        Font font_normal2 = new Font(baseFont, 14, Font.NORMAL);
        Font font_bold = new Font(baseFont, 12, Font.BOLD);
        /*时间*/
        Date date = new Date();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy日MM月dd日");
        String format = simpleDateFormat.format(date);
        /* 第一步 创建文档实例 自定义页面大小使用 */
        com.itextpdf.text.Document document = new com.itextpdf.text.Document(PageSize.A4);
        /* 第二步 获取PdfWriter实例 */
        PdfWriter writer = PdfWriter.getInstance(document, baos);
        //PdfWriter.getInstance(document, baos);
        document.setMargins(64, 64, 36, 36);
        /* 第三步 打开文档 */
        document.open();
        /* 第四步 添加段落内容 */
        Paragraph paragraph = new Paragraph("你想写的标题\n" + "", new Font(baseFont, 25, Font.BOLD));
        paragraph.setAlignment(Element.ALIGN_CENTER);
        paragraph.setSpacingAfter(10);
        document.add(paragraph);
        paragraph = new Paragraph("          兹证明_XXX_(身份证号码 XXXXX)系我司员工,其工号_XXXX_,所属单位_XXXX_,特此证明,用于申请优惠购车。", font_normal);
        document.add(paragraph);
        paragraph = new Paragraph(" \n"+"          有效期1个月", font_normal2);
        document.add(paragraph);
        String kg = "                                                                                       ";
        paragraph = new Paragraph(" \n"+kg +"XXXX有限公司工会委员会", font_normal2);
        document.add(paragraph);
        paragraph = new Paragraph(kg +"下载日期:"+format, font_normal2);
        document.add(paragraph);

        //创建一个image对象.  
        Image image = Image.getInstance("你想导入的图片路径");     //图片
        //设置image对象的输出位置pa.getAsNumber(pa.size()-1).floatValue() 是该页pdf坐标轴的y轴的最大值  
        image.setAbsolutePosition(400, 430);//图片的X轴和Y轴
        image.scaleAbsolute(120,120);//图片大小
        document.add(image);
        OutputStream out = null;
        try {
            float pageWidth = document.right()+document.left();//获取pdf内容正文页面宽度
            float pageHeight = document.top()+document.bottom();//获取pdf内容正文页面高度
            //设置水印字体格式
            BaseFont base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);
            Font waterMarkFont = new Font(base, 15, Font.BOLD, BaseColor.LIGHT_GRAY);
            PdfContentByte waterMarkPdfContent = writer.getDirectContentUnder();
            Phrase phrase = new Phrase("我是水印", waterMarkFont);
            //5行6列
            for (double i=0;i<1;i+=0.2){
                float f = (float) (0.1+i);
                for (double j=0;j<1d;j+=0.15){
                    float h = (float) (0.2+j);
                    ColumnText.showTextAligned(waterMarkPdfContent,Element.ALIGN_CENTER,phrase,
                            pageWidth*f,pageHeight*h,45);
                }
            }
            /*//两行三列
            ColumnText.showTextAligned(waterMarkPdfContent,Element.ALIGN_CENTER,phrase,
                    pageWidth*0.25f,pageHeight*0.2f,45);
            ColumnText.showTextAligned(waterMarkPdfContent,Element.ALIGN_CENTER,phrase,
                    pageWidth*0.25f,pageHeight*0.5f,45);
            ColumnText.showTextAligned(waterMarkPdfContent, Element.ALIGN_CENTER,phrase,
                    pageWidth*0.25f,pageHeight*0.8f,45);
            ColumnText.showTextAligned(waterMarkPdfContent,Element.ALIGN_CENTER,phrase,
                    pageWidth*0.65f,pageHeight*0.2f,45);
            ColumnText.showTextAligned(waterMarkPdfContent,Element.ALIGN_CENTER,phrase,
                    pageWidth*0.65f,pageHeight*0.5f,45);
            ColumnText.showTextAligned(waterMarkPdfContent,Element.ALIGN_CENTER,phrase,
                    pageWidth*0.65f,pageHeight*0.8f,45);*/

            document.close();

            //设置请求返回类型
            response.setHeader("Content-Disposition", "attachment; filename=" + new String("我是你想要的.pdf".getBytes(), StandardCharsets.ISO_8859_1));
            response.setContentLength(baos.size());
            out = response.getOutputStream();
            baos.writeTo(out);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            out.flush();
            out.close();
        }
}

前端这样写

function downloadFile() {
      window.location.href = "填写你的地址";
         }

自己也是折腾了很久,在网上找了很多例子,都是读取已有的pdf,在已有的pdf上添加图片或者是添加水印的。实在没办法,自己研究了几天,终于是实现了。

加上这些就能生成,绝对没有问题,祝各位用的开心。
转载请标明出处。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值