pdfbox实现pdf合并
目前 Java 的 pdf 文档合并方案常见的有 spire.doc.free、itextpdf、pdfbox 三种。spire.doc.free 的免费版本有页数限制,这里就不考虑了。而性能最好的 itext 的开源协议是AGPL,为了避免以后可能出现的麻烦我放弃了他,选择了可以商用比较友好的 pdfbox。
pdfboxApache pdfbox 是一个开源 Java 库,可用于创建,渲染,打印,拆分,合并,更改,验证和提取 pdf 文件的文本和元数据。
maven 依赖12345<dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox</artifactId> <version>2.0.24</version></dependency>
pdf 合并12345678910public void mergePdf(String... path) throws IOException { ...
Java字符串split、replaceAll忽略全半角和大小写
replaceAll忽略大小写很简,使用正则就可以实现
1String s = "Hello word".replaceAll("(?i)hello","你好");
忽略全角半角就需要自己实现了,实现思路是把原字符串、要匹配的字符串全部转换成半角(全角),然后对转换后的字符串做 indexOf,得到 index 之后替换原字符串。
1234567891011public static String replaceAllIgnoreHalfFull(String source, String toReplace, String replacement) { StringBuilder sbSource = new StringBuilder(source); StringBuilder sbSourceHalf = new StringBuilder(StringUtils.fullToHalf(source)); String searchString = StringUtils.fullToHa ...
Java word转pdf方案
方案调研xdocreporthttps://github.com/opensagres/xdocreport我测试的最新版本(2.0.3 )使用图片会报错,默认不是识别汉子(大概因为字体原因?),不支持批注。网上了解到的可能 word 格式要求较大。
Asposehttps://www.aspose.com/应该是最完美的方案,但是收费,不便宜
WPS 云服务定价未知,文档上没有明确出来。需要注册认证成为服务商需要服务暴露到公网上,因为 wps 会回掉服务。格式没有测试,应该会和 office 有细微的差距。
阿里云服务接口八分钱一次,必须使用阿里云 oss。网上资料很少,个人感觉效果不错,口碑未知。应该是最佳方案。
Libreoffice需要安装 Libreoffice可以使用程序去调用他自带的 soffice 工具来转或者通过 UNO 的方式排版会有差异,而且也涉及到字体问题,涉及到字体版权问题。
Jacob仅支持 windows,大致原理就是调用 Microsoft Office / WPS 来实现转换,当然需要安装对应的软件,因为我们生产系统肯定部署在 linux 上 ...
Excel设置最小行高
问题有个需求,导出导出的 Excel 需要设置最小高度,比如最小高度是 56px,当内容的高度低于 56 的时候,行高设置为 56,当内容高度大于 56 的时候,根据内容高度自适应。
因为 excel 的行高只能设置固定大小,或者设置自适应,而没办法设置上述最小行高,所以普通的办法是做不到这个需求的。
解决可以通过设置字体大小来解决这个最小行高问题。也不知道这是 excel 的 feat 还是 bug。
设置单元格格式——对齐——自动换行——确定
选中一列不使用的列(空白列),把字体设置一下,这样就有了一个最小行高,比如如果字体大小是 18,那么最小行高就是 22.5。
这样可以解决问题,但是相当于废了一个 cell,不过可以接受。
如果换成代码实现的话,可以用 poi 去按照上述步骤设置,当然也可以自己提前编辑好一个模版文件,然后使用 poi 直接 copy 模版文件的格式。
解决poi插入的换行符无法被复制的问题
问题背景在 word 中有两种换行,一种是直接按下回车的”段落换行”而另一种换行符是按下 shift + 回车打出来的换行符
12345## 第一种换行符org.apache.poi.xwpf.usermodel.XWPFRun#addCarriageReturn()## 第二种换行符org.apache.poi.xwpf.usermodel.XWPFRun#addBreak()
第一种换行符比较符合我们日常的使用习惯,但是使用上述 api 打出来的换行符可以在 word 中被正常识别,但是无法通过复制的方式把这个换行符复制到一段文本中。举个例子,如下 word 内容
123第一行第二行第三行
复制到文本文件中变成
1第一行 第二行 第三行
而我们直接在 word 中敲出来的回车换行符可以被正确复制。
解决思路因为直接使用 poi 的 api 无法解决这个问题,所以只能另辟蹊径。最后参考https://stackoverflow.com/questions/14830667/insert-a-line-break-inside-a-paragraph-in-xwpfdocume ...
Ubuntu20.04修改静态ip
给自己瞎折腾的服务器配置一个固定的静态 ip,虽然这玩意对内网穿透没啥用,但是总不能在内网中也从外网走一圈吧,在内网中直接用 ip 访问就好了。
1sudo vi /etc/netplan/00-installer-config.yaml
修改文件内容为
12345678910network: ethernets: ens160: addresses: [192.168.50.8/24] #要修改的ip地址 dhcp4: no #no为静态 yes为自动获取 optional: true gateway4: 192.168.50.4 #网关地址 nameservers: addresses: [192.168.50.4] #dns服务器,多个之间逗号分隔 version: 2
静态 ip 下一定要配置 dns 服务器,否则无法访问外网
使设置生效
1sudo netplan apply
Nginx反向代理https忽略证书错误
因为有需求吧 esxi 暴露到公网上,内网穿透之后,然后反向代理到对应的域名上。这个时候一直 502 错误。因为 esxi 那边暴露的是 443 端口,而证书刚好无效。
1234567891011121314151617181920212223server { server_name esxi.${DOMAIN_NAME}; listen 80; location ^~ / { proxy_pass https://host.docker.internal:7002; proxy_set_header Host $proxy_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-NginX-Proxy true; proxy_http_version 1.1; proxy_set_heade ...
Ubuntu安装frp
下载 frp1wget https://github.com/fatedier/frp/releases/download/v0.44.0/frp_0.44.0_linux_amd64.tar.gz
安装123# 解压tar -vxzf frp_0.44.0_linux_amd64.tar.gzmv frp_0.44.0_linux_amd64 frp
设置开启启动12# 创建并编辑 service文件vim /lib/systemd/system/frps.service
文件内容
1234567891011[Unit]Description=frps daemon[Service]Type=simple# 这里换成你的frp目录ExecStart=/root/app/frp/frps -c /root/app/frp/frps.ini[Install]WantedBy=multi-user.target
这里是我主要用作服务端,因此我只设置了服务端的开机自启动,可以根据需求自行设置
1234# 启动frpsystemctl start frps# 设置frp自启动syste ...
N5105安装ESXi
软件准备Ventoy PE 工具,这里我使用的是微 PE带网卡驱动的 ESXI iso 文件
我打包了需要的软件,懒得找的可以直接用我的。链接:https://pan.baidu.com/s/1hHHfWzF_yR6zN8UhbG9S2g?pwd=p2bd提取码:p2bd
刻录 U 盘
把 Ventory 安装到 U 盘中
使用微 PE 制作 iso 镜像
将制作好的的 PE 以及 ESXI 的 iso 文件复制到 U 盘中
系统安装
进入 bios 关闭安全 boot。
如果要安装的系统盘需要格式化,那么开机的时候按 F7,选择微 PE 系统进去格式化一下。如果不需要则跳过这一步。
开机的时候按 F7,选择 ESXi 的系统进入,跟着步骤走即可。
配置 ESXi 的网络,这里我使用的是 192.168.50.X 网段,可以根据自己的需求调整。
MyBatis缓存机制
正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持。
MyBatis 的缓存分为一级缓存和二级缓存,两种缓存的缓存粒度是一样的,都是对应一条 sql 查询语句,但是二者的生命周期是不一样的,一级缓存的生命周期是 SqlSession 对象的使用期间,随着 SqlSession 对象的死亡而消失;二级缓存如果没有更新数据的话,最长可以和应用的生命周期一样长。
首先查询二级缓存,然后再查询一级缓存。
一级缓存一级缓存也叫本地缓存,在 MyBatis 中,一级缓存是在会话(SqlSession)层面实现的,这就说明一级缓存作用范围只能在同一个 SqlSession 中,跨 SqlSession 是无效的。当 Session flush 或 close 之后,该 Session 中的所有 Cache 就将清空。MyBatis 中一级缓存是默认开启的,不需要任何配置。
这里我加一点我的个人理解(纯个人理解有争议我们可以讨论)MyBatis 的一级缓存存在的基础条件或者说理论依据是 MySql 的默认的事物隔离级别是可重复读,在同一个事务里面不管怎么读结果都是一样的,因 ...