zoukankan      html  css  js  c++  java
  • SpringBoot集成itextpdf动态生成pdf并展示

    背景

    接上文SpringBoot集成markdown实现文档管理,对于表格的支持markdown不是特别友好,同时内部文档管理需要增加表格式api接口文档的功能,所以决定采用结合数据库存储与动态生成pdf借助目录结构展示的方式

    表结构设计

    目录表

    DROP TABLE IF EXISTS `knowledge_interfacecatalog`;
    CREATE TABLE `knowledge_interfacecatalog` (
      `ID` int(11) NOT NULL AUTO_INCREMENT,
      `UnitGuid` varchar(50) DEFAULT NULL,
      `AddDate` datetime DEFAULT NULL,
      `CataName` varchar(100) DEFAULT NULL,
      `ParentCataGuid` varchar(50) DEFAULT NULL,
      `SortNum` int(11) DEFAULT NULL,
      `DocGuid` varchar(50) DEFAULT NULL,
      KEY `ID` (`ID`)
    ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4;
    

    接口内容表

    DROP TABLE IF EXISTS `knowledge_interfaceinfo`;
    CREATE TABLE `knowledge_interfaceinfo` (
      `ID` int(11) NOT NULL AUTO_INCREMENT,
      `UnitGuid` varchar(50) DEFAULT NULL,
      `AddDate` datetime DEFAULT NULL,
      `InterfaceName` varchar(100) DEFAULT NULL,
      `Description` varchar(500) DEFAULT NULL,
      `Remark` varchar(500) DEFAULT NULL,
      `ParamJson` varchar(2000) DEFAULT NULL,
      `ResponseJson` varchar(2000) DEFAULT NULL,
      `InterfaceAddress` varchar(500) DEFAULT NULL,
      `SortNum` int(11) DEFAULT NULL,
      `CataGuid` varchar(50) DEFAULT NULL,
      `DocGuid` varchar(50) DEFAULT NULL,
      KEY `ID` (`ID`)
    ) ENGINE=InnoDB AUTO_INCREMENT=24 DEFAULT CHARSET=utf8mb4;
    

    录入界面

    PDF生成

    引用

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

    创建PDF

    	Document document = new Document(PageSize.A2);
        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(filePath));
      	document.addTitle(doc.getDocName());
        document.addAuthor("xxxxx");
        document.addCreationDate();
        document.addLanguage("中文");
        document.open();
    

    设置自定义字体

        File fontFile = new File("font/msyh.ttf");
        BaseFont bf = BaseFont.createFont(fontFile.getAbsolutePath(), BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
        Font fontChinese5 = new Font(bf,14);
    

    添加章节与段落

     	//目录的字体
       Font cataFont = new Font(bf, 24, Font.NORMAL, BaseColor.BLACK);
       // 接口的字体
       Font interFont = new Font(bf, 20, Font.NORMAL, BaseColor.BLACK);     
       for(int i=1;i<=10;i++){
    		Chapter chapter = new Chapter(new Paragraph("目录", cataFont),i);
            for(int j=1;j<=5;j++){
                Section section = chapter.addSection(new Paragraph("接口", interFont));
            }
            document.add(chapter);
        }
    	document.close();
    

    添加表格

      PdfPTable table = new PdfPTable(3);//生成一个3列的表格
      //表格垂直居中
      table.setHorizontalAlignment(Element.ALIGN_CENTER);
      table.setTotalWidth(800f);
      float[] widths = new float[] { 150f,325f,325f };
      table.setWidths(widths);
      PdfPCell cell;
      cell = new PdfPCell(new Paragraph("接口地址",fontChinese5));
      table.addCell(cell);
       cell = new PdfPCell(new Paragraph(interfaceInfoDO.getInterfaceAddress(),fontChinese5));
      cell.setColspan(2);
      table.addCell(cell);
    

    制表符替换

    在pdf生成过程中 制表符无效导致样式变动,需要进行编码替换replace(" ","u00a0u00a0u00a0u00a0")

    PDF展示

    这里选择的是pdf.js进行展示,引用相关文件,地址栏出入file代表url地址即可,因为用于接口文档展示,所以我需要默认进入就是目录模式,所以需要对页面进行相关js处理

    <script type="text/javascript">
        var interval = setInterval('loadPdf()', 1000);
    
        function loadPdf() {
            if (PDFViewerApplication.pdfDocument == null) {
                console.info('Loading...');
            } else {
                clearInterval(interval);
                console.info('Load Success...');
                var sidebarToggle =   $("#sidebarToggle");
                var viewOutline =   $("#viewOutline");
                if(!sidebarToggle.hasClass("toggled")){
                  sidebarToggle.click();
                }
                if(!viewOutline.hasClass("toggled")){
                  viewOutline.click();
                }
            }
        }
    </script>
    

    展示效果

  • 相关阅读:
    待你长发及腰
    《线段树》讲稿
    Codeforces #Round 376 F 题解
    包裹快递 题解
    Codeforces #Round 376 部分题解
    圆圈舞蹈 题解
    奶牛晒衣服 题解
    BZOJ 1034 题解
    BZOJ 1045 题解
    BZOJ 1054 题解
  • 原文地址:https://www.cnblogs.com/yanpeng19940119/p/15257535.html
Copyright © 2011-2022 走看看