itextpdf、freemarker和flying-saucer-pdf实现PDF导出功能

2023-11-16

目录

目录

1、导入maven

2、代码结构​编辑

3、纯文本生成方式

JavaToPdfHtml

template.html

simhei.ttf   字体文件自行百度下载

4、基础上加了freemarker模板引擎

JavaToPdfHtmlFreeMarker 

templateF.html

5、基础上在加上CSS高级特性

JavaToPdfHtmlFreeMarkerCss

templateFCss.html

字体文件图片文件自行百度下载 calibri.ttf、simsun.ttc、logo.png

Controller测试



  1. 导入maven

  2. <!--  itextpdf,导出pdf核心架包  -->
    <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>itextpdf</artifactId>
        <version>5.5.11</version>
    </dependency>
    <!--  itextpdf工具包,用来解析html生成pdf  -->
    <dependency>
        <groupId>com.itextpdf.tool</groupId>
        <artifactId>xmlworker</artifactId>
        <version>5.5.11</version>
    </dependency>
    <!--  flying saucer,支持对CSS高级特性的解析  -->
    <dependency>
        <groupId>org.xhtmlrenderer</groupId>
        <artifactId>flying-saucer-pdf</artifactId>
        <version>9.1.6</version>
    </dependency>
    <dependency>
        <groupId>org.freemarker</groupId>
        <artifactId>freemarker</artifactId>
        <version>2.3.23</version>
    </dependency>
  3. 代码结构

  4. 纯文本生成方式

    1. JavaToPdfHtml

      import com.itextpdf.text.Document;
      import com.itextpdf.text.DocumentException;
      import com.itextpdf.text.pdf.PdfWriter;
      import com.itextpdf.tool.xml.XMLWorkerFontProvider;
      import com.itextpdf.tool.xml.XMLWorkerHelper;
      import org.springframework.core.io.ClassPathResource;
      
      import java.io.*;
      import java.nio.charset.Charset;
      
      public class JavaToPdfHtml {
      
      private static final String DEST = "D:/pdf/template.pdf";//输出地址
      private static ClassPathResource FONT = new ClassPathResource("templates/simhei.ttf");
      private static ClassPathResource HTML = new ClassPathResource("templates/template.html");
      
      
      public static void main(String[] args) throws IOException, DocumentException {
      
      // step 1
      Document document = new Document();
      // step 2
      PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(DEST));
      // step 3
      document.open();
      // step 4
      XMLWorkerFontProvider fontImp = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS);
      fontImp.register(FONT.getURL().getPath());
      XMLWorkerHelper.getInstance().parseXHtml(writer, document,
      new FileInputStream(HTML.getURL().getPath()), null, Charset.forName("UTF-8"), fontImp);
      // step 5
      document.close();
      }
      
      }
    2. template.html

      
      <!DOCTYPE html>
      <html lang="en">
      <head>
      <meta charset="UTF-8" />
      <title>Title</title>
      <style>
      body {
      	font-family: SimHei;
      }
      
      .red {
      	color: red;
      }
      </style>
      </head>
      <body>
      
      	<div class="red">hello world!</div>
      	<div class="red">你好,祖克</div>
      </body>
      </html>
    3. simhei.ttf   字体文件自行百度下载

  5. 基础上加了freemarker模板引擎

    1. JavaToPdfHtmlFreeMarker 

      import com.itextpdf.text.Document;
      import com.itextpdf.text.DocumentException;
      import com.itextpdf.text.pdf.PdfWriter;
      import com.itextpdf.tool.xml.XMLWorkerFontProvider;
      import com.itextpdf.tool.xml.XMLWorkerHelper;
      
      import freemarker.template.Configuration;
      import freemarker.template.Template;
      import org.springframework.core.io.ClassPathResource;
      
      import javax.servlet.http.HttpServletResponse;
      import java.io.ByteArrayInputStream;
      import java.io.File;
      import java.io.FileOutputStream;
      import java.io.IOException;
      import java.io.StringWriter;
      import java.io.Writer;
      import java.nio.charset.Charset;
      import java.util.HashMap;
      import java.util.Map;
      
      public class JavaToPdfHtmlFreeMarker {
      
      // 本地测试的时候输出PDF文件的地址
      private static final String DEST = "D:/pdf/templateF.pdf";
      // 模板文件所在resource下的目录
      private static final ClassPathResource FTL = new ClassPathResource("templates/");
      // 字体文件
      private static final ClassPathResource FONT = new ClassPathResource("templates/simhei.ttf");
      // 模板文件
      private static final String HTML = "templateF.html";
      private static Configuration freemarkerCfg = null;
      
      static {
      freemarkerCfg = new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS);
      //freemarker的模板目录
      try {
      //freemarkerCfg.
      freemarkerCfg.setDirectoryForTemplateLoading(new File(FTL.getURI().getPath()));
      } catch (Exception e) {
      e.printStackTrace();
      }
      }
      
      /**
      * 本地Main方法测试导出PDF到本地文件夹中
      * @param content
      * @param dest
      * @throws IOException
      * @throws DocumentException
      */
      public static void createPdf(String content, String dest) throws IOException, DocumentException {
      // step 1
      Document document = new Document();
      // step 2
      PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(dest));
      // step 3
      document.open();
      // step 4
      XMLWorkerFontProvider fontImp = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS);
      fontImp.register(FONT.getURL().getPath());
      XMLWorkerHelper.getInstance().parseXHtml(writer, document,
      new ByteArrayInputStream(content.getBytes()), null, Charset.forName("UTF-8"), fontImp);
      // step 5
      document.close();
      
      }
      
      /**
      * 网页端调用接口进行下载PDF
      * @param content
      * @param response
      * @throws IOException
      * @throws DocumentException
      */
      public static void createPdf2(String content, HttpServletResponse response) throws IOException, DocumentException {
      
      response.setContentType("application/pdf");
      // step 1
      Document document = new Document();
      // step 2
      PdfWriter writer = PdfWriter.getInstance(document, response.getOutputStream());
      // step 3
      document.open();
      // step 4
      XMLWorkerFontProvider fontImp = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS);
      fontImp.register(FONT.getURL().getPath());
      XMLWorkerHelper.getInstance().parseXHtml(writer, document,
      new ByteArrayInputStream(content.getBytes()), null, Charset.forName("UTF-8"), fontImp);
      // step 5
      document.close();
      
      }
      
      /**
      * freemarker渲染html
      */
      public static String freeMarkerRender(Map data, String htmlTmp) {
      Writer out = new StringWriter();
      try {
      // 获取模板,并设置编码方式
      Template template = freemarkerCfg.getTemplate(htmlTmp);
      template.setEncoding("UTF-8");
      // 合并数据模型与模板
      template.process(data, out); //将合并后的数据和模板写入到流中,这里使用的字符流
      out.flush();
      return out.toString();
      } catch (Exception e) {
      e.printStackTrace();
      } finally {
      try {
      out.close();
      } catch (IOException ex) {
      ex.printStackTrace();
      }
      }
      return null;
      }
      
      /**
      * 本地测试
      * @param args
      * @throws IOException
      * @throws DocumentException
      */
      public static void main(String[] args) throws IOException, DocumentException {
      Map data = new HashMap();
      data.put("name", "路飛.祖克");
      String content = JavaToPdfHtmlFreeMarker.freeMarkerRender(data, HTML);
      JavaToPdfHtmlFreeMarker.createPdf(content, DEST);
      }
      }
    2. templateF.html

      
      <!DOCTYPE html>
      <html lang="en">
      <head>
      	<meta charset="UTF-8" />
      	<title>Title</title>
      	<style>
      		body {
      			font-family: SimHei;
      		}
      
      		.red {
      			color: red;
      		}
      	</style>
      </head>
      <body>
      
      <div class="red">hello world!</div>
      <div class="red">你好,${name}</div>
      </body>
      </html>
  6. 基础上在加上CSS高级特性

    1. JavaToPdfHtmlFreeMarkerCss

      import java.io.File;
      import java.io.FileInputStream;
      import java.io.FileOutputStream;
      import java.io.IOException;
      import java.io.InputStream;
      import java.io.StringWriter;
      import java.io.Writer;
      import java.util.HashMap;
      import java.util.Map;
      
      import org.apache.commons.codec.binary.Base64;
      import org.springframework.core.io.ClassPathResource;
      import org.xhtmlrenderer.pdf.ITextFontResolver;
      import org.xhtmlrenderer.pdf.ITextRenderer;
      
      import com.itextpdf.text.DocumentException;
      import com.itextpdf.text.pdf.BaseFont;
      
      import freemarker.template.Configuration;
      import freemarker.template.Template;
      
      import javax.servlet.http.HttpServletResponse;
      
      public class JavaToPdfHtmlFreeMarkerCss {
      // 本地测试PDF导出地址
      private static final String DEST = "D:/pdf/templateFCss.pdf";
      // 模板所在目录
      private static final ClassPathResource FTL = new ClassPathResource("templates/");
      // 模板文件
      private static final String HTML = "templateFCss.html";
      // 字体文件
      private static final ClassPathResource FONT = new ClassPathResource("templates/simhei.ttf");
      private static final ClassPathResource FONT_C = new ClassPathResource("templates/calibri.ttf");
      private static final ClassPathResource FONT_S = new ClassPathResource("templates/simsun.ttc");
      // 图片文件
      private static final ClassPathResource LOGO_PATH = new ClassPathResource("templates/logo.png");
      private static Configuration freemarkerCfg = null;
      
      static {
      freemarkerCfg = new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS);
      //freemarker的模板目录
      try {
      freemarkerCfg.setDirectoryForTemplateLoading(new File(FTL.getURI().getPath()));
      } catch (IOException e) {
      e.printStackTrace();
      }
      }
      
      /**
      * 本地测试
      * @param args
      * @throws IOException
      * @throws DocumentException
      * @throws com.lowagie.text.DocumentException
      */
      public static void main(String[] args) throws IOException, DocumentException, com.lowagie.text.DocumentException {
      Map data = new HashMap();
      data.put("name", "路奇.D.艾尼路 儸傑");
      File file = new File(LOGO_PATH.getURL().getPath());
      data.put("fileType", "image/jpeg");
      data.put("file64Str", fileToBase64Str(file));
      String content = freeMarkerRender(data, HTML);
      System.out.println(content);
      createPdf2(content, DEST);
      
      }
      /**
      * freemarker渲染html
      */
      public static String freeMarkerRender(Map data, String htmlTmp) {
      Writer out = new StringWriter();
      try {
      // 获取模板,并设置编码方式
      Template template = freemarkerCfg.getTemplate(htmlTmp);
      template.setEncoding("UTF-8");
      // 合并数据模型与模板
      template.process(data, out); //将合并后的数据和模板写入到流中,这里使用的字符流
      out.flush();
      return out.toString();
      } catch (Exception e) {
      e.printStackTrace();
      } finally {
      try {
      out.close();
      } catch (IOException ex) {
      ex.printStackTrace();
      }
      }
      return null;
      }
      
      /**
      * 本地测试用
      * @param content
      * @param dest
      * @throws IOException
      * @throws DocumentException
      * @throws com.lowagie.text.DocumentException
      */
      public static void createPdf2(String content, String dest) throws IOException, DocumentException, com.lowagie.text.DocumentException {
      ITextRenderer render = new ITextRenderer();
      
      //设置字体
      ITextFontResolver fontResolver = render.getFontResolver();
      fontResolver.addFont(FONT_S.getURL().getPath(), BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
      fontResolver.addFont(FONT.getURL().getPath(), BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
      fontResolver.addFont(FONT_C.getURL().getPath(), BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
      // 解析html生成pdf
      render.setDocumentFromString(content);
      render.layout();
      render.createPDF(new FileOutputStream(dest));
      render.finishPDF();
      }
      
      /**
      * 接口调用,网页端下载
      * @param content
      * @param response
      * @throws IOException
      * @throws DocumentException
      * @throws com.lowagie.text.DocumentException
      */
      public static void createPdf(String content, HttpServletResponse response) throws IOException, DocumentException, com.lowagie.text.DocumentException {
      ITextRenderer render = new ITextRenderer();
      //设置字体
      ITextFontResolver fontResolver = render.getFontResolver();
      fontResolver.addFont(FONT_S.getURL().getPath(), BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
      fontResolver.addFont(FONT.getURL().getPath(), BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
      fontResolver.addFont(FONT_C.getURL().getPath(), BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
      // 解析html生成pdf
      render.setDocumentFromString(content);
      render.layout();
      render.createPDF(response.getOutputStream());
      render.finishPDF();
      }
      
      /**
      * File to 64bit Str
      *
      * @param file
      * @return
      */
      public static String fileToBase64Str(File file) {
      byte[] data = null;
      InputStream inputStream = null;
      if (file != null) {
      try {
      inputStream = new FileInputStream(file);
      data = new byte[inputStream.available()];
      inputStream.read(data);
      } catch (Exception e) {
      e.printStackTrace();
      } finally {
      try {
      inputStream.close();
      } catch (IOException e) {
      e.printStackTrace();
      }
      }
      return Base64.encodeBase64String(data);
      }
      return null;
      }
      
      /**
      * PDF导出的通用接口
      *
      * @param data
      * @param templateName
      * @param response
      */
      public static void exportPdf(Map data, String templateName, String pdfName, HttpServletResponse response) throws UnsupportedEncodingException {
      String content = freeMarkerRender(data, templateName);
      response.setContentType("application/pdf");
      // 文件名设置支持中文
      response.setHeader("Content-Disposition", "attachment; filename=" URLEncoder.encode(pdfName, "UTF-8") ".pdf");
      try {
      createPdf(content, response);
      } catch (IOException e) {
      throw new RuntimeException(e);
      } catch (DocumentException e) {
      throw new RuntimeException(e);
      } catch (com.lowagie.text.DocumentException e) {
      throw new RuntimeException(e);
      }
      }
      }
    2. templateFCss.html

      
      <!DOCTYPE html>
      <html lang="en">
      <head>
      	<meta charset="UTF-8"/>
      	<title>Title</title>
      	<style>
      		body{
      			font-family:SimHei;
      		}
      		.color{
      			color: green;
      		}
      		.pos{
      			position:absolute;
      			left:200px;
      			top:5px;
      			width: 200px;
      			font-size: 10px;
      		}
      		@media print {
      			div.header-right {
      				display: block;
      				position: running(header-right);
      			}
      
      			img{page-break-inside:avoid;}
      			table{page-break-inside:avoid;}
      		}
      		@page {
      			size: 8.5in 11in;
      
      			@top-right {
      				content: element(header-right)
      			};
      
      			/*@bottom-center {
                      content : "Page " counter(page) " of " counter(pages);
                  };	 */
      			@bottom-center {
      				content: element(footer)
      			}
      		}
      
      		#footer {
      			position: running(footer);
      		}
      
      		#pages:before {
      			content: counter(page);
      		}
      
      		#pages:after {
      			content: counter(pages);
      		}
      
      	</style>
      </head>
      <body>
      
      <div id="footer">
      	<div style="text-align: center; width: 100%;font-size: 15px;">Page <span id="pages"> of </span></div>
      </div>
      <div class="page">
      	<div class="color">你好,${name}222</div>
      	<img src="data:${fileType};base64,${file64Str}" width="600px" />
      	<table border="1">
      		<tr>
      			<th>Month</th>
      			<th>Savings</th>
      		</tr>
      		<tr>
      			<td>January</td>
      			<td>$100</td>
      		</tr>
      		<tr>
      			<td>January</td>
      			<td>$100</td>
      		</tr>
      		<tr>
      			<td>January</td>
      			<td>$100</td>
      		</tr><tr>
      		<td>January</td>
      		<td>$100</td>
      	</tr><tr>
      		<td>January</td>
      		<td>$100</td>
      	</tr><tr>
      		<td>January</td>
      		<td>$100</td>
      	</tr><tr>
      		<td>January</td>
      		<td>$100</td>
      	</tr><tr>
      		<td>January</td>
      		<td>$100</td>
      	</tr><tr>
      		<td>January</td>
      		<td>$100</td>
      	</tr><tr>
      		<td>January</td>
      		<td>$100</td>
      	</tr><tr>
      		<td>January</td>
      		<td>$100</td>
      	</tr><tr>
      		<td>January</td>
      		<td>$100</td>
      	</tr><tr>
      		<td>January</td>
      		<td>$100</td>
      	</tr><tr>
      		<td>January</td>
      		<td>$100</td>
      	</tr><tr>
      		<td>January</td>
      		<td>$100</td>
      	</tr><tr>
      		<td>January</td>
      		<td>$100</td>
      	</tr><tr>
      		<td>January</td>
      		<td>$100</td>
      	</tr><tr>
      		<td>January</td>
      		<td>$100</td>
      	</tr><tr>
      		<td>January</td>
      		<td>$100</td>
      	</tr><tr>
      		<td>January</td>
      		<td>$100</td>
      	</tr><tr>
      		<td>January</td>
      		<td>$100</td>
      	</tr><tr>
      		<td>January</td>
      		<td>$100</td>
      	</tr><tr>
      		<td>January</td>
      		<td>$100</td>
      	</tr><tr>
      		<td>January</td>
      		<td>$100</td>
      	</tr><tr>
      		<td>January</td>
      		<td>$100</td>
      	</tr><tr>
      		<td>January</td>
      		<td>$100</td>
      	</tr><tr>
      		<td>January</td>
      		<td>$100</td>
      	</tr><tr>
      		<td>January</td>
      		<td>$100</td>
      	</tr>
      	</table>
      </div>
      
      
      </body>
      </html>
    3. 字体文件图片文件自行百度下载 calibri.ttf、simsun.ttc、logo.png

  7. Controller测试

    @Controller
    @RequestMapping("/pdf")
    public class PdfController {
    
    private static final ClassPathResource LOGO_PATH = new ClassPathResource("templates/logo.png");
    private static final String templateName = "templateFCss.html";
    
    @GetMapping("/sample")
    public void sample(HttpServletResponse response) {
    try {
    Map data = new HashMap<>();
    data.put("name", "路奇.D.艾尼路 儸傑");
    File file = new File(LOGO_PATH.getURL().getPath());
    data.put("fileType", "image/jpeg");
    data.put("file64Str", JavaToPdfHtmlFreeMarkerCss.fileToBase64Str(file));
    JavaToPdfHtmlFreeMarkerCss.exportPdf(data, templateName, "我的PDF", response);
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }

    freemarker中需要注意的语法:

    <style>
            .success {
                color: #1ab394;
                font-weight: bold;
            }
    
            .warning {
                color: #f8ac59;
                font-weight: bold;
            }
    
            .failure {
                color: #ed5565;
                font-weight: bold;
            }
    </style>
    
    
    // freemarker中的语法:
    
    1、判断Java布尔变量testResult的TRUE、FALSE:
    <td style="width: 15%;" class="${testResult?string('success', 'failure')}">
        ${testResult?string('成功', '失败')}
    </td>
    
    2、判断Java集合faultList变量是否为空,不为空则遍历,为空则显示暂无记录:
    <#if faultList?? &&(faultList?size > 0)>
        <!-- 遍历faultList中的每个故障记录 -->
        <#list faultList as fault>
            <tr>
                <td>${fault.id}</td>
                <td>${fault.alarmContent}</td>
                <td>${fault.startTime}</td>
                <td>${fault.endTime}</td>
                <td>${fault.duration}</td>
                <td>${fault.reason}</td>
            </tr>
        </#list>
        <#else>
            <tr>
                <td colspan="6" style="text-align: center;">暂无记录</td>
            </tr>
    </#if>
    
    3、IF/ELSE语句的使用:
    <td style="width: 15%;" 
        class="<#if (testResult=0)>failure
               <#elseif (testResult=1)>success
               <#elseif (testResult=2)>warning
               </#if>">
        <#if (testResult=0)>失败
        <#elseif (testResult=1)>成功
        <#elseif (testResult=2)>空跑中
        </#if>
    </td>
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

itextpdf、freemarker和flying-saucer-pdf实现PDF导出功能 的相关文章

随机推荐

  • EasyExcel,让excel导入导出更加简单

    EasyExcel EasyExcel是一个基于Java的简单 省内存的读写Excel的开源项目 在尽可能节约内存的情况下支持读写百M的Excel github地址 https github com alibaba easyexcel JA
  • 数据降维算法

    文章目录 效果一览 文章概述 部分源码 参考资料 效果一览 文章概述 数据降维算法 Matlab 基于局部费歇尔判别 LFDA 的分类数据降维可视化 部分源码
  • OpenCV Android以及扩展模块opencv_contrib的编译

    OpenCV和OpenCV contrib模块4 5 x版本的编译 环境准备 Ubuntu 16 04 1 环境变量 export ANDROID HOME work android sdk export ANDROID NDK HOME
  • 【allegro 17.4软件操作保姆级教程一】软件操作环境设置

    个人主页 highman110 作者简介 一名硬件工程师 持续学习 不断记录 保持思考 输出干货内容 目录 1操作环境准备 1 1单位设置 1 2画布面积设置 1 3软件显示设置 1 4布局显示设置 1 5格点设置 1 6大十字光标设置 1
  • 什么场景应该用 MongoDB ?

    月初在云栖社区上发起了一个 MongoDB 使用场景及运维管理问题交流探讨 的技术话题 有近5000人关注了该话题讨论 这里就 MongoDB 的使用场景做个简单的总结 谈谈什么场景该用 MongoDB 很多人比较关心 MongoDB 的适
  • 华为OD机试(JAVA)真题 2023(汽水瓶\随机数\进制转换)

    系列文章目录 文章目录 系列文章目录 前言 一 1 汽水瓶 二 明明的随机数 前言 一 1 汽水瓶 某商店规定 三个空汽水瓶可以换一瓶汽水 允许向老板借空汽水瓶 但是必须要归还 小张手上有n个空汽水瓶 她想知道自己最多可以喝到多少瓶汽水 数
  • 运维岗位面试被问到的问题

    一 tcp ip 三次握手具体过程 二 静态路由动态路由里面有哪些协议 三 ip地址分类 四 iptabled 五 linu系统和windows系统的区别 六 linux软连接与硬链接的区别 七 Linux命令 八 如何将一个用户添加到某一
  • cocosCreator 之 ScrollView

    版本 3 4 0 参考 ScrollView组件 简介 ScrollView组件作为滚动容器来使用 它的实现通过ScrollBar组件来展示内容的位置和Mask组件显示指定区域 来保证有限的区域内显示更多的内容 它的构成部分 ScrollB
  • 史上功能最全的Java权限认证框架

    文章目录 Sa Token是什么 Sa Token 能做什么 代码示例 官网地址 sa token 使用示例 SpringBoot 环境 1 创建项目 2 设置jar包依赖 3 配置文件 4 启动类 5 运行 Sa Token是什么 sa
  • LeetCode 101:和你一起你轻松刷题(python版) 第 1 章 题目分类

    LeetCode 101 和你一起你轻松刷题 python版 注 作者 高畅 Chang Gao 原书为c 版本 解题思路清晰 知识点全面 是一本好书 翻译成python版本的解法可能未必是最优解法 由于本人是新手小白 算法实现是第一步 优
  • stm32+lwip(四):网页服务器测试

    ST官方有lwip的例程 下载地址如下 https www st com content st com en products embedded software mcus embedded software stm32 embedded
  • ubuntu 22.04 升级openssh9.4p1 ,openssl3.1.2,zlib1.2.13

    参考 https blog csdn net weixin 37534043 article details 120822689 https blog csdn net xujiamin0022016 article details 878
  • C++设计模式---组合模式

    文章目录 使用场景 组合模式的定义 安全组合模式 使用场景 组合模式和类与类之间的组合是不同的概念 组合模式主要用来处理树形结构的数据 如果要表达的数据不是树形结构 就不太适合组合模式 比如我们有一个目录结构 这个目录我们把它绘制成树形结构
  • python中sha1 md5等用法

    import hashlib sha1 hashlib sha1 sha1 update a encode utf 8 sha1 update b encode utf 8 sha1 update c encode utf 8 等同于 sh
  • Linux下more命令高级用法

    我们在 Linux 环境下工作时 每天肯定会跟各种各样的文本文件打交道 这些文件 有时候会非常长 无法在一屏的空间内显示完全 所以 在查看这种文件时 我们需要分页显示 这时 我们就可以使用 more 命令 more 命令基本用法 more
  • 上传文件至svn

    1 软件管理搜索下载tortoiseSVN 2 在D盘新建一个文件夹 重命名 最好与SVN上要上传的目录名字保持一致 自己取也可以 3 选中文件夹右键点击SVN checkout 弹出框标红的填写XXSVN上的地址 拉取远程仓库的文件 完成
  • 游戏贪吃蛇计分c语言,C语言实现贪吃蛇游戏(命令行)

    这是一个纯C语言写的贪吃蛇游戏 供大家参考 具体内容如下 include include include include include define SNAKE LENGTH 100 定义蛇的最大长度 define SCREEN WIDE
  • C++中的STL中map用法详解

    C 中的STL中map用法详解 Map是STL的一个关联容器 它提供一对一 其中第一个可以称为关键字 每个关键字只能在map中出现一次 第二个可能称为该关键字的值 的数据 处理能力 由于这个特性 它完成有可能在我们处理一对一数据的时候 在编
  • 我们规定对一个字符串的shift操作如下:

    shift ABCD 0 ABCD shift ABCD 1 DABC shift ABCD 2 CDAB 换言之 我们把最左侧的N个字符剪切下来 按序附加到了右侧 给定一个长为n的字符串 我们规定最多可以进行n次向左的循环shift操作
  • itextpdf、freemarker和flying-saucer-pdf实现PDF导出功能

    目录 目录 1 导入maven 2 代码结构 编辑 3 纯文本生成方式 JavaToPdfHtml template html simhei ttf 字体文件自行百度下载 4 基础上加了freemarker模板引擎 JavaToPdfHtm