Java中Itext生成Pdf,并给PdfCell添加图片

这篇具有很好参考价值的文章主要介绍了Java中Itext生成Pdf,并给PdfCell添加图片。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Java中Itext生成Pdf,并给PdfCell添加图片

1. 页眉页脚类 _ 根据实际情况使用,如不需要可忽略此步

package com.mediinfo.test;

import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;

import java.io.IOException;
import java.util.Date;

@Slf4j
public class PdfHeaderFooter extends PdfPageEventHelper {

    private final static String FONT_PATH = "c:\\windows\\fonts\\SIMSUN.TTC,1";
    private final static String logoPath = "D:\\1.jpg";

    //总页码使用的模板对象
    public PdfTemplate totalNumTemplate = null;

    /**
     * 重写页面结束时间  分别添加页眉、页脚
     */
    public void onEndPage(PdfWriter writer, Document docment){
        try{
            this.addPageHeader(writer, docment);
        }catch(Exception e){
            log.error("添加页眉出错", e);
        }

        try{
            this.addPageFooter(writer, docment);
        }catch(Exception e){
            log.error("添加页脚出错", e);
        }
    }

    /**
     * 页眉
     */
    private void addPageHeader(PdfWriter writer, Document docment) throws IOException, DocumentException {
        BaseFont BASE_FONT = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", false);

        //创建字体
        Font textFont = new Font(BASE_FONT, 10f);

        //两列  一列logo  一列项目简称   有Logo时添加图片,没有时添加个空值,避免报错
        PdfPTable table = new PdfPTable(2);
        //设置表格宽度 A4纸宽度减去两个边距  比如我一边30  所以减去60
        table.setTotalWidth(PageSize.A4.getWidth()-60);

        //logo
        //创建图片对象
        try {
            Image logo = Image.getInstance(logoPath);
            //创建一个Phrase对象 再添加一个Chunk对象进去  Chunk里边是图片
            Phrase logoP = new Phrase("", textFont);
            //自己调整偏移值 主要是y轴值
            logoP.add(new Chunk(logo, 0, -5));
            PdfPCell logoCell = new PdfPCell(logoP);
            //只保留底部边框和设置高度
            logoCell.disableBorderSide(13);
            logoCell.setFixedHeight(20);
            table.addCell(logoCell);
        }catch (IOException e){
            Phrase nameP = new Phrase("", textFont);
            PdfPCell nameCell = new PdfPCell(nameP);
            nameCell.disableBorderSide(13);
            nameCell.setFixedHeight(20);
            table.addCell(nameCell);
        }

        Phrase nameP = new Phrase("页眉右上角显示的内容", textFont);
        PdfPCell nameCell = new PdfPCell(nameP);
        //只保留底部边框和设置高度 设置水平居右和垂直居中
        nameCell.disableBorderSide(13);
        nameCell.setFixedHeight(20);
        nameCell.setHorizontalAlignment(Element.ALIGN_RIGHT);
        nameCell.setVerticalAlignment(Element.ALIGN_MIDDLE);
        table.addCell(nameCell);

        //再把表格写到页眉处  使用绝对定位
        table.writeSelectedRows(0, -1, 30, PageSize.A4.getHeight()-5, writer.getDirectContent());
    }

    /**
     * 页脚
     */
    private void addPageFooter(PdfWriter writer, Document docment) throws DocumentException, IOException {

        BaseFont BASE_FONT = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", false);
        //创建字体
        Font textFont = new Font(BASE_FONT, 10f);

        //三列  一列导出人  一列页码   一列时间
        PdfPTable table = new PdfPTable(3);
        //设置表格宽度 A4纸宽度减去两个边距  比如我一边30  所以减去60
        table.setTotalWidth(PageSize.A4.getWidth()-60);
        //仅保留顶部边框
        table.getDefaultCell().disableBorderSide(14);
        table.getDefaultCell().setFixedHeight(40);
        table.getDefaultCell().setVerticalAlignment(Element.ALIGN_MIDDLE);

        //导出人
        table.addCell(new Phrase("admin", textFont));

        //页码
        //初始化总页码模板
        if(null == totalNumTemplate){
            totalNumTemplate = writer.getDirectContent().createTemplate(30, 16);
        }
        //再嵌套一个表格 一左一右  左边当前页码 右边总页码 
        PdfPTable pageNumTable = new PdfPTable(2);
        pageNumTable.setTotalWidth(new float[]{80f, 80f});
        pageNumTable.setLockedWidth(true);
        pageNumTable.setPaddingTop(-5f);
        //第一列居右
        pageNumTable.getDefaultCell().disableBorderSide(15);
        pageNumTable.getDefaultCell().setFixedHeight(16);
        pageNumTable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_RIGHT);
        pageNumTable.getDefaultCell().setVerticalAlignment(Element.ALIGN_BOTTOM);
        pageNumTable.addCell(new Phrase(writer.getPageNumber()+" / ", textFont));
        //第二列居左
        Image totalNumImg = Image.getInstance(totalNumTemplate);
        totalNumImg.setPaddingTop(-5f);
        pageNumTable.getDefaultCell().setPaddingTop(-18f);
        pageNumTable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_LEFT);
        pageNumTable.getDefaultCell().setVerticalAlignment(Element.ALIGN_TOP);
        pageNumTable.addCell(totalNumImg);
        //把页码表格添加到页脚表格
        table.addCell(pageNumTable);

        //日期
        table.addCell(new Phrase(String.valueOf(new Date()), textFont));

        //再把表格写到页脚处  使用绝对定位
        table.writeSelectedRows(0, -1, 30, 40, writer.getDirectContent());
    }

    /**
     * 文档关闭事件
     */
    @SneakyThrows
    @Override
    public void onCloseDocument(PdfWriter writer, Document docment){
        BaseFont BASE_FONT = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", false);
        //创建字体
        Font textFont = new Font(BASE_FONT, 10f);
        //将最后的页码写入到总页码模板
        String totalNum = writer.getPageNumber() + "页";
        totalNumTemplate.beginText();
        totalNumTemplate.setFontAndSize(BASE_FONT, 5f);
        totalNumTemplate.showText(totalNum);
        totalNumTemplate.setHeight(16f);
        totalNumTemplate.endText();
        totalNumTemplate.closePath();
    }
}

2. Pdf生成 [ PdfCell添加图片参考createHardwarePDF方法的第九行nineRowTalbe ]

package com.mediinfo.test;

import com.itextpdf.text.*;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;

import java.io.*;

public class PdfUtils {

    //使用例子
    public static void main(String[] args) throws Exception {
        createHardwarePDF("d:/test.pdf");
    }

    /**
     * 新建以下两个方法,创建表格内的字体和样式的方法
     *
     * @param str  内容
     * @param font 字体对象
     * @param high 表格高度
     * @return
     * @Param alignCenter 是否水平居中
     * @Param alignMidde  是否垂直居中
     */
    private static PdfPCell mircoSoftFont(String str, Font font, int high, boolean alignCenter, boolean alignMidde) {
        PdfPCell pdfPCell = new PdfPCell(new Phrase(str, font));
        pdfPCell.setMinimumHeight(high);
        pdfPCell.setUseAscender(true); // 设置可以居中
        if (alignCenter) {
            pdfPCell.setHorizontalAlignment(PdfPCell.ALIGN_CENTER); // 设置水平居中
        }
        if (alignMidde) {
            pdfPCell.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); // 设置垂直居中
        }
        return pdfPCell;
    }

    /**
     * @param str  字符串
     * @param font 字体
     * @param high 表格高度
     * @return
     * @Param alignCenter 是否水平居中
     * @Param alignMidde  是否垂直居中
     * @Param haveColor 是否有背景色(灰色)
     */
    private static PdfPCell mircoSoftFont(String str, Font font, int high, boolean alignCenter, boolean alignMidde, boolean haveColor) {
        PdfPCell pdfPCell = new PdfPCell(new Phrase(str, font));
        pdfPCell.setMinimumHeight(high);
        pdfPCell.setUseAscender(true); // 设置可以居中
        if (alignCenter) {
            pdfPCell.setHorizontalAlignment(PdfPCell.ALIGN_CENTER); // 设置水平居中
        }
        if (alignMidde) {
            pdfPCell.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); // 设置垂直居中
        }
        if (haveColor) {
            //颜色代码 RGB
            pdfPCell.setBackgroundColor(new BaseColor(217, 217, 217));
        }
        return pdfPCell;
    }

    /*
    将图片插入到PdfCell
     */
//    private static PdfPCell mircoSoftFont(byte[] iamgeBytes, int high) throws Exception {
    private static PdfPCell ImageSet(int high) throws Exception {
        byte[] fileByte = toByteArray("D:\\2.jpg");
        Jpeg jpeg = new Jpeg(fileByte);
        jpeg.scaleAbsolute(70, 50);

        PdfPCell pdfPCell = new PdfPCell(jpeg);
        pdfPCell.setMinimumHeight(high);
        pdfPCell.setUseAscender(true); // 设置可以居中
        pdfPCell.setHorizontalAlignment(PdfPCell.ALIGN_CENTER); // 设置水平居中
        pdfPCell.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); // 设置垂直居中
        return pdfPCell;
    }


    /*
    生成Pdf文档
     */
    public static void createHardwarePDF(String outputPath) throws Exception {
        //新建文档对象,页大小为A4纸,然后设置4个边距
        Document document = new Document(PageSize.A4, 20, 20, 30, 30);
        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(outputPath));

        //创建字体
        BaseFont baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
        //字体对象
        Font size14font = new Font(baseFont, 14, Font.NORMAL);  //大小为14的正常字体
        Font size10font = new Font(baseFont, 10, Font.BOLD); //大小为10的粗体
        document.open();

        // 添加页眉和页码  Add By Zhaof 2022-11-16 实测可用
        // 要修改页眉页脚显示的内容,直接修改PdfHeaderFooterEvent对象的页眉页脚内容即可;
        PdfHeaderFooter event = new PdfHeaderFooter();
        writer.setPageEvent(event);

        //添加标题
        PdfPTable tableName = new PdfPTable(1);
        tableName.setWidthPercentage(90);  //设置标题长度占纸张比例

        PdfPCell titleCell = mircoSoftFont("个人信息", size14font, 80, true, true);
        titleCell.disableBorderSide(15);
        tableName.addCell(titleCell);
        document.add(tableName);
        //添加第二行的数据
        PdfPTable secondRowTable = new PdfPTable(3); //三列的意思
        secondRowTable.setWidthPercentage(90);
        //这里的数组长度是上面创建的列数,数组的总和为1,就是按比例划分的意思
        secondRowTable.setTotalWidth(new float[]{0.18f, 0.32f, 0.5f});
        secondRowTable.addCell(mircoSoftFont(" 姓名: ", size10font, 50, false, true));
        secondRowTable.addCell(mircoSoftFont("李晓明", size10font, 50, false, true));
        secondRowTable.addCell(mircoSoftFont(" 出生日期: 1994年3月14日", size10font, 50, false, true));
        document.add(secondRowTable);
        //第三行数据
        PdfPTable thirdRowTable = new PdfPTable(3);
        thirdRowTable.setWidthPercentage(90);
        thirdRowTable.setTotalWidth(new float[]{0.18f, 0.32f, 0.5f});
        thirdRowTable.addCell(mircoSoftFont(" 名族:", size10font, 50, false, true));
        thirdRowTable.addCell(mircoSoftFont("汉族", size10font, 50, false, true));
        thirdRowTable.addCell(mircoSoftFont(" 联系电话: 13888880000", size10font, 50, false, true));
        document.add(thirdRowTable);
        //第四行数据
        PdfPTable fourthRowTable = new PdfPTable(2);
        fourthRowTable.setWidthPercentage(90);
        fourthRowTable.setTotalWidth(new float[]{0.66f, 0.34f});
        fourthRowTable.addCell(mircoSoftFont(" 个人描述 :", size10font, 175, false, false));
        fourthRowTable.addCell(mircoSoftFont("个人特长 :", size10font, 175, false, false));
        document.add(fourthRowTable);
        //第五行
        PdfPTable fifthDetailName = new PdfPTable(1);
        fifthDetailName.setWidthPercentage(90);
        fifthDetailName.addCell(mircoSoftFont("获奖记录 :", size14font, 50, true, true));
        document.add(fifthDetailName);
        //第六行
        PdfPTable sisthRowTalbe = new PdfPTable(1);
        sisthRowTalbe.setWidthPercentage(90);
        sisthRowTalbe.addCell(mircoSoftFont(" 联系地址: " + "广东省广州市天河区XXXXXXXXXXXXXXXXXX", size10font, 50, false, true));
        document.add(sisthRowTalbe);
        PdfPTable seventhRowTalbe = new PdfPTable(1);
        seventhRowTalbe.setWidthPercentage(90);
        seventhRowTalbe.addCell(mircoSoftFont(" 毕业院校 ", size14font, 60, true, true));
        document.add(seventhRowTalbe);
        //第八行
        PdfPTable eiththRowTalbe = new PdfPTable(3);
        eiththRowTalbe.setWidthPercentage(90);
        eiththRowTalbe.setTotalWidth(new float[]{0.3f, 0.5f, 0.2f});
        eiththRowTalbe.addCell(mircoSoftFont(" 毕业学校", size10font, 50, true, true, true));
        eiththRowTalbe.addCell(mircoSoftFont(" 就读日期", size10font, 50, true, true, true));
        eiththRowTalbe.addCell(mircoSoftFont(" 联系人", size10font, 50, true, true, true));
        document.add(eiththRowTalbe);
        //接下来加List
        String school = "XXX学校";
        String time = "201909  -  2022-06";
        String name = "陈某";
        for (int i = 0; i < 2; i++) {
            PdfPTable tempTable = new PdfPTable(3);
            tempTable.setWidthPercentage(90);
            tempTable.setTotalWidth(new float[]{0.3f, 0.5f, 0.2f});
            tempTable.addCell(mircoSoftFont(school, size10font, 50, true, true));
            tempTable.addCell(mircoSoftFont(time, size10font, 50, true, true));
            tempTable.addCell(mircoSoftFont(name, size10font, 50, true, true));
            document.add(tempTable);
        }

        // 第九行,添加图片
        PdfPTable nineRowTalbe = new PdfPTable(3);
        nineRowTalbe.setWidthPercentage(90);
        nineRowTalbe.setTotalWidth(new float[]{0.3f, 0.5f, 0.2f});
        nineRowTalbe.addCell(mircoSoftFont(" test1", size10font, 50, true, true));
        nineRowTalbe.addCell(mircoSoftFont(" test222", size10font, 50, true, true));
        nineRowTalbe.addCell(ImageSet(50));   // 给PdfCell添加图片
        document.add(nineRowTalbe);

        document.close();
        writer.close();
    }



    public static byte[] toByteArray(String filename) throws IOException {

        File f = new File(filename);
        if (!f.exists()) {
            throw new FileNotFoundException(filename);
        }

        ByteArrayOutputStream bos = new ByteArrayOutputStream((int) f.length());
        BufferedInputStream in = null;
        try {
            in = new BufferedInputStream(new FileInputStream(f));
            int buf_size = 1024;
            byte[] buffer = new byte[buf_size];
            int len = 0;
            while (-1 != (len = in.read(buffer, 0, buf_size))) {
                bos.write(buffer, 0, len);
            }
            return bos.toByteArray();
        } catch (IOException e) {
            e.printStackTrace();
            throw e;
        } finally {
            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            bos.close();
        }
    }




}

3. 实现效果如下图

java生成pdf文件添加图片,Java相关,java,pdf文章来源地址https://www.toymoban.com/news/detail-571175.html

到了这里,关于Java中Itext生成Pdf,并给PdfCell添加图片的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【生成PDF】【JAVA】纯后台生成Echarts图片,并将图片生成到PDF文档

    目录 前言 一、如何后台生成Echarts图片? 1.PhantomJS 2.PhantomJS的下载  3.用phantomjs调用echarts-converts.js生成图片 二、Java如何将Echarts图生成到PDF 1.生成PDF依赖 2.Java代码测试例子:  3.测试结果   三、下载生成的PDF ReportFormUtil 提示:本文仅用于记录日常,多有不足,仅供参考。

    2024年02月09日
    浏览(46)
  • JAVA PDF 给PDF添加文字/图片水印(指定内容),并且设置位置

    提示:看完这个简单的demo 后就知道怎样去操作一个PDF了 文章目录 前言 一、前提准备 二、使用步骤 1.引入库 2.以下是部分代码的作用 总结 提示:操作PDF其实是一件很简单的事情,比一般的CRUD都简单 例如:我们拿到了一个需求,我需要给这个PDF设置一个 电子签名 ( 就是一

    2024年04月23日
    浏览(47)
  • 【itext7】itext7操作PDF文档之创建PDF文档、加载PDF文档、添加空白页、操作PDF页面、itext中的常见类及其方法

    这篇文章,主要介绍itext7操作PDF文档之创建PDF文档、加载PDF文档、添加空白页、操作PDF页面、itext中的常见类及其方法。 目录 一、itext7操作PDF 1.1、itext7介绍 1.2、引入itext-core依赖 1.3、创建PDF文档 1.4、加载PDF文档 1.5、操作PDF页面 1.6、添加空白页面 二、itext常见类和方法 2.1、

    2024年02月16日
    浏览(47)
  • Java 生成各种 PDF 实战方案(图片、模板、表格)

    本篇文章的重点还是在讲通过java生成pdf,其实如果是单纯的模板填充挺简单的,但是又要填充模板还要动态生成表格就比较麻烦了,因为如果在模板中画表格的框去生成的话,超过模板框的位置就会隐藏,我刚接到需求的时候也是有点难受,在网上也是找了大量的资料,研究

    2024年02月02日
    浏览(45)
  • 【Java】制作pdf模板使用后端程序填充字段生成pdf或者图片

    自行下载安装; 打开pdf文件,表单-添加或编辑域 添加文本域,调整大小,可以编辑域的名字,默认fill_1这种名字。域鼠标右键-属性,可以调整字体大小等样式,编辑好还可以锁定; 编辑好保存,这个pdf文件就可以当模板使用了; 防止中文乱码,需要在网上下载字体ttf文件

    2024年01月21日
    浏览(48)
  • 【Java】OpenPDF、iText、PDFBox 是三种常用的 PDF 处理库

    OpenPDF、iText、PDFBox 是三种常用的 PDF 处理库,它们各自具有独特的优势和特点,同时也存在一些局限性和差异。本文将对这四种库进行详细的比较,并通过代码示例来展示它们的使用。 1、OpenPDF OpenPDF 是一个用于创建和编辑 PDF 文档的 Java 库,它基于 iText 库的一个分支,提供

    2024年02月09日
    浏览(60)
  • java中使用Jsoup和Itext实现将html转换为PDF

    1.在build.gradle中安装所需依赖: 2.创建工具类,实现转换方法 3.base64过滤类: 4.字体类代码,window用户可在C:windowsfont中寻找自己所需字体即可。我这里用的为黑体: simhei.ttf 效果如下: html页面预览: pdf页面预览:    

    2024年02月14日
    浏览(37)
  • 使用itext7为pdf文档添加水印

    iText7是一款功能强大的开源PDF处理库,用于创建、编辑和处理PDF文档。相比于iTextSharp,iText7具有更先进的功能和更好的性能。 添加水印是iText7的一个常见应用场景。水印可以用于保护文档的版权,标识文档的状态或来源等。使用iText7添加水印可以通过以下步骤实现: 导入

    2024年04月22日
    浏览(37)
  • Itext生成pdf文件,html转pdf时中文一直显示不出来

    尝试好多种方式,最后可能是跟字体有关系 字体设置为C:/Windows/Fonts/simhei.ttf  黑体,同时html页面上样式要添加 pdf生成方式参考项目:E:myfilesprojectgithubdemo-html2pdf 字体问题参考文章:https://blog.51cto.com/u_15127651/4527950 最后完美解决字体问题!!

    2024年02月20日
    浏览(45)
  • Java使用ftl模板文件生成Word,以及Word转换图片或Pdf工具类

    一、写在前面 最近在项目中使用打印功能,发现这个功能我已经写过多次了,下面这个文章的发步日期在2020年,不得不感慨时间之快啊。 https://blog.csdn.net/weixin_43238452/article/details/109636200?spm=1001.2014.3001.5501 下面介绍一下应用场景:这次项目依旧是springboot项目,使用ftl模版生

    2024年02月15日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包