springboot 整合itext 实现pdf下载

news2025/1/19 3:41:28

一 itext介绍

1.1 核心组件介绍

  Text中用文本块(Chunk)、短语(Phrase)和段落(paragraph)处理文本。
 1.文本块(Chunk)是处理文本的最小单位,有一串带格式(包括字体、颜色、大小)的字符串组成。如以下代码就是产生一个字体为HELVETICA、大小为10、带下划线的字符串:
 Chunk chunk1 = new Chunk(“This text is underlined”,FontFactory.getFont(FontFactory.HELVETICA, 12, Font.UNDERLINE));

 2.短语(Phrase)由一个或多个文本块(Chunk)组成,短语(Phrase)也可以设定字体,但对于其中以设定过字体的文本块(Chunk)无效。
  通过短语(Phrase)成员函数add可以将一个文本块(Chunk)加到短语(Phrase)中,如:phrase6.add(chunk);

 3.段落(paragraph)由一个或多个文本块(Chunk)或短语(Phrase)组成,相当于WORD文档中的段落概念,同样可以设定段落的字体大小、颜色等属性。
 另外也可以设定段落的首行缩进、对齐方式(左对齐、右对齐、居中对齐)。通过函数setAlignment可以设定段落的对齐方式,s
  etAlignment的参数1为居中对齐、2为右对齐、3为左对齐,默认为左对齐。
 4.Itext中处理表格在有PDFTable,Table。对于简单在表格处理可以用Table,但如果要处理复杂的表格就需要PDFTable进行处理.
 创建表格时,必须要指定列,行则不是必须的。
  建立表格之后,可以设定表格的属性,如:边框宽度、边框颜色、衬距(padding space 即单元

格之间的间距)大小等属性。

1.2  所需要字体ttf文件见资源上传库

 1.3 pom依赖设置

<!--pdf-->
<dependency>
  <groupId>com.itextpdf</groupId>
  <artifactId>itextpdf</artifactId>
  <version>5.5.9</version>
</dependency>

二  案例实操

2.1 案例1

1.代码

package com.ljf.pdf.util;

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.FileOutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.List.*;

/**
 * @ClassName: PdfTest
 * @Description: TODO
 * @Author: admin
 * @Date: 2023/04/17 18:55:14 
 * @Version: V1.0
 **/
public class PdfTest {
 public static char checked='\u00FE';//    //http://www.alanwood.net/demos/wingdings.html
 public static char unchecked='\u00A8';

    public static void main(String[] args) {
        try {
            createAllPdf();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * 抠模板
     *
     * @throws Exception
     */
    public static void createAllPdf() throws Exception {
     //1.设置字体编码
     BaseFont windings = BaseFont.createFont("d:/Wingdings.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
     Font f12 = new Font(windings, 12f);
     Chunk check12=new Chunk((char)0x00FE,f12);
     Chunk uncheck12=new Chunk((char)0x00A8,f12);//复选框  //http://www.alanwood.net/demos/wingdings.html

     Chunk radioChecked=new Chunk((char)0x00A4,f12);
     Chunk radioUnchecked=new Chunk((char)0x00A1,f12);//单选  //http://www.alanwood.net/demos/wingdings.html
     BaseFont simFangFont=BaseFont.createFont("d:/simfang.ttf",BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);
     Font fangNormal12=new Font(simFangFont,16f,Font.NORMAL);
       // 第一步,实例化一个document对象
        Document document = new Document();
        // 第二步,设置要到出的路径
        FileOutputStream out = new FileOutputStream("D:/workbook111.pdf");
        //如果是浏览器通过request请求需要在浏览器中输出则使用下面方式
        //OutputStream out = response.getOutputStream();
        // 第三步,设置字符
        BaseFont bfChinese = BaseFont.createFont("d:/SimHei.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
        Font fontZH = new Font(bfChinese, 12.0F, 0);
       Font fontChinese1 = new Font(bfChinese, 16, Font.BOLD);

        // 第四步,将pdf文件输出到磁盘
        PdfWriter writer = PdfWriter.getInstance(document, out);
        // 第五步,打开生成的pdf文件

        document.open();
        // 第六步,设置内容
        String title = "上汽通用汽车员工租车申请表";
        //document.add(new Paragraph(new Chunk("Logo", fontZH)));
        //document.add(new Paragraph(new Chunk(title, fontZH).setLocalDestination(title)));
        PdfPTable titleTable = new PdfPTable(5);
        titleTable.setWidthPercentage(100.0F);
        //占1列
        PdfPCell logoCell = new PdfPCell(new Phrase("LOGO", fontZH));
        logoCell.setColspan(1);
        logoCell.setBorderWidthTop(0);//取消边框展示
        logoCell.setBorderWidthRight(0);
        logoCell.setBorderWidthBottom(0);
        logoCell.setBorderWidthLeft(0);

        //ClassPathResource classPathResource = new ClassPathResource("C:/Users/Anear/IdeaProjects/tutor-system/tutor-teacher-service/src/main/resources/logo/logo.png");
        Image image = Image.getInstance("d:/11.jpg");
        logoCell.setImage(image);//展示图片logo
        logoCell.setBorderWidth(120);
        logoCell.setFixedHeight(40);
        titleTable.addCell(logoCell);
        //占3列
        PdfPCell titleCell = new PdfPCell(new Phrase(title, fontChinese1));
        titleCell.setColspan(3);
        titleCell.setBorderWidthTop(0);
        titleCell.setBorderWidthRight(0);
        titleCell.setBorderWidthBottom(0);
        titleCell.setBorderWidthLeft(0);
        titleCell.setVerticalAlignment(Element.ALIGN_MIDDLE);//水平垂直居中
        titleCell.setHorizontalAlignment(Element.ALIGN_CENTER);
        titleTable.addCell(titleCell);
        document.add(titleTable);
        //占1列
        PdfPCell kongCell = new PdfPCell(new Phrase("", fontChinese1));
        kongCell.setBorderWidthTop(0);
        kongCell.setBorderWidthRight(0);
        kongCell.setBorderWidthBottom(0);
        kongCell.setBorderWidthLeft(0);
        titleTable.addCell(kongCell);
        document.add(titleTable);

        document.add(new Paragraph(new Chunk("申请日期:2021-06-01", fontZH)));
        document.add(new Paragraph("\n"));
        // 创建table,注意这里的2是两列的意思,下面通过table.addCell添加的时候必须添加整行内容的所有列
        PdfPTable table = new PdfPTable(6);
        table.setWidthPercentage(100.0F);
        table.setHeaderRows(1);//1行标题
        table.getDefaultCell().setHorizontalAlignment(1);
        //标题占6列
        PdfPCell cell = new PdfPCell(new Phrase("个人信息", fontZH));
        cell.setColspan(6);
        cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
        cell.setHorizontalAlignment(Element.ALIGN_CENTER);
        table.addCell(cell);

        //12列,分两行
        table.addCell(new Paragraph("员工姓名", fontZH));
        table.addCell(new Paragraph("张亮Zhang Liang", fontZH));
        table.addCell(new Paragraph("工号", fontZH));
        table.addCell(new Paragraph("2849", fontZH));
        table.addCell(new Paragraph("工作部门", fontZH));
        table.addCell(new Paragraph("上汽通用JQSP", fontZH));
        table.addCell(new Paragraph("身份证号", fontZH));
        table.addCell(new Paragraph("320322199711125310", fontZH));
        table.addCell(new Paragraph("联系电话", fontZH));
        table.addCell(new Paragraph("17601251600", fontZH));
        table.addCell(new Paragraph("单位联系电话", fontZH));
        table.addCell(new Paragraph("18994131575", fontZH));
       //合并单元格,占6列
        PdfPCell cell2 = new PdfPCell(new Phrase("车辆需求信息", fontZH));
        cell2.setColspan(6);
        cell2.setVerticalAlignment(Element.ALIGN_MIDDLE);
        cell2.setHorizontalAlignment(Element.ALIGN_CENTER);
        table.addCell(cell2);
        table.addCell(new Paragraph("申购车型", fontZH));
        table.addCell(new Paragraph("全新一代别克君威豪华型", fontZH));
        table.addCell(new Paragraph("颜色", fontZH));
        table.addCell(new Paragraph("天空蓝", fontZH));
        table.addCell(new Paragraph("价格(指导价)", fontZH));
        table.addCell(new Paragraph("888888", fontZH));
        //合并单元格,占6列
        PdfPCell cell3 = new PdfPCell(new Phrase("审核情况", fontZH));
        cell3.setColspan(6);
        cell3.setVerticalAlignment(Element.ALIGN_MIDDLE);
        cell3.setHorizontalAlignment(Element.ALIGN_CENTER);
        table.addCell(cell3);
        //6列 ,占1
        table.addCell(new Paragraph("最终购车价格", fontZH));
        //6列,占3
        PdfPCell cell4 = new PdfPCell(new Phrase("88888", fontZH));
        cell4.setColspan(3);
        table.addCell(cell4);
         //6列 ,占1
        table.addCell(new Paragraph("部门审核盖章", fontZH));
         //6列 ,占1
        table.addCell(new Paragraph("", fontZH));
       //合并单元格,占6列
        PdfPCell cell5 = new PdfPCell(new Phrase("开票信息", fontZH));
        cell5.setColspan(6);
        cell5.setVerticalAlignment(Element.ALIGN_MIDDLE);
        cell5.setHorizontalAlignment(Element.ALIGN_CENTER);
        table.addCell(cell5);
         //6列 ,占1
        table.addCell(new Paragraph("与员工关系", fontZH));
        //6列 ,占5
        PdfPCell cell6 = new PdfPCell(new Phrase("本人", fontZH));
        cell6.setColspan(5);
        table.addCell(cell6);
        //6列 ,占1
        table.addCell(new Paragraph("开票人姓名", fontZH));
        //6列 ,占5
        PdfPCell cell7 = new PdfPCell(new Phrase("张亮", fontZH));
        cell7.setColspan(5);
        table.addCell(cell7);
       //6列 ,占1
        table.addCell(new Paragraph("身份证号", fontZH));
        //6列 ,占5
        PdfPCell cell8 = new PdfPCell(new Phrase("320322199711125310", fontZH));
        cell8.setColspan(5);
        table.addCell(cell8);
        //自定义
     Paragraph zdf= new Paragraph("复合意见", fontZH);
     //占1列
     table.addCell(zdf);

     Phrase  itemTitle=new Phrase();
     //单选
     itemTitle.add(radioChecked);
     itemTitle.add(new Chunk("同意",fangNormal12));
     itemTitle.add(new Chunk("      ",fangNormal12));
     itemTitle.add(radioUnchecked);
     itemTitle.add(new Chunk("不同意",fangNormal12));
     itemTitle.add(new Chunk("\n",fangNormal12));
     //新的一行,复选框
     itemTitle.add(check12);
     itemTitle.add(new Chunk("已有数据",fangNormal12));
     //2个chuck 分割一段距离
     itemTitle.add(new Chunk("      ",fangNormal12));
     itemTitle.add(uncheck12);
     itemTitle.add(new Chunk("需要采集数据",fangNormal12));
     //占 5列
     PdfPCell zdyCell=createCell(itemTitle);
     zdyCell.setColspan(5);
     table.addCell(zdyCell);
     document.add(table);
     document.add(new Paragraph(String.valueOf(radioChecked),fangNormal12));
     document.add(new Paragraph(String.valueOf(radioUnchecked),fangNormal12));
        document.add(new Paragraph(new Chunk("( 注:本身清单自申请日的当季内有效)", fontZH).setLocalDestination(title)));
        document.add(new Paragraph("\n"));
        // 第七步,关闭document
        document.close();
        System.out.println(out);
        System.out.println("导出pdf成功~");
    }

public static PdfPCell createCell(Phrase phrase){
    PdfPCell cell=new PdfPCell(phrase);
    cell.setVerticalAlignment(Element.ALIGN_CENTER);
    cell.setMinimumHeight(27f);
    return cell;
}
 public static void createAllPdf2() throws Exception {  // 第一步,实例化一个document对象
  BaseFont simFangFont=BaseFont.createFont("d:/simfang.ttf",BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);
  Font fangNormal12=new Font(simFangFont,12,Font.NORMAL);
  Document document = new Document();
  // 第二步,设置要到出的路径
  FileOutputStream out = new FileOutputStream("D:/workbook111.pdf");
  //如果是浏览器通过request请求需要在浏览器中输出则使用下面方式
  //OutputStream out = response.getOutputStream();
  // 第三步,设置字符
  BaseFont bfChinese = BaseFont.createFont("d:/SimHei.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
  Font fontZH = new Font(bfChinese, 12.0F, 0);
  Font fontChinese1 = new Font(bfChinese, 16, Font.BOLD);

  // 第四步,将pdf文件输出到磁盘
  PdfWriter writer = PdfWriter.getInstance(document, out);
  // 第五步,打开生成的pdf文件

  document.open();
  // 第六步,设置内容
  String title = "上汽通用汽车员工租车申请表";
  //document.add(new Paragraph(new Chunk("Logo", fontZH)));
  //document.add(new Paragraph(new Chunk(title, fontZH).setLocalDestination(title)));
  PdfPTable titleTable = new PdfPTable(5);
  titleTable.setWidthPercentage(100.0F);

  PdfPCell logoCell = new PdfPCell(new Phrase("LOGO", fontZH));
  logoCell.setColspan(1);
  logoCell.setBorderWidthTop(0);//取消边框展示
  logoCell.setBorderWidthRight(0);
  logoCell.setBorderWidthBottom(0);
  logoCell.setBorderWidthLeft(0);

  //ClassPathResource classPathResource = new ClassPathResource("C:/Users/Anear/IdeaProjects/tutor-system/tutor-teacher-service/src/main/resources/logo/logo.png");
  Image image = Image.getInstance("d:/11.jpg");
  logoCell.setImage(image);//展示图片logo
  logoCell.setBorderWidth(120);
  logoCell.setFixedHeight(40);
  titleTable.addCell(logoCell);

  PdfPCell titleCell = new PdfPCell(new Phrase(title, fontChinese1));
  titleCell.setColspan(3);
  titleCell.setBorderWidthTop(0);
  titleCell.setBorderWidthRight(0);
  titleCell.setBorderWidthBottom(0);
  titleCell.setBorderWidthLeft(0);
  titleCell.setVerticalAlignment(Element.ALIGN_MIDDLE);//水平垂直居中
  titleCell.setHorizontalAlignment(Element.ALIGN_CENTER);
  titleTable.addCell(titleCell);
  document.add(titleTable);

  PdfPCell kongCell = new PdfPCell(new Phrase("", fontChinese1));
  kongCell.setBorderWidthTop(0);
  kongCell.setBorderWidthRight(0);
  kongCell.setBorderWidthBottom(0);
  kongCell.setBorderWidthLeft(0);
  titleTable.addCell(kongCell);
  document.add(titleTable);

  document.add(new Paragraph(new Chunk("申请日期:2021-06-01", fontZH)));
  document.add(new Paragraph("\n"));
  // 创建table,注意这里的2是两列的意思,下面通过table.addCell添加的时候必须添加整行内容的所有列
  PdfPTable table = new PdfPTable(6);
  table.setWidthPercentage(100.0F);
  table.setHeaderRows(1);
  table.getDefaultCell().setHorizontalAlignment(1);

  PdfPCell cell = new PdfPCell(new Phrase("个人信息", fontZH));
  cell.setColspan(6);
  cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
  cell.setHorizontalAlignment(Element.ALIGN_CENTER);
  table.addCell(cell);


  table.addCell(new Paragraph("员工姓名", fontZH));
  table.addCell(new Paragraph("张亮Zhang Liang", fontZH));
  table.addCell(new Paragraph("工号", fontZH));
  table.addCell(new Paragraph("2849", fontZH));
  table.addCell(new Paragraph("工作部门", fontZH));
  table.addCell(new Paragraph("上汽通用JQSP", fontZH));
  table.addCell(new Paragraph("身份证号", fontZH));
  table.addCell(new Paragraph("320322199711125310", fontZH));
  table.addCell(new Paragraph("联系电话", fontZH));
  table.addCell(new Paragraph("17601251600", fontZH));
  table.addCell(new Paragraph("单位联系电话", fontZH));
  table.addCell(new Paragraph("18994131575", fontZH));
  PdfPCell cell2 = new PdfPCell(new Phrase("车辆需求信息", fontZH));
  cell2.setColspan(6);
  cell2.setVerticalAlignment(Element.ALIGN_MIDDLE);
  cell2.setHorizontalAlignment(Element.ALIGN_CENTER);
  table.addCell(cell2);
  table.addCell(new Paragraph("申购车型", fontZH));
  table.addCell(new Paragraph("全新一代别克君威豪华型", fontZH));
  table.addCell(new Paragraph("颜色", fontZH));
  table.addCell(new Paragraph("天空蓝", fontZH));
  table.addCell(new Paragraph("价格(指导价)", fontZH));
  table.addCell(new Paragraph("888888", fontZH));
  PdfPCell cell3 = new PdfPCell(new Phrase("审核情况", fontZH));
  cell3.setColspan(6);
  cell3.setVerticalAlignment(Element.ALIGN_MIDDLE);
  cell3.setHorizontalAlignment(Element.ALIGN_CENTER);
  table.addCell(cell3);
  table.addCell(new Paragraph("最终购车价格", fontZH));
  PdfPCell cell4 = new PdfPCell(new Phrase("88888", fontZH));
  cell4.setColspan(3);
  table.addCell(cell4);
  table.addCell(new Paragraph("部门审核盖章", fontZH));
  table.addCell(new Paragraph("", fontZH));
  PdfPCell cell5 = new PdfPCell(new Phrase("开票信息", fontZH));
  cell5.setColspan(6);
  cell5.setVerticalAlignment(Element.ALIGN_MIDDLE);
  cell5.setHorizontalAlignment(Element.ALIGN_CENTER);
  table.addCell(cell5);
  table.addCell(new Paragraph("与员工关系", fontZH));
  PdfPCell cell6 = new PdfPCell(new Phrase("本人", fontZH));
  cell6.setColspan(5);
  table.addCell(cell6);
  table.addCell(new Paragraph("开票人姓名", fontZH));
  PdfPCell cell7 = new PdfPCell(new Phrase("张亮", fontZH));
  cell7.setColspan(5);
  table.addCell(cell7);
  table.addCell(new Paragraph("身份证号", fontZH));
  PdfPCell cell8 = new PdfPCell(new Phrase("320322199711125310", fontZH));
  cell8.setColspan(5);
  table.addCell(cell8);
  //自定义
  String  type="1";
  List<String> dataList=new ArrayList<>();
  dataList.add("1");
  dataList.add("2");

  Paragraph itemTitle=new Paragraph();
  itemTitle= new Paragraph("身份证号2222", fontZH);
  table.addCell(itemTitle);
  /**
   PdfPCell cell9 = new PdfPCell(new Phrase("11111111111", fontZH));
   cell9.setColspan(5);
   table.addCell(cell9);
   **/

  // itemTitle.add(new Chunk("需求类别:",fangNormal12));

  if(dataList.contains("1")){
   itemTitle.add(new Chunk("采集需求:",fontZH));
  }
  else if(dataList.contains("2")){
   itemTitle.add(new Chunk("使用需求:",fontZH));
  }

  else{
   Chunk unCheck12=new Chunk((char)0x00A8);
   itemTitle.add(unCheck12);
   itemTitle.add(new Chunk("采集需求:",fontZH));
   itemTitle.add(unCheck12);
   itemTitle.add(new Chunk("使用需求:",fontZH));
  }

  PdfPCell cell9 = new PdfPCell(itemTitle);
  //cell9.setColspan(5);
  table.addCell(cell9);
  // PdfPCell mb=createCell(itemTitle);
  //mb.setColspan(8);
  //table.addCell(mb);

  document.add(table);
  document.add(new Paragraph(new Chunk("( 注:本身清单自申请日的当季内有效)", fontZH).setLocalDestination(title)));
  document.add(new Paragraph("\n"));
  // 第七步,关闭document
  document.close();
  System.out.println(out);
  System.out.println("导出pdf成功~");
 }

}

2.效果

2.2 案例2

1.代码

public class TestTablePdf {
    public static void main(String[] args) throws IOException, DocumentException {
        createTablePdf();
    }
    public static void  createTablePdf() throws DocumentException, IOException {
        //1.设置字体编码
        BaseFont windings = BaseFont.createFont("d:/Wingdings.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
        //1.1 设置字体
        Font f12 = new Font(windings, 12f);
        BaseFont simFangFont=BaseFont.createFont("d:/simfang.ttf",BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);
        Font fangNormal12=new Font(simFangFont,16f,Font.NORMAL);
        //1.2 设置复选框
        Chunk check12=new Chunk((char)0x00FE,f12);
        Chunk uncheck12=new Chunk((char)0x00A8,f12);//复选框  //http://www.alanwood.net/demos/wingdings.html
       //设置下拉框
        Chunk radioChecked=new Chunk((char)0x00A4,f12);
        Chunk radioUnchecked=new Chunk((char)0x00A1,f12);//单选  //http://www.alanwood.net/demos/wingdings.html

        // 第一步,实例化一个document对象
        Document document = new Document();
        // 第二步,设置要到出的路径
        FileOutputStream out = new FileOutputStream("D:/workorder111.pdf");
        //如果是浏览器通过request请求需要在浏览器中输出则使用下面方式
        //OutputStream out = response.getOutputStream();
        // 第三步,设置字符
        BaseFont bfChinese = BaseFont.createFont("d:/SimHei.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
        Font fontZH = new Font(bfChinese, 12.0F, 0);
        Font fontChinese1 = new Font(bfChinese, 16, Font.BOLD);

        // 第四步,将pdf文件输出到磁盘
        PdfWriter writer = PdfWriter.getInstance(document, out);
        // 第五步,打开生成的pdf文件
        document.open();
        PdfPTable table = new PdfPTable(4);
        table.setWidthPercentage(100.0F);
        table.setHeaderRows(1);//1行标题
        table.getDefaultCell().setHorizontalAlignment(1);
        //标题占4列
        PdfPCell cell = new PdfPCell(new Phrase("数据质量问题申请单", fontZH));
        cell.setColspan(4);
        cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
        cell.setHorizontalAlignment(Element.ALIGN_CENTER);
        table.addCell(cell);
     //=======================================第2行
        //4列,占1
        table.addCell(new Paragraph("产品名称", fontZH));
        //4列,占1
        PdfPCell cell22 = new PdfPCell(new Phrase("主办券商联系人", fontZH));
        cell22.setColspan(1);
        table.addCell(cell22);
        //4列,占1
        table.addCell(new Paragraph("产品类型", fontZH));
        //4列,占1
        PdfPCell cell24 = new PdfPCell(new Phrase("api", fontZH));
        cell24.setColspan(1);
        table.addCell(cell24);
        //=======================================第3行
        PdfPCell cell31 = new PdfPCell(new Phrase("问题描述", fontZH));
        cell31.setColspan(1);
        table.addCell(cell31);
        Phrase hhRow=new Phrase();
        hhRow.add(new Chunk("api不对",fontZH));
        hhRow.add(new Chunk("\n",fangNormal12));
        hhRow.add(new Chunk("\n",fangNormal12));
        PdfPCell cell32 = createCell(hhRow);
        cell32.setColspan(3);
        table.addCell(cell32);
        //=======================================第4行
        //合并单元格,占6列
        PdfPCell cell4= new PdfPCell(new Phrase("数据问题复核意见", fontZH));
        cell4.setColspan(4);
        cell4.setVerticalAlignment(Element.ALIGN_MIDDLE);
        cell4.setHorizontalAlignment(Element.ALIGN_CENTER);
        table.addCell(cell4);
        //=======================================第5行
        Paragraph zdf= new Paragraph("复合意见", fontZH);
        //占1列
        table.addCell(zdf);
        Phrase  itemTitle=new Phrase();
        //单选
        itemTitle.add(radioChecked);
        itemTitle.add(new Chunk("同意",fangNormal12));
        itemTitle.add(new Chunk("      ",fangNormal12));
        itemTitle.add(radioUnchecked);
        itemTitle.add(new Chunk("不同意",fangNormal12));
        itemTitle.add(new Chunk("\n",fangNormal12));
        //新的一行,复选框
        itemTitle.add(check12);
        itemTitle.add(new Chunk("已有数据",fangNormal12));
        //2个chuck 分割一段距离
        itemTitle.add(new Chunk("      ",fangNormal12));
        itemTitle.add(uncheck12);
        itemTitle.add(new Chunk("需要采集数据",fangNormal12));
        //占 5列
        PdfPCell zdyCell=createCell(itemTitle);
        zdyCell.setColspan(5);
        table.addCell(zdyCell);



        document.add(table);
        document.add(new Paragraph(new Chunk("申请日期:2021-06-01", fontZH)));
        // 第七步,关闭document
        document.close();
        System.out.println(out);
        System.out.println("导出pdf成功~");
    }
    public static PdfPCell createCell(Phrase phrase){
        PdfPCell cell=new PdfPCell(phrase);
        cell.setVerticalAlignment(Element.ALIGN_CENTER);
        cell.setMinimumHeight(27f);
        return cell;
    }
}

2.效果

代码地址: https://gitee.com/jurf-liu/create-pdf-demo.git

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/470289.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【OAI】UERANSIM容器与OAI核心网分立部署及测试

说明启动核心网&#xff1a;启动基站&#xff1a;功能测试ueransim测试1&#xff1a;通过12.1.1.x ping192.168.70.1ueransim测试2&#xff1a; 通过nr-binder绑定自定义TCP程序传数据到核心网ueransim测试3&#xff1a;多ueransim启动 结论附录基站配置文件&#xff1a;TCP通信…

HCIA-RS实验-路由配置-静态路由缺省路由

在计算机网络中&#xff0c;路由器是实现数据包转发的重要设备。它通过查找路由表中的路由信息&#xff0c;将数据包从源地址转发到目标地址。而静态路由和缺省路由则是路由表中的两种重要信息&#xff0c;下面我们来详细了解一下它们的概念、特点和应用。 目录 简述 一、静态…

Let‘s Learn .NET|通过 Semantic Kernel .NET SDK 管理你的 OpenAI 项目

编辑&#xff1a;Alan Wang 排版&#xff1a;Rani Sun Lets Learn .NET 系列 “Lets Learn .NET” 是面向全球的 .NET 初学者学习系列&#xff0c;旨在通过不同语言&#xff0c;帮助不同地区的开发者掌握最新的 .NET 开发知识与技能。 在 ChatGPT 与 OpenAI 火热的当下&#x…

雪花算法

雪花算法(SnowFlake)&#xff0c;是Twitter开源 的分布式ID生成算法 主要是由 64bit 的 long 型生成的全局 ID&#xff0c; 其中分为四个部分&#xff1a; ① 最高1位固定值 0&#xff0c;因为生成的 id 是正整数 ② 后面的41位存储毫秒级时间戳 ③ 第三部分的10位存储机器码…

tp6.1 bingher/ueditor(百度编辑器)(七牛、阿里OSS第三方云)详情图文教程(第二版)

之前做过一版&#xff1a;tp6 bingher/ueditor(百度编辑器)(七牛、阿里OSS第三方云)详情图文教程_我是高手高手高高手的博客-CSDN博客 登录权限是Session&#xff0c;现在系统是Cookie加jwt的Token方式验证 一、修改验证登录权限 修改文件&#xff1a; vendor\bingher\uedito…

R语言 | 向量对象运算

目录 一、数值型的向量对象 1.1 建立规则型的数值向量对象使用序列符号 1.2 简单向量对象的运算 1.3 建立向量对象&#xff1a;seq()函数 1.4 连接向量对象&#xff1a;c()函数 1.5 重复向量对象&#xff1a;rep()函数 1.6 numeric()函数 1.7 程序语句短语跨行的处理 …

阶段式软件研发项目管理工具

下面这个场景是是阶段式软件研发场景&#xff0c;适用于采用瀑布模式开展软件研发的企业或者团队。 创建项目 新建项目时&#xff0c;使用“阶段式软件开发项目”项目模板创建项目。 系统会自动创建10个阶段看板&#xff08;一个阶段一个看板&#xff09;&#xff0c;1个缺陷…

libgo 流程分析(1)

libgo 基础模块 libgo逻辑结构 libgo主要的功能模块主要包括&#xff1a;调度器( Scheduler )、处理器( Processer )、协程( Task )和一个FastSteadyClock。 其中 Scheduler -> Processer -> Task 三层逻辑结构实现了对协程( Task )的生命周期管理和调度和运行。 sch…

【好书分享】数字信号处理入门宝典(Digital Signal Processing-A Student Guide)

简介 该书作为初学者的入门书籍&#xff0c;葵花宝典级的存在&#xff0c;发行量很少&#xff0c;在市面上很难见到&#xff0c;仅此一本&#xff0c;想要的私信&#xff01; Digital signal processing (DSP) systems have developed at a rapid pace over the past two dec…

基于DSP+FPGA+ADS1282支持31Bit高精度数据采集方案(二)模拟电路设计

如图 4.1 所示是系统硬件系统的信号框图&#xff0c;数字信号处理板上的主要核心是 两个处理芯片&#xff0c;即 FPGA 和 DSP &#xff0c;其中 FPGA 主要作用是做 DSP 和外围接口的 桥梁及数据预处理&#xff0c; DSP 做为数据解算核心。 FPGA 通过各种的数据总…

AJAX和JSON

1、什么是AJAX? AJAX&#xff08;ASynchronous JavaScript And XML&#xff09;异步的JavaScript 和 XML&#xff1b; 由Jesse James Garrett 在他的文章AJAX&#xff1a;A New Approoch to Web Applications中首次提出。 ajax&#xff08;Web数据交互方式&#xff09;_百…

[深度学习][CenterFusion]关于centerfusion训练注意的要点

我参考博客CenterFusion 项目超详细环境搭建步骤及可视化操作_centernet可视化_上班摸不了鱼的博客-CSDN博客本文引用 CenterFusion: Center-based Radar and Camera Fusion for 3D Object Detection&#xff0c;复现此论文中的代码&#xff0c;互相学习。注意&#xff1a;由于…

电影元素主题:《黑客帝国》中的js加密与解密

在《黑客帝国》中&#xff0c;加密和解密是非常重要的概念。加密是将信息转换为看起来毫无意义的数据&#xff0c;以确保只有拥有解密密钥的人才能读取和理解它。在这篇文章中&#xff0c;我们将探讨如何使用JavaScript进行加密和解密&#xff0c;就像黑客们在电影中所做的那样…

2023-04-27:用go语言重写ffmpeg的remuxing.c示例。

2023-04-27&#xff1a;用go语言重写ffmpeg的remuxing.c示例。 答案2023-04-27&#xff1a; ffmpeg的remuxing.c是一个用于将多媒体文件从一种容器格式转换为另一种容器格式的命令行工具。它可以将音频、视频和字幕等元素从源文件中提取出来&#xff0c;并按照用户指定的方式…

Windows 11 本地 php 开发环境搭建:PHP + Apache + MySQL +VSCode 安装和环境配置

目录 前言1. PHP 的下载、安装和配置1.1 下载 php1.2 安装 php1.3 配置 php 系统变量1.4 配置 php.ini 2. Apache 的下载、安装和配置2.1 下载 Apache2.2 安装 Apache2.3 修改配置 Apache2.4 指定服务端口&#xff08;非必须&#xff09;2.5 配置系统变量2.6 安装服务2.7 启动服…

在Docker上部署SpringBoot项目(纯步骤)

在Docker上部署SpringBoot项目 在学习中发现了部署的时候总是有各种问题,此文章只有操作步骤没有原理解释,只是用来提醒自己部署步骤 部署总共可以分为五步&#xff01; 第一步&#xff1a;将SpringBoot项目打包成jar包 这里使用idea的上maven选项打包&#xff0c;点一下就行。…

seata 1.4.2 安装部署(Linux环境)

Linux安装部署 seata server 1.4.2 下载安装包上传至服务器 1.首先从GitHub拉取seata压缩包 https://github.com/seata/seata/releases/download/v1.4.2/seata-server-1.4.2.zip 下载到本地后上传至服务器 或使用命令拉取 wget https://github.com/seata/seata/release…

java调用百度的接口获取起-止位置的距离

需求:校验收货地址是否超出配送范围 重要: 做该需求的思路就是通过卖家和卖家具体的地址信息,来获取到二者的经纬度, 此时可以使用百度的 "地理编码服务",即可获取对应的经纬度 第二步,就是通过二者的经纬度,按照百度接口的要求,发送,即可获取到包含二者距离的JSON串…

SQL Father - 模拟数据生成器(后端)

SQL Father - 模拟数据生成器&#xff08;后端&#xff09; SQL 之父项目&#xff1a;快速生成 SQL 和模拟数据&#xff0c;大幅提高开发测试效率&#xff01; 前后端全栈项目 By 程序员鱼皮 制作不易&#xff0c;请勿商用和二次售卖&#xff01;&#xff01;&#xff01; 在线…

HAProxy搭建web集群

目录 一、HAProxy简介1.Haproxy应用分析2.HAProxy的主要特性3.HAProxy常用的负载均衡策略4.LVS、Nginx、HAproxy的区别 二、Haproxy搭建 Web 群集1.haproxy 服务器部署2.编译安装 Haproxy3.Haproxy服务器配置4.添加haproxy 系统服务5.节点服务器部署6.启动haproxy服务7.日志定义…