当前位置: 首页 > wzjs >正文

怎样设计一个公司网站wordpress设置用户访问个数据库

怎样设计一个公司网站,wordpress设置用户访问个数据库,dw做的网站如何让别人看看,企业管理系统论文使用PDFBox可以渲染生成pdf文档,并且自定义程度高,只是比较麻烦,pdf的内容位置都需要手动设置x(横向)和y(纵向)绝对位置,但是每个企业的单据都是不一样的,一般来说都会设…

使用PDFBox可以渲染生成pdf文档,并且自定义程度高,只是比较麻烦,pdf的内容位置都需要手动设置x(横向)和y(纵向)绝对位置,但是每个企业的单据都是不一样的,一般来说都会设置一个模板,然后内容再填充到适当位置,所以这个功能还是有用的

1. 实际效果

在这里插入图片描述
填充数据后效果
在这里插入图片描述
实现代码:
以下代码基于PDFBox依赖版本-2.0.23

public class Demo01 {public static void main(String[] args) throws Exception{// 设定中文字体File fontFile = new File("C:\\Windows\\Fonts\\simHei.ttf");try (PDDocument document = new PDDocument()) {PDType0Font load = PDType0Font.load(document, fontFile);PDPage page;for (int i = 0; i < 1; i++) {page = new PDPage();document.addPage(page);// 对具体PDPage设定内容try(PDPageContentStream contentStream = new PDPageContentStream(document, page)) {contentStream.setFont(load, 25);contentStream.beginText();// newLineAtOffset方法contentStream.newLineAtOffset(220, 750);contentStream.showText("借用出库打印单");contentStream.setFont(load, 12);contentStream.endText();// 仓库和会员渲染位置contentStream.beginText();contentStream.newLineAtOffset(80, 700); // 80,700contentStream.showText("仓库:");contentStream.newLineAtOffset(300, 0); //380,700contentStream.showText("会员:");contentStream.endText();// 销售员和操作人渲染位置contentStream.beginText();contentStream.newLineAtOffset(80, 675); // 80,675contentStream.showText("销售员:");contentStream.newLineAtOffset(300, 0); //380,675contentStream.showText("操作人:");contentStream.endText();// 操作时间位置contentStream.beginText();contentStream.newLineAtOffset(80, 650); // 80,650contentStream.showText("操作时间:");contentStream.endText();// ----------------实际内容-----------------------// 表头contentStream.beginText();contentStream.newLineAtOffset(80, 625); //80,625contentStream.showText("序号");contentStream.newLineAtOffset(40, 0); //120,625contentStream.showText("商品编号");contentStream.newLineAtOffset(80, 0); //200,625contentStream.showText("商品名称");contentStream.newLineAtOffset(70, 0); //270,625contentStream.showText("单位");contentStream.newLineAtOffset(40, 0); //310,625contentStream.showText("借出数量");contentStream.newLineAtOffset(70, 0); //380,625contentStream.showText("备注");contentStream.newLineAtOffset(100, 0); //480,625contentStream.showText("零售价");contentStream.endText();Map<String, String> contentMap = new HashMap<>();contentMap.put("序号", "1");contentMap.put("商品编号", "000212130023");contentMap.put("商品名称", "洗地机124123");contentMap.put("单位", "个");contentMap.put("借出数量", "13");contentMap.put("备注", "我是备注我是备注");contentMap.put("零售价", "1123300.34");fillContent(contentStream, contentMap, load);// 结尾结构渲染// 合计位置contentStream.beginText();contentStream.newLineAtOffset(80, 150); // 80,150contentStream.showText("合计");contentStream.endText();// 出库数量和总金额位置contentStream.beginText();contentStream.newLineAtOffset(110, 125); // 110,125contentStream.showText("出库数量:");contentStream.newLineAtOffset(270, 0); // 380,125contentStream.showText("总金额:");contentStream.endText();// 签名位置contentStream.beginText();contentStream.newLineAtOffset(80, 50); // 110,125contentStream.showText("签名:_______");contentStream.endText();// 模拟填充模板Map<String, String> map = new HashMap<>();map.put("仓库", "上海仓");map.put("会员", "小明");map.put("销售员", "销售员01");map.put("操作人", "系统管理员");map.put("操作时间", "2025年4月1日23点07分");map.put("出库数量", "1455");map.put("总金额", "285743835.45");fillTemplate(contentStream, map);}}document.save("demo01.pdf");System.out.println("PDF created successfully!");} catch (IOException e) {throw new RuntimeException(e);}}// 填充固定模板方法 该方法不填充中间详细内容public static void fillTemplate(PDPageContentStream contentStream, Map<String, String> map) {try {contentStream.beginText();contentStream.newLineAtOffset(130, 700);contentStream.showText(map.get("仓库"));contentStream.endText();contentStream.beginText();contentStream.newLineAtOffset(430, 700);contentStream.showText(map.get("会员"));contentStream.endText();contentStream.beginText();contentStream.newLineAtOffset(130, 675);contentStream.showText(map.get("销售员"));contentStream.endText();contentStream.beginText();contentStream.newLineAtOffset(430, 675);contentStream.showText(map.get("操作人"));contentStream.endText();contentStream.beginText();contentStream.newLineAtOffset(150, 650);contentStream.showText(map.get("操作时间"));contentStream.endText();contentStream.beginText();contentStream.newLineAtOffset(180, 125);contentStream.showText(map.get("出库数量"));contentStream.endText();contentStream.beginText();contentStream.newLineAtOffset(430, 125);contentStream.showText(map.get("总金额"));contentStream.endText();} catch (IOException e) {throw new RuntimeException(e);}}public static void fillContent(PDPageContentStream contentStream, Map<String, String> map, PDType0Font font) {try {contentStream.setFont(font, 10);contentStream.beginText();contentStream.newLineAtOffset(80, 600);contentStream.showText(map.get("序号"));contentStream.endText();contentStream.beginText();contentStream.newLineAtOffset(120, 600);contentStream.showText(map.get("商品编号"));contentStream.endText();contentStream.beginText();contentStream.newLineAtOffset(200, 600);contentStream.showText(map.get("商品名称"));contentStream.endText();contentStream.beginText();contentStream.newLineAtOffset(270, 600);contentStream.showText(map.get("单位"));contentStream.endText();contentStream.beginText();contentStream.newLineAtOffset(310, 600);contentStream.showText(map.get("借出数量"));contentStream.endText();contentStream.beginText();contentStream.newLineAtOffset(380, 600);contentStream.showText(map.get("备注"));contentStream.endText();contentStream.beginText();contentStream.newLineAtOffset(480, 600);contentStream.showText(map.get("零售价"));contentStream.endText();contentStream.setFont(font, 12);} catch (IOException e) {throw new RuntimeException(e);}}
}

上述代码看着确实是挺繁琐,每个内容的位置都需要设置x和y值,但是没办法
PDF文件本质是「坐标画布」‌:

  1. PDF的渲染模型基于‌绝对坐标系‌(原点在页面左下角),所有元素(文字、图形)必须明确指定位置(x,y)。
  2. 无布局引擎‌:PDF规范未定义“自动换行”或“文档流”等高级排版概念,开发者需自行计算坐标。

但是这样设计的好处就是自定义程度高,你可以任意设计一个PDF文档的模板应该是什么样子,内容该如何填充全部由你自由设定,就像低代码平台一样,市面上成熟开源的低代码平台有许多,但是逻辑都是一开始就定好的,如果你想加上许多符合自己公司需求的功能但是平台没有那么都得自行开发,并且自行开发的代码融合进已有的系统不是一件容易的事情,甚至比自行开发一套系统都麻烦。
所以如果你有这样的需求可以看下上述代码实现,上述代码只是一个简单的demo,我只是进行记录方便自己以后用到。

tips:关于一些方法的解释

                    contentStream.beginText();contentStream.newLineAtOffset(80, 700); // 80,700  --绝对定位contentStream.showText("仓库:");contentStream.newLineAtOffset(300, 0); //380,700  --相对定位(以'仓库:'的位置为准)contentStream.showText("会员:");contentStream.endText();contentStream.beginText();contentStream.newLineAtOffset(80, 675); // 80,675  --绝对定位contentStream.showText("销售员:");contentStream.newLineAtOffset(300, 0); //380,675  --相对定位(以'销售员'的位置为准)contentStream.showText("操作人:");contentStream.endText();

上述代码可以看到在渲染内容时是被包裹在beginText()和endText()方法中间的,这样当你调用newLineAtOffset(x, y)方法时参数中的x和y才从坐标系的绝对位置(绝对位置为画布的左下角0,0)进行定位。如果你在定位时没有重新开启beginText()和endText()时,调用newLineAtOffset(x, y)方法则是参照上一个文本的位置进行相对定位的,相对定位对于需要在同一行的不同位置渲染内容会比较方便。
newLineAtOffset(x, y)方法的官方注释有问题,官方说法是移动到下一行的开头,从当前行的开头进行偏移 (x, y),实测不对,并不会移动到下一行的开头,并且在相对定位时参考的位置也是你上一次的位置的起始点。
如果你需要像写文章那样一段一段的文字进行渲染,那么可以考虑使用另外一个方法

     				contentStream.beginText();contentStream.newLineAtOffset(80, 500); // 设定绝对位置的起点contentStream.setLeading(20); // 文本行距contentStream.showText("XXXXX"); //渲染内容contentStream.newLine(); //开启新行contentStream.showText("XXXXX"); //渲染内容contentStream.newLine(); //开启新行contentStream.showText("XXXXX"); //渲染内容contentStream.newLine(); //开启新行contentStream.endText();

这个方法更适合大段连贯的文字渲染,你只要设定好固定行距之后就可以直接开启新行,新行的位置会成功进入到下一行的开头并且行距就是你设定的值,这样你就不用每次都自行定位了,效果如下
在这里插入图片描述


文章转载自:

http://ftZqaPHA.kgfsz.cn
http://v9QQeCEy.kgfsz.cn
http://Xk4t0YKU.kgfsz.cn
http://ZVpPacjc.kgfsz.cn
http://eSEsMO7W.kgfsz.cn
http://UF6xyT35.kgfsz.cn
http://sFk9xirK.kgfsz.cn
http://E2eKzFYK.kgfsz.cn
http://08LpZhpv.kgfsz.cn
http://tZKJ13an.kgfsz.cn
http://88oOeCPg.kgfsz.cn
http://bXAuhKk6.kgfsz.cn
http://uth3tdzr.kgfsz.cn
http://GkMc6QHx.kgfsz.cn
http://xWT6VZQ7.kgfsz.cn
http://lK3Wzcdd.kgfsz.cn
http://EwVtDAcq.kgfsz.cn
http://1eV2VMVU.kgfsz.cn
http://opzaGHHk.kgfsz.cn
http://IiJShvj2.kgfsz.cn
http://FP8BYJ0u.kgfsz.cn
http://D6eVF0H3.kgfsz.cn
http://a8dT2u98.kgfsz.cn
http://PxJsUa9P.kgfsz.cn
http://zQsLScKT.kgfsz.cn
http://OUzcvMi9.kgfsz.cn
http://5d8VsgXw.kgfsz.cn
http://xRMz5Arm.kgfsz.cn
http://rptbV66s.kgfsz.cn
http://4W9gU8C5.kgfsz.cn
http://www.dtcms.com/wzjs/679562.html

相关文章:

  • IT男为女朋友做的求婚网站唐山网站建设冀icp备
  • 具有营销型网站的公司有哪些知名网络推广
  • 中联网站建设智慧旅游网站建设方案ppt
  • 兰州 网站建设公司哪家好客户管理系统哪家好
  • 怎么设置网站默认首页朱能源做网站
  • 锦州市城市建设服务中心网站哪里有免费永久的云服务器
  • 济南企业建设网站上海优化网站排名
  • dede做视频网站企业网上的推广
  • 品牌型网站成功案例图片天元建设集团有限公司 田新鹏
  • 菏泽做网站网盘app下载
  • 个体户怎么做购物网站白酒最有效的推广方式
  • 网站建设中 请稍后访问怎么做彩票平台网站
  • c语言网站建设网站建设项目登记表
  • html视频网站源码网站建设合同技术开发合同范本
  • 杭州企业网站房屋装修网
  • 网站流量盈利域名注册后网站建设
  • 做淘宝网站的编程实例厦门工程建设招聘信息网站
  • 手机网址进不去怎么设置家居seo整站优化方案
  • 加强社区网站建设工程设计东莞网站建设技术支持
  • wordpress手机版怎么注册类聚seo
  • 网站备案与域名关系外贸流程的基本流程图
  • win7iis添加网站网站排名优化策划
  • 云南建设工程质量监督网站移动互联网开发学什么专业
  • 山东金融行业网站开发小程序企业网站源码
  • 济阳做网站多少钱商标注册网址官方
  • 网站建设设计工具郑州发布最新通知
  • 乌兰县wap网站建设公司finecms
  • 学校网站 aspx源码广州有什么好玩的
  • 网站框架是什么十大免费引流平台
  • 购物网站名称网站更换空间对优化的影响