# Itext Pdf 生成、相关API

news/2024/2/28 11:21:26

Itext Pdf 生成、相关API

需求

  • 需求java代码生成PDF效果如下:后端生成 Pdf文件,内容包含基本信息表格,图片、pdf需要有页眉,pdf每页含有页码,pdf含有多页。
  • 上图看看最后生成的效果如下:
    在这里插入图片描述

功能实现

  • 使用 ItextPdf

引入依赖

  • 引入下面的依赖
<!-- itextpdf -->
<dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13.3</version>
</dependency>
<!-- pdf 中文支持 -->
<dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version>
</dependency>
<!--itext-->
<dependency><groupId>org.xhtmlrenderer</groupId><artifactId>core-renderer</artifactId><version>R8</version>
</dependency>
<dependency><groupId>com.itextpdf</groupId><artifactId>layout</artifactId><version>7.2.3</version>
</dependency>

注意点

表格双边线的实现

  • 双边线的实现思路:使用多层单元格嵌套的效果显示所有单元格的边框

页眉和页码的实现

  • 继承PdfPageEventHelper重写对应的方法,在响应的方法中完成相关逻辑。

代码

  • ItextPdfUtils.java
public class ItextPdfUtils {private static final Logger logger = LoggerFactory.getLogger(ItextPdfUtils.class);public static final int TWENTY = 20;public static final int Thirty = 30;public static final int TWELVE = 12;/*** 中文字体,解决中文不能显示问题*/public static BaseFont baseFontChinese = null;public static Font font = null;public static Font blueFont = null;public static Font smallThreeFont = null;public static Font fiveFont = null;public static Font smallFiveFont = null;public static Font smallSixFont = null;public static Font greenFont = null;public static Font messFont = null;public static Font titleFont = null;static {try {baseFontChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);font = new Font(baseFontChinese);font.setSize(10);blueFont = new Font(baseFontChinese);blueFont.setColor(BaseColor.BLUE);blueFont.setSize(5);smallThreeFont = new Font(baseFontChinese, TWENTY);smallThreeFont.setColor(BaseColor.BLACK);fiveFont = new Font(baseFontChinese);fiveFont.setColor(BaseColor.BLACK);fiveFont.setSize(10.5f);smallFiveFont = new Font(baseFontChinese);smallFiveFont.setColor(BaseColor.BLACK);smallFiveFont.setSize(9);smallSixFont = new Font(baseFontChinese);smallSixFont.setColor(BaseColor.BLACK);smallSixFont.setSize(6.5f);greenFont = new Font(baseFontChinese, TWELVE, Font.BOLD);greenFont.setColor(BaseColor.BLACK);messFont = new Font(baseFontChinese, 12);messFont.setColor(BaseColor.BLACK);titleFont = new Font(baseFontChinese, 14, Font.BOLD);titleFont.setColor(BaseColor.BLACK);} catch (Exception e) {logger.error("Error Occur:{0}", e);}}/*** pdf 页面生成** @param writer* @param yeMei* @param fontSize* @param pageSize*/public static void setFooter(PdfWriter writer, String yeMei, int fontSize, Rectangle pageSize) {ItextPdfHeaderFooter headerFooter = new ItextPdfHeaderFooter(yeMei, pageSize);writer.setPageEvent(headerFooter);}public static PdfPCell getCell(String title, Font font, int miniMumHeight, int alignMiddle) {PdfPCell pdfPCell;pdfPCell = new PdfPCell(new Phrase(title, font));pdfPCell.setMinimumHeight(miniMumHeight);pdfPCell.setVerticalAlignment(alignMiddle);return pdfPCell;}public static PdfPCell getCell(String title, Font font, int miniMumHeight) {PdfPCell pdfPCell;pdfPCell = new PdfPCell(new Phrase(title, font));pdfPCell.setMinimumHeight(miniMumHeight);return pdfPCell;}public static PdfPCell getCell(String title, Font font, int miniMumHeight, boolean useAscender, int horizontalAlignment, int verticalAlignment) {PdfPCell pdfPCell;pdfPCell = new PdfPCell(new Phrase(title, font));pdfPCell.setUseAscender(useAscender);pdfPCell.setMinimumHeight(miniMumHeight);pdfPCell.setVerticalAlignment(verticalAlignment);pdfPCell.setHorizontalAlignment(horizontalAlignment);return pdfPCell;}public static PdfPCell getCell(String title, Font font, int miniMumHeight, boolean useAscender, int horizontalAlignment, int verticalAlignment, int colSpan) {PdfPCell pdfPCell;pdfPCell = new PdfPCell(new Phrase(title, font));pdfPCell.setUseAscender(useAscender);pdfPCell.setMinimumHeight(miniMumHeight);pdfPCell.setVerticalAlignment(verticalAlignment);pdfPCell.setHorizontalAlignment(horizontalAlignment);pdfPCell.setColspan(colSpan);return pdfPCell;}public static PdfPCell getCell(String title, Font font, Integer miniMumHeight, Boolean useAscender, Integer horizontalAlignment, Integer verticalAlignment, Integer colSpan, Integer rowSpan, Integer border, Integer borderWidthTop, Integer borderWidthLeft, Integer borderWidthRight) {Phrase phrase = new Phrase(title, font);PdfPCell pdfPCell = new PdfPCell(phrase);if (Objects.nonNull(miniMumHeight)) {pdfPCell.setMinimumHeight(miniMumHeight);}if (Objects.nonNull(useAscender)) {pdfPCell.setUseAscender(useAscender);}if (Objects.nonNull(horizontalAlignment)) {pdfPCell.setHorizontalAlignment(horizontalAlignment);}if (Objects.nonNull(verticalAlignment)) {pdfPCell.setVerticalAlignment(verticalAlignment);}if (Objects.nonNull(colSpan)) {pdfPCell.setColspan(colSpan);}if (Objects.nonNull(rowSpan)) {pdfPCell.setRowspan(rowSpan);}if (Objects.nonNull(border)) {pdfPCell.setBorder(border);}if (Objects.nonNull(borderWidthTop)) {pdfPCell.setBorderWidthTop(borderWidthTop);}if (Objects.nonNull(borderWidthLeft)) {pdfPCell.setBorderWidthLeft(borderWidthLeft);}if (Objects.nonNull(borderWidthRight)) {pdfPCell.setBorderWidthRight(borderWidthRight);}return pdfPCell;}
}
  • ItextPdfTest.java
public class ItextPdfTest {private static final Logger logger = LoggerFactory.getLogger(ItextPdfUtils.class);private static final float[] columnWidths5 = {0.5f, 0.5f, 0.5f, 0.5f, 0.5f};/*** 生成 ItextPdf** @return String*/private String createItextPdf() {Date date = new Date();String startTime = new SimpleDateFormat("yyyyMMddHHmmss").format(date);String fileName = "demo";String oldPath = fileName + ".pdf";// 创建文件Document document = new Document();PdfWriter writer = null;try {document.setPageSize(PageSize.A4);// 建立一个书写器writer = PdfWriter.getInstance(document, new FileOutputStream(oldPath));ItextPdfUtils.setFooter(writer, "测试页眉", 12, PageSize.LEGAL);// 打开文件document.open();// 总表设计一个 4 列的表.PdfPTable table = new PdfPTable(4);table.setWidthPercentage(100);table.setSpacingBefore(100f);table.setSpacingAfter(10f);// 设置列宽float[] columnWidths = {0.8f, 0.8f, 0.5f, 0.5f};table.setWidths(columnWidths);PdfPCell cell;// 第一行table.addCell(ItextPdfUtils.getCell("", null, TWENTY, true, Cell.ALIGN_CENTER, Cell.ALIGN_MIDDLE, 0, null, 0, 0, 0, 0));table.addCell(ItextPdfUtils.getCell("ItextPdf 打印测试", smallThreeFont, TWENTY, true, Cell.ALIGN_CENTER, Cell.ALIGN_MIDDLE, 0, null, 0, 0, 0, 0));table.addCell(ItextPdfUtils.getCell("", fiveFont, TWENTY, true, Cell.ALIGN_RIGHT, Cell.ALIGN_BOTTOM, 2, null, 0, null, null, null));// 第三行table.addCell(ItextPdfUtils.getCell("记录人:张三", fiveFont, TWENTY, true, Cell.ALIGN_LEFT, Cell.ALIGN_MIDDLE, 0, null, 0, null, null, null));table.addCell(ItextPdfUtils.getCell("打印日期:" + new SimpleDateFormat("yyyy-MM-dd HH-mm-ss").format(new Date()), fiveFont, TWENTY, true, Cell.ALIGN_CENTER, Cell.ALIGN_MIDDLE, 0, null, 0, null, null, null));table.addCell(ItextPdfUtils.getCell("编号:AAAAAAAAAAAAA号", fiveFont, TWENTY, true, Cell.ALIGN_RIGHT, Cell.ALIGN_MIDDLE, 2, null, 0, null, null, null));// 第一个表格PdfPTable personInfoTable = new PdfPTable(5);float[] headerTableColumnWidth = {0.5f, 0.5f, 0.5f, 0.5f, 0.5f};personInfoTable.setWidthPercentage(100);personInfoTable.setWidths(headerTableColumnWidth);personInfoTable.addCell(ItextPdfUtils.getCell("编号", fiveFont, Thirty, Cell.ALIGN_MIDDLE));personInfoTable.addCell(ItextPdfUtils.getCell("", fiveFont, Thirty, Cell.ALIGN_MIDDLE));personInfoTable.addCell(ItextPdfUtils.getCell("姓名", fiveFont, Thirty, Cell.ALIGN_MIDDLE));personInfoTable.addCell(ItextPdfUtils.getCell("", fiveFont, Thirty, Cell.ALIGN_MIDDLE));Image img = Image.getInstance("demo.jpg");PdfPCell imageCell = new PdfPCell(new Phrase("照片", fiveFont));imageCell.setVerticalAlignment(Cell.ALIGN_MIDDLE);imageCell.setHorizontalAlignment(Cell.ALIGN_CENTER);imageCell.setRowspan(4);imageCell.setImage(img);personInfoTable.addCell(imageCell);personInfoTable.addCell(ItextPdfUtils.getCell("性别", fiveFont, Thirty, Cell.ALIGN_MIDDLE));personInfoTable.addCell(ItextPdfUtils.getCell("", fiveFont, Thirty, Cell.ALIGN_MIDDLE));personInfoTable.addCell(ItextPdfUtils.getCell("籍贯", fiveFont, Thirty, Cell.ALIGN_MIDDLE));personInfoTable.addCell(ItextPdfUtils.getCell("", fiveFont, Thirty, Cell.ALIGN_MIDDLE));personInfoTable.addCell(ItextPdfUtils.getCell("民族", fiveFont, Thirty, Cell.ALIGN_MIDDLE));personInfoTable.addCell(ItextPdfUtils.getCell("", fiveFont, Thirty, Cell.ALIGN_MIDDLE));personInfoTable.addCell(ItextPdfUtils.getCell("出生日期", fiveFont, Thirty, Cell.ALIGN_MIDDLE));personInfoTable.addCell(ItextPdfUtils.getCell("", fiveFont, Thirty, Cell.ALIGN_MIDDLE));personInfoTable.addCell(ItextPdfUtils.getCell("政治面貌", fiveFont, Thirty, Cell.ALIGN_MIDDLE));personInfoTable.addCell(ItextPdfUtils.getCell("", fiveFont, Thirty, Cell.ALIGN_MIDDLE));personInfoTable.addCell(ItextPdfUtils.getCell("学历", fiveFont, Thirty, Cell.ALIGN_MIDDLE));personInfoTable.addCell(ItextPdfUtils.getCell("", fiveFont, Thirty, Cell.ALIGN_MIDDLE));PdfPCell personInfoCell = new PdfPCell(new Phrase(""));personInfoCell.setColspan(4);personInfoCell.addElement(personInfoTable);// 表格的总行高personInfoCell.setFixedHeight(120);table.addCell(personInfoCell);// 备注说明PdfPTable remarkTable = new PdfPTable(2);remarkTable.setWidthPercentage(100);float[] remarkColumnWidth = {0.1f, 0.9f};remarkTable.setWidths(remarkColumnWidth);PdfPCell remarkCell;remarkCell = new PdfPCell(new Phrase("情况说明(个人家庭情况做简单说明):", fiveFont));remarkCell.setHorizontalAlignment(Cell.ALIGN_CENTER);remarkCell.setVerticalAlignment(Cell.ALIGN_MIDDLE);remarkTable.addCell(remarkCell);remarkCell = new PdfPCell(new Phrase("", fiveFont));remarkCell.setMinimumHeight(200);remarkTable.addCell(remarkCell);PdfPCell remark = new PdfPCell(new Phrase(""));remark.setMinimumHeight(200);remark.setColspan(4);remark.addElement(remarkTable);table.addCell(remark);// 姓名性别表格PdfPTable mainLeftTable = new PdfPTable(2);mainLeftTable.setWidthPercentage(100);float[] columnWidths0 = {0.8f, 0.8f};mainLeftTable.setWidths(columnWidths0);mainLeftTable.addCell(ItextPdfUtils.getCell("家庭成员", fiveFont, 28, true, Cell.ALIGN_CENTER, Cell.ALIGN_MIDDLE));mainLeftTable.addCell(ItextPdfUtils.getCell("身份证号", fiveFont, 28, true, Cell.ALIGN_CENTER, Cell.ALIGN_MIDDLE));mainLeftTable.addCell(ItextPdfUtils.getCell("李四", fiveFont, TWENTY, true, Cell.ALIGN_CENTER, Cell.ALIGN_MIDDLE));mainLeftTable.addCell(ItextPdfUtils.getCell("632123111100000000", fiveFont, TWENTY, true, Cell.ALIGN_CENTER, Cell.ALIGN_MIDDLE));mainLeftTable.addCell(ItextPdfUtils.getCell("王五", fiveFont, TWENTY, true, Cell.ALIGN_CENTER, Cell.ALIGN_MIDDLE));mainLeftTable.addCell(ItextPdfUtils.getCell("632123111100000000", fiveFont, TWENTY, true, Cell.ALIGN_CENTER, Cell.ALIGN_MIDDLE));mainLeftTable.addCell(ItextPdfUtils.getCell("王五", fiveFont, TWENTY, true, Cell.ALIGN_CENTER, Cell.ALIGN_MIDDLE));mainLeftTable.addCell(ItextPdfUtils.getCell("632123111100000000", fiveFont, TWENTY, true, Cell.ALIGN_CENTER, Cell.ALIGN_MIDDLE));//左上角cell = new PdfPCell(new Phrase("", fiveFont));cell.setMinimumHeight(80);cell.setUseAscender(true);cell.setHorizontalAlignment(Cell.ALIGN_CENTER);cell.setVerticalAlignment(Cell.ALIGN_MIDDLE);cell.setRowspan(5);cell.setColspan(2);cell.setBorderWidthRight(0);cell.setBorderWidthBottom(0);cell.setPaddingRight(-0.2f);cell.addElement(mainLeftTable);table.addCell(cell);// 设计一个3列的表.PdfPTable rightOne = new PdfPTable(3);// 宽度100%填充rightOne.setWidthPercentage(100);float[] columnWidths1 = {0.06f, 0.06f, 0.06f};rightOne.setWidths(columnWidths1);rightOne.addCell(ItextPdfUtils.getCell("正常收入", fiveFont, 14, true, Cell.ALIGN_CENTER, Cell.ALIGN_TOP, 3));rightOne.addCell(ItextPdfUtils.getCell("千", fiveFont, 14, true, Cell.ALIGN_CENTER, Cell.ALIGN_TOP));rightOne.addCell(ItextPdfUtils.getCell("百", fiveFont, 14, true, Cell.ALIGN_CENTER, Cell.ALIGN_TOP));rightOne.addCell(ItextPdfUtils.getCell("十", fiveFont, 14, true, Cell.ALIGN_CENTER, Cell.ALIGN_TOP));// 正常收入  3行for (int i = 0; i < 9; i++) {rightOne.addCell(ItextPdfUtils.getCell("", fiveFont, TWENTY, true, Cell.ALIGN_CENTER, Cell.ALIGN_TOP));}//正常收入 3行cell = new PdfPCell(new Phrase("", fiveFont));cell.setMinimumHeight(68);cell.setUseAscender(true);cell.setHorizontalAlignment(Cell.ALIGN_CENTER);cell.setVerticalAlignment(Cell.ALIGN_TOP);cell.setBorderWidthRight(0);cell.setBorderWidthLeft(0);cell.setBorderWidthBottom(0);cell.setPaddingLeft(2.5f);cell.setPaddingBottom(-3);cell.setRowspan(5);cell.addElement(rightOne);table.addCell(cell);// 设计一个 3 列的表.PdfPTable rightTwo = new PdfPTable(3);// 宽度100%填充rightTwo.setWidthPercentage(102);// 设置列宽float[] columnWidths2 = {0.06f, 0.06f, 0.06f};rightTwo.setWidths(columnWidths2);PdfPCell cell2;rightTwo.addCell(ItextPdfUtils.getCell("补助", fiveFont, 14, true, Cell.ALIGN_CENTER, Cell.ALIGN_TOP, 3));rightTwo.addCell(ItextPdfUtils.getCell("千", fiveFont, 14, true, Cell.ALIGN_CENTER, Cell.ALIGN_TOP));rightTwo.addCell(ItextPdfUtils.getCell("百", fiveFont, 14, true, Cell.ALIGN_CENTER, Cell.ALIGN_TOP));rightTwo.addCell(ItextPdfUtils.getCell("十", fiveFont, 14, true, Cell.ALIGN_CENTER, Cell.ALIGN_TOP));// 补助 3 行for (int i = 0; i < 9; i++) {rightTwo.addCell(ItextPdfUtils.getCell("十", fiveFont, TWENTY, true, Cell.ALIGN_CENTER, Cell.ALIGN_TOP));}// 补助 3行cell = new PdfPCell(new Phrase("", fiveFont));cell.setMinimumHeight(80);cell.setUseAscender(true);cell.setHorizontalAlignment(Cell.ALIGN_CENTER);cell.setVerticalAlignment(Cell.ALIGN_TOP);cell.setBorderWidthLeft(0);cell.setBorderWidthBottom(0);cell.setPaddingRight(3);cell.setPaddingBottom(-3);cell.setRowspan(5);cell.addElement(rightTwo);table.addCell(cell);// 设计一个1列的表.PdfPTable table4 = new PdfPTable(1);table4.setWidthPercentage(100);float[] columnWidths4 = {1.6f};table4.setWidths(columnWidths4);table4.addCell(ItextPdfUtils.getCell("金额合计:捌佰陆拾壹元陆角玖分", fiveFont, TWENTY, true, Cell.ALIGN_LEFT, Cell.ALIGN_MIDDLE));//最后一行cell = new PdfPCell(new Phrase("", fiveFont));cell.setBorderWidthRight(0);cell.setBorderWidthTop(0);cell.setPaddingRight(-0.2f);cell.setPaddingTop(-0.5f);cell.addElement(table4);cell.setColspan(2);table.addCell(cell);// 设计一个 3 列的表.PdfPTable table3 = new PdfPTable(3);table3.setWidthPercentage(102);float[] columnWidths3 = {0.06f, 0.06f, 0.06f,};table3.setWidths(columnWidths3);for (int i = 0; i < 3; i++) {table3.addCell(ItextPdfUtils.getCell("", smallSixFont, TWENTY, true, Cell.ALIGN_CENTER, Cell.ALIGN_MIDDLE));}cell = new PdfPCell(new Phrase("", smallFiveFont));cell.setBorderWidthRight(0);cell.setBorderWidthLeft(0);cell.setBorderWidthTop(0);cell.setPaddingLeft(2.5f);cell.setPaddingTop(-0.5f);cell.addElement(table3);table.addCell(cell);cell = new PdfPCell(new Phrase("", smallFiveFont));cell.setBorderWidthLeft(0);cell.setBorderWidthTop(0);cell.setPaddingTop(-0.5f);cell.setPaddingRight(3);cell.addElement(table3);table.addCell(cell);// 领导意见PdfPTable remarkTableOne = new PdfPTable(2);remarkTableOne.setWidthPercentage(100);remarkTableOne.setWidths(remarkColumnWidth);remarkTableOne.addCell(ItextPdfUtils.getCell("领导意见", fiveFont, 200, true, Cell.ALIGN_CENTER, Cell.ALIGN_CENTER));remarkTableOne.addCell(ItextPdfUtils.getCell("", fiveFont, 200, true, Cell.ALIGN_CENTER, Cell.ALIGN_CENTER));remarkTableOne.addCell(ItextPdfUtils.getCell("", fiveFont, 200));PdfPCell remarkOne = new PdfPCell(new Phrase(""));remarkOne.setMinimumHeight(200);remarkOne.setColspan(4);remarkOne.addElement(remarkTableOne);table.addCell(remarkOne);document.add(table);// 表尾Paragraph paragraphTail = new Paragraph("制单人:李某某", fiveFont);paragraphTail.setLeading(10);paragraphTail.setAlignment(Element.ALIGN_LEFT);document.add(paragraphTail);// 第二页createTwoPage(document);} catch (Exception e) {logger.error("Error Occur:", e);} finally {// 关闭文档document.close();// 关闭书写器if (writer != null) {writer.close();}}return oldPath;}/*** 第二三页的内容** @param document* @throws DocumentException*/private void createTwoPage(Document document) throws DocumentException {document.newPage();document.setMargins(4, 4, 4, 50);document.addAuthor("张三");document.addHeader("测试", "测试打印页头部");PdfPTable table = new PdfPTable(5);table.setWidths(columnWidths5);table.setWidthPercentage(100);PdfPCell cell;for (int i = 0; i < 500; i++) {if (i <= 4) {cell = new PdfPCell(new Phrase("测试列" + i, fiveFont));cell.setMinimumHeight(20);} else {cell = new PdfPCell(new Phrase(String.valueOf(i), fiveFont));cell.setMinimumHeight(15);}table.addCell(cell);}document.add(table);}@Testpublic void test1() {createItextPdf();}
}
  • 页眉和页码处理:ItextPdfHeaderFooter.java
public class ItextPdfHeaderFooter extends PdfPageEventHelper {public String header;public PdfTemplate total;public Rectangle pageSize;public ItextPdfHeaderFooter(String yeMei, Rectangle pageSize) {this.header = yeMei;this.pageSize = pageSize;}@Overridepublic void onOpenDocument(PdfWriter writer, Document document) {total = writer.getDirectContent().createTemplate(50, 50);// 共 页 的矩形的长宽高}@Overridepublic void onEndPage(PdfWriter writer, Document document) {// 写入页眉ColumnText.showTextAligned(writer.getDirectContent(), Element.ALIGN_LEFT, new Phrase(header, ItextPdfUtils.font), document.left(250), document.top() + 20, 0);// 写入前半部分的 第 X页/共int pageS = writer.getPageNumber();String foot1 = "第 " + pageS + "页 / 共";Phrase footer = new Phrase(foot1, ItextPdfUtils.font);// 计算前半部分的foot1的长度,后面好定位最后一部分的'Y页'这俩字的x轴坐标,字体长度也要计算进去 = lenfloat len = ItextPdfUtils.baseFontChinese.getWidthPoint(foot1, ItextPdfUtils.font.getSize());// 拿到当前的PdfContentBytePdfContentByte cb = writer.getDirectContent();// 写入页脚1,x轴就是(右margin+左margin + right() -left()- len)/2.0F 再给偏移20F适合人类视觉感受,否则肉眼看上去就太偏左了 ,y轴就是底边界-20,否则就贴边重叠到数据体里了就不是页脚了;注意Y轴是从下往上累加的,最上方的Top值是大于Bottom好几百开外的。ColumnText.showTextAligned(cb, Element.ALIGN_CENTER, footer, (document.rightMargin() + document.right() + document.leftMargin() - document.left() - len) / 2.0F + 20F, document.bottom() - 20, 0);// 写入页脚2的模板(就是页脚的Y页这俩字)添加到文档中,计算模板的和Y轴,X=(右边界-左边界 - 前半部分的len值)/2.0F + len , y 轴和之前的保持一致,底边界-20cb.addTemplate(total, (document.rightMargin() + document.right() + document.leftMargin() - document.left()) / 2.0F + 20F, document.bottom() - 20);}@Overridepublic void onCloseDocument(PdfWriter writer, Document document) {// 关闭文档的时候,将模板替换成实际的 Y 值total.beginText();// 生成的模版的字体、颜色total.setFontAndSize(ItextPdfUtils.baseFontChinese, ItextPdfUtils.font.getSize());String foot = (writer.getPageNumber()) + "页";// 模版显示的内容total.showText(foot);total.endText();total.closePath();}
}

完整代码

  • 见地址:https://gitee.com/Marlon_Brando/JavaTest/tree/develop/src/main/java/otherapi

http://www.ppmy.cn/news/890196.html

相关文章

【自动化办公】python处理PDF文件操作指南

写在前面 想问问&#xff1a;你们有么有遇到&#xff01;AttributeError: Document object has no attribute _getXrefLength 最近处理一下PDF文件&#xff0c;根据一些网上的教程&#xff0c;写一些python脚本&#xff0c;实现处理PDF的基本自动化处理。 实现目标 [外链图…

基于梯度下降的线性回归(Gradient Descent For Linear Regression)

概述&#xff1a; 梯度下降是很常用的算法&#xff0c;它不仅被用在线性回归上和线性回归模型、平方误差代价函数。在本次&#xff0c;我们要将梯度下降和代价函数结合。我们将用到此算法&#xff0c;并将其应用于具体的拟合直线的线性回归算法里。 梯度下降算法和线性回归算法…

firewall

删除规则 firewall-cmd --permanent --remove-rich-rule rule family"ipv4" source address"0.0.0.0" port port"22" protocol"tcp" accept启动firewall systemctl start firewalld关闭firewall命令 systemctl stop firewalld查看所…

nba2k19服务器稳定,《NBA2K19》国行试玩 完全中文语音+优质稳定网络

近日&#xff0c;游侠的小编得到了《NBA 2K19》PS4国行平台唯一发行方上海星游纪的邀请&#xff0c;获得了一个《NBA 2K19》国行版的试玩机会。其实小编一直非常期待国行版&#xff0c;毕竟这会是一个最适合我们的版本。那么国行版究竟有哪些特色&#xff1f;又有哪些东西给人留…

nba2k21那个php是啥,nba2k21赛季怎么玩 nba2k21赛季玩法介绍-游侠网

nba2k21赛季怎么玩&#xff1f;此次版本中新添加了赛季功能&#xff0c;很多小伙伴还不清楚怎么玩吧&#xff0c;今天小编给大家带来nba2k21赛季玩法介绍&#xff0c;快来看一下吧。 nba2k21赛季玩法介绍 游戏的此次版本中&#xff0c;新添加了赛季玩法。 进入赛季页面后可以得…

CSDN竞赛62期分析

文章目录 CSDN竞赛62期分析1.给定两个矩形的坐标求两个矩形的覆盖面积题目说明题目分析代码 2.坐标轴移动是否能达到终点的问题题目说明输入格式题目分析代码 CSDN竞赛62期分析 第一次参加CSDN周赛&#xff0c;表现真的是一塌糊涂&#xff0c;所以把题目记下来&#xff0c;有空…

《英雄联盟》提示丢失D3DCompiler_43.dll的三个解决方法

在我们打开游戏《英雄联盟》的时候&#xff0c;计算机报错提示“由于找不到D3DCompiler_43.dll&#xff0c;无法继续执行此代码”&#xff0c;“D3DCompiler_43.dll丢失”是怎么回事呢&#xff1f;D3DCompiler_43.dll是一个Microsoft DirectX的组件文件&#xff0c;它是用于编译…

安卓小游戏 2048 新手练手项目 完整代码(含注释)

看了极客的安卓2048的开发教程&#xff0c;大概了解了一下思路&#xff0c;然后自己就开始写了。后来发现这个设计思路不是太好&#xff0c;不方便加移动动画&#xff0c;就只加了创建卡片和合并的动画&#xff0c;不过用来练手还可以。 游戏截图如下&#xff1a; 如果想拷贝…

Android游戏开发(一)

本专题将进行Android游戏开发的系列讲解 Android图形编程基础对于开发游戏&#xff0c;尤其重要。 Android图形编程的基本概念&#xff1a; &#xff08;一&#xff09;颜色对象 Color &#xff08;二&#xff09;画笔对象 Paint &#xff08;三&#xff09;画布对象 C…

如何开发安卓游戏(转)

如何开发安卓游戏如果你以前从没写过代码&#xff0c;在你前进路上还要学习很多&#xff0c;但别气馁。接下来便是开发游戏的一些主要步骤&#xff0c;让我们来学习一下&#xff1a;一、获取tanjurd SDK新手上路的第一步便是获取Android SDK(软件开发工具包)。SDK里有一个核心类…

android版游戏

这是一款休闲益智小游戏&#xff0c;儿童时代玩的较多&#xff0c;在文学作品中出现多次。玩法简单&#xff0c;但变化丰富&#xff0c;老少皆宜&#xff01;小小提示&#xff1a;“有时等待比主动更有机会&#xff0c;当然你要为机会准备充分”&#xff0c;“声东击西是个好办…

JAVA安卓游戏开发,一款简单的文字策略游戏《我是校长之圣代崛起》

安卓端回合制文字策略游戏开发 上网络程序设计这门课&#xff0c;课程要求做个基于android studio的安卓小游戏&#xff0c;要结合上海大学背景&#xff0c;所以做了这个小游戏&#xff0c;分享一下。虽然不好玩哈哈 开发环境 C:\Users\XXX>java --version java 11.0.1 2…

基于linux下的高并发服务器开发(第一章)- 文件属性操作函数

08 / 文件属性操作函数 1、access.c #include <unistd.h>int access(const char *pathname, int mode); 作用&#xff1a;判断某个文件是否有某个权限&#xff0c;或者判断文件是否存在 参数&#xff1a; - pathname: 判断的文件路径 - mode: …

部分安卓游戏可在华为鸿蒙OS上运行

本文转载自IT之家 IT之家 5 月 14 日消息 华为在 2019 年开发者大会上正式推出了鸿蒙 OS 系统&#xff0c;并首先应用在智慧屏等产品上&#xff0c;并于 2020 年开发者大会上宣布为智能手机升级支持鸿蒙 HarmonyOS 2.0。华为消费者业务软件部总裁、AI 与智慧全场景业务部部长王…

Unity开发安卓游戏(2):基于安卓游戏的优化方案总结

基于Unity3d 引擎的Android游戏优化 最近项目进入收尾阶段&#xff0c;之前对项目做了很多优化&#xff0c;mesh合并 &#xff0c;减少DrawCall和模型骨骼以及物理计算&#xff0c;合并材质球&#xff0c;优化代码等等&#xff0c;在IOS上还好&#xff0c;但是Android上&#…

安卓游戏中的精品~你玩过吗?

安卓游戏形式多种多样&#xff0c;精品层出不穷&#xff0c;今天为大家整理了五款精品的安卓游戏&#xff1a; 射击之王&#xff1a;《现代战场3》   要说最经典的动作射击游戏还要说现代战争&#xff0c;而堕落的国度更是将现代战争系列中最巅峰的作品。恐怖组织已经让美国…

spring boot 配置cacheManager EnableCaching EnableCaching

fast json 的配置 cacheManage Configuration public class ConfigRedisCacheManager {// 缓存自动过期时间private long expire 4;static {ParserConfig.getGlobalInstance().addAccept("com");ParserConfig.getGlobalInstance().setAutoTypeSupport(true);}BeanPr…

javaweb使用Thymeleaf 最凝练的CRUD项目-中

javaweb使用Thymeleaf 最凝练的CRUD项目-中 6、显示首页 ①目标 浏览器访问index.html&#xff0c;通过首页Servlet&#xff0c;渲染视图&#xff0c;显示首页。 ②思路 ③代码 [1]创建PortalServlet <servlet><servlet-name>PortalServlet</servlet-name…

led数字字体_技术丨体育场馆LED显示屏设计与安装要求

点击上方蓝字关注我们 随着LED显示屏在体育场馆上的应用&#xff0c;体育场馆LED显示屏的安装与设计成为场馆和生产厂家关注的焦点话题。对此有专业人士总结了以下几个方面的体育场馆LED显示屏安装与设计要求。 1.LED显示屏安全性与可靠性要求 一般情况下&#xff0c;体育场馆L…
最新文章