Java开发中Word转PDF文件5种方案横向评测

2023-11-04

Java开发中Word转PDF文件5种方案横向评测

前段时间接了个项目,需要各种处理Word模板、转PDF、签章等等,非常头疼,其中光是一个word转PDF就折磨我好久,实现转换很简单,但是效果总是达不到满意,于是我把市面上能找到的word转pdf方法都试了个遍。现在把这些方案来做个横向对比,希望对大家能有帮助。

对比的时候我选择了两个指标来进行对比。

  • 格式保真
    • 经过对比我发现对于一些比较简单的word文档,各种方法差别比较小,但一些复杂的word文档差别就太大了,甚至有的转换之后根本就不能用。所以格式保真是最重要的,就是指是否能够100%保留word文档的格式,分为五个等级
    • 五星:肉眼看不出差别,转换方法也不需要特殊的处理
    • 四星:不影响页面呈现,但细节地方或特殊情况下会出现细微差异,通过程序的特殊处理可以解决。
    • 三星:不影响页面呈现,出现明显的跳页的情况。转换的时候word中的表格是最容易跳页了。
    • 二星:影响页面呈现,影响阅读,格式出现明显偏差,已经影响正常阅读。
    • 一星:严重影响阅读和页面呈现,格式混乱、字体错乱、文档内容丢失等。
  • 相素差异度
    • 使用diffimage图片相似度对比工具进行对比,最后得出diff百分比,软件应该是逐相素对比的,拿这个来做为参考不是很科学,不过在同一尺度下还是能提供一定的格式保真度的数据参考
    • 测试方法是把原版WORD文档用PDF打印的方式导出PDF文件,再把原版PDF和各种不同技术方案生成的PDF全部转成JPG文件进行对比。
  • 兼容性
    • 说起word编程不得不提到依赖于office的方法,但是现在服务器一般都是linux兼容也是需要考虑的指标
  • 性能
    • 一般系统用到转换的时候往往对性能也是有一定的要求的,所以这个也是很重要的参考指标。
  • 价格
    • 这一点主要是开源和收费两种,商用的话肯定也是重要参考指标
  • 文件大小
    • 不算太重要,好吧,好像我是拿这个来凑数的。

关于Word转PDF网上能找到的方案大概有六七种,我选了其中的5种,分别是:

aspose-words、docx4j、openoffice、poi、spire.doc

下面先来简单介绍一下这五种方案

aspose-words

Aspose公司旗下的最全的一套office文档管理方案,公司设在澳大利亚。

公司差不多是专做各种文件格式处理插件的,产品系列挺多,有兴趣可以到官网上看看:

https://www.aspose.com/

在这里插入图片描述

收费价格

许可
Developer Small Business - 1 Developer and 1 Deployment Location 开发人员小型企业- 1个开发人员和1个部署位置 29,291 元
Developer OEM - 1 Developer and Unlimited Deployment Locations 开发人员OEM - 1开发人员和无限部署地点 87,874 元
Site Small Business - Up to 10 Developers and up to 10 Deployment Locations 站点小型企业-多达10个开发人员和多达10个部署地点 146,456元
Site OEM - Up to 10 Developers and Unlimited Deployment Locations 站点OEM -多达10个开发人员和无限部署地点 410,077 元
技术支持服务
Developer Small Business 1 Year Developer Support License - up to 3 incidents per year 开发人员小型企业1年开发人员支持许可证-每年最多3起事故 2,923 元
Aspose Business Support 商业服务
Developer Small Business 1 Year Business Support License - up to 6 incidents per year 开发商小型企业1年业务支持许可证-每年最多6起事故 4,387 元
Developer OEM 1 Year Business Support License - up to 6 incidents per year 开发人员OEM 1年业务支持许可证-每年最多发生6起事故 13,162 元
企业支持
Site Small Business 1 Year Enterprise Support License - up to 6 incidents per year 网站小型企业1年企业支持许可证-每年最多6起事故 29,262 元
Site OEM 1 Year Enterprise Support License - up to 6 incidents per year 站点OEM 1年企业支持许可证-每年最多发生6起事故 87,786 元

兼容性

不需要依赖任何组件,不依赖操作系统。

poi

大名鼎鼎的apache的开源组件,应用非常广泛,我想主要原因可能是开源吧。

官网:https://poi.apache.org/

兼容性

组件拆分较细,引用一些类库,但都问题不大,不依赖操作系统。

OpenOffice

Apache旗下又一开源组件,前身是1998年一家德国公司StarDivision所研发出来的一个办公室软件,称之为StarOffice。1999年8月被sun公司收购。2010年团队成员分家,分出来的一批成立了新团队做一个LibreOffice。2011年6月Oracle将其捐赠给Apache基金会。

官网:https://www.openoffice.org/

兼容性

OpenOffice本身就是一套Office软件,该方案需要使用jodconverter组件配合OpenOffice完成转换,当然也可以使用LibreOffice进行转换,这次并没有测试这个方案

jodconverter:https://sourceforge.net/projects/jodconverter/files/

spire.doc

搜到的时候刚刚打开官网猛一看以为是国外的公司,没想到一切到中文版网页才发现是成都冰蓝科技有限公司出品的,真正的国产。刚刚查到官网的时候是非常期待他的表现的。

官网:https://www.e-iceblue.com/ https://www.e-iceblue.cn/

兼容性

不需要依赖任何组件,不依赖操作系统。

价格

只截图了spire.doc组件的价格,其它还有很多组件。用公司名和邮箱可以申请一个月的试用license。

在这里插入图片描述

docx4j

澳大利亚一公司赞助的开源组件,一查资料才知道作者是这家公司的CEO。刚刚打开官网的时候就一个感觉,官网做的太烂,不太相信这组件能有什么好的表现。下面的图就是官网截图,相信你会有一样的感觉。

有一个开源版,还有一个Docx4j Enterprise Edition。没有仔细研究,只测试了开源版。

官网:https://www.docx4java.org/

在这里插入图片描述

兼容性

不依赖其它组件,不依赖操作系统

除了以上几种方案以外,还查到有其它几乎方案,比如IText、document4j等。像IText是依赖于poi的,document4j是依赖于office软件的,所以不测试了。

测试的word文档我选取的是我项目中用到的一个文档,正好是遇到比较容易出现跳页的情况。拿来做横向测试非常合适,先来欣赏一下word文档吧。

在这里插入图片描述

文档中标题、表格、页眉页脚、图片、文本框几乎都用到了,准备就绪,开始测试。。

各种组件的代码编写方法

aspose.words

<dependency>
    <groupId>com.aspose</groupId>
    <artifactId>aspose-words</artifactId>
    <version>22.11</version>
    <classifier>jdk17</classifier>
</dependency>
package com.hawkon.aspose;

import com.aspose.words.*;

public class WordToPdfTest_Aspose {

    public static void wordToPdf(String wordFile, String pdfFile) throws Exception {
        Document wordDoc = new Document(wordFile);
        PdfSaveOptions pso = new PdfSaveOptions();
        wordDoc.save(pdfFile, pso);
    }
}

aspose这个组件是商用的,正常的写上如上所示,但是试用版导出的PDF文件是阉割版的,没法进行测试对比,所以我用了网上留传(po jie)的版本,有需要的朋友可以关注我的公众号(姚Sir面试间),回复aspose就可以得到。

本地jar包导入方法

<dependency>
    <groupId>com.aspose</groupId>
    <artifactId>aspose-words</artifactId>
    <version>19.5.0</version>
    <scope>system</scope>
    <systemPath>D:/Code/PdfTest/lib/aspose-words-19.5jdk.jar</systemPath>
</dependency>

docx4j


<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-simple</artifactId>
    <version>1.7.21</version>
</dependency>
<dependency>
    <groupId>org.docx4j</groupId>
    <artifactId>docx4j-JAXB-Internal</artifactId>
    <version>8.2.4</version>
</dependency>
<dependency>
    <groupId>org.docx4j</groupId>
    <artifactId>docx4j-export-fo</artifactId>
    <version>8.2.4</version>
</dependency>
package com.hawkon.docx4j;

import org.docx4j.Docx4J;
import org.docx4j.fonts.IdentityPlusMapper;
import org.docx4j.fonts.Mapper;
import org.docx4j.fonts.PhysicalFonts;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.io.FileOutputStream;

public class WordToPdfTest_Docx4j {

    public static void wordToPdf(String docFile,String pdfFile) throws Exception {
        final Logger logger = LoggerFactory.getLogger(Docx4J.class);

        WordprocessingMLPackage pkg = Docx4J.load(new File(docFile));
        Mapper fontMapper = new IdentityPlusMapper();
        fontMapper.put("隶书", PhysicalFonts.get("LiSu"));
        fontMapper.put("宋体", PhysicalFonts.get("SimSun"));
        fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei"));
        fontMapper.put("黑体", PhysicalFonts.get("SimHei"));
        fontMapper.put("楷体", PhysicalFonts.get("KaiTi"));
        fontMapper.put("新宋体", PhysicalFonts.get("NSimSun"));
        fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai"));
        fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong"));
        fontMapper.put("仿宋", PhysicalFonts.get("FangSong"));
        fontMapper.put("幼圆", PhysicalFonts.get("YouYuan"));
        fontMapper.put("华文宋体", PhysicalFonts.get("STSong"));
        fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong"));
        fontMapper.put("等线", PhysicalFonts.get("SimSun"));
        fontMapper.put("等线 Light", PhysicalFonts.get("SimSun"));
        fontMapper.put("华文琥珀", PhysicalFonts.get("STHupo"));
        fontMapper.put("华文隶书", PhysicalFonts.get("STLiti"));
        fontMapper.put("华文新魏", PhysicalFonts.get("STXinwei"));
        fontMapper.put("华文彩云", PhysicalFonts.get("STCaiyun"));
        fontMapper.put("方正姚体", PhysicalFonts.get("FZYaoti"));
        fontMapper.put("方正舒体", PhysicalFonts.get("FZShuTi"));
        fontMapper.put("华文细黑", PhysicalFonts.get("STXihei"));
        fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB"));
        fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312"));
        pkg.setFontMapper(fontMapper);

        Docx4J.toPDF(pkg, new FileOutputStream(pdfFile));
    }
}

这个组件按官方提供的写法不行,出来的汉字全成了麻将里的白板,还是得用网上的示例,加上字体映射之后可以了。不知道放到linux服务器上会是什么样。

OpenOffice

该方案的思路其实是OpenOffice提供软件支持,Java代码又利用jodconverter组件调用OpenOffice,其实和以前的程序调用 com组件是一个思路。而OpenOffice还提供了web服务版本,可以用类似tcp的方式调用来完成生成的工作。

本次测试就采用的是这种方法,因此需要安排OpenOffice软件,安装后在安装目录执行以下命令:


soffice.exe -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard


<dependency>
    <groupId>org.apache.directory.studio</groupId>
    <artifactId>org.apache.commons.io</artifactId>
    <version>2.4</version>
</dependency>
<dependency>
    <groupId>com.artofsolving</groupId>
    <artifactId>jodconverter</artifactId>
    <version>2.2.1</version>
</dependency>
<dependency>
    <groupId>org.openoffice</groupId>
    <artifactId>juh</artifactId>
    <version>3.1.0</version>
</dependency>

<dependency>
    <groupId>org.openoffice</groupId>
    <artifactId>unoil</artifactId>
    <version>3.0.0</version>
</dependency>

package com.hawkon.openoffice;

import com.artofsolving.jodconverter.DocumentConverter;
import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.converter.OpenOfficeDocumentConverter;

import java.io.File;
import java.net.ConnectException;

public class WordToPdfTest_openoffice {
    public static void wordToPdf(String docFile,String pdfFile) throws ConnectException {
        // 源文件目录
        File inputFile = new File(docFile);
        // 输出文件目录
        File outputFile = new File(pdfFile);
        if (!outputFile.getParentFile().exists()) {
            outputFile.getParentFile().exists();
        }
        // 连接openoffice服务
        OpenOfficeConnection connection = new SocketOpenOfficeConnection(
                "127.0.0.1", 8100);
        connection.connect();
        // 转换word到pdf
        DocumentConverter converter = new OpenOfficeDocumentConverter(
                connection);
        converter.convert(inputFile, outputFile);
        // 关闭连接
        connection.disconnect();
    }
}

poi

poi虽然很强大,但用起来越是最痛苦的,用的组件多,各种版本冲突,各种缺少组件。不知道网上发贴子的那些大神是怎么研究出来哪个版本对应哪个版本的,非常佩服他们。测试的时候我就在想,有没有什么能查询各种Jar包版本依赖关系的网站。如果有,请看客们告诉我一场。


<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.10.1</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-scratchpad</artifactId>
    <version>3.10.1</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.10.1</version>
</dependency>
<dependency>
    <groupId>fr.opensagres.xdocreport</groupId>
    <artifactId>org.apache.poi.xwpf.converter.core</artifactId>
    <version>1.0.6</version>
</dependency>
<dependency>
    <groupId>fr.opensagres.xdocreport</groupId>
    <artifactId>org.apache.poi.xwpf.converter.pdf</artifactId>
    <version>1.0.6</version>
</dependency>
<dependency>
    <groupId>fr.opensagres.xdocreport</groupId>
    <artifactId>fr.opensagres.xdocreport.itext.extension</artifactId>
    <version>2.0.1</version>
</dependency>
package com.hawkon.poi;

import org.apache.poi.xwpf.converter.pdf.PdfConverter;
import org.apache.poi.xwpf.converter.pdf.PdfOptions;
import org.apache.poi.xwpf.usermodel.XWPFDocument;

import java.io.*;

public class WordToPdf_Poi {
    public static void wordToPdf(String docFile,String pdfFile) throws IOException {
        XWPFDocument document;
        InputStream doc = new FileInputStream(docFile);
        document = new XWPFDocument(doc);
        PdfOptions options = PdfOptions.create();
        OutputStream out = new FileOutputStream(pdfFile);
        PdfConverter.getInstance().convert(document, out, options);
        doc.close();
        out.close();
    }
}

spire

<dependency>
    <groupId>e-iceblue</groupId>
    <artifactId>spire.doc</artifactId>
    <version>10.11.6</version>
    <scope>system</scope>
    <systemPath>D:/Code/PdfTest/lib/Spire.Doc.jar</systemPath>
</dependency>
package com.hawkon.spire;
import com.spire.doc.*;

public class WordToPdf_spire {
    public static void wordToPdf(String docFile,String pdfFile){
        com.spire.license.LicenseProvider.setLicenseFile("D:\\Code\\PdfTest\\license.elic.xml");
        //实例化Document类的对象
        Document doc = new Document();

        //加载Word
        doc.loadFromFile(docFile);

        //保存为PDF格式
        doc.saveToFile(pdfFile,FileFormat.PDF);
    }
}

测试结果

测试的时候有性能指标,所以我觉得还是把我电脑的硬件参数发一下,大家可以作为参考。

处理器	Intel(R) Core(TM) i5-10210U CPU @ 1.60GHz   2.11 GHz
机带 RAM	16.0 GB (15.8 GB 可用)
系统类型	64 位操作系统, 基于 x64 的处理器

转换结果与原版对比

下面依次放出5种方案的转换结果对比,左边为原版,右边为五种方案的转换结果,并且我也给出我的格式保真度评价

aspose.words对比图

从图中可以看出,除表格处有一点错位以外,看出不明显的差别,已经非常厉害了。我给4星。

在这里插入图片描述

docx4j

有点惨不忍睹呀,表格严重错位,甚至有7页变8页的趋势。与原版格式严重失真。但勉强能阅读。我给2星

在这里插入图片描述

OpenOffice

格式基本保留住了,但是位置错的比较离谱。好在基本不影响阅读。我给3星。

在这里插入图片描述

poi

页眉错乱严重,影响阅读,这有跳页的情况出现。我给1星。

在这里插入图片描述

spire

和aspose一样,除表格处有一点错位以外,看出不明显的差别,国产软件能做到这种程序非常NICE了。我给4星。

在这里插入图片描述

评测结果

最后的评测结果如下,从转换效果的角度来说,比较满意的是aspose和spire.doc,而开源的转换一些比较简单的文章还可以,但企业开发的时候很多时候是要求PDF格式和WORD文档高度保持一致的。其它三种方案的表现肯定是不够的。

在这里插入图片描述

值得一提的是,没想到国产软件spire.doc表现还不错,除性能稍差一点,其它都不错,最重要的是价格还是比较亲民的。

而且这家公司的产品应该是已经走出国门了,希望国产软件可以做出更多的精品,也希望大家多多支持国产软件。

最后声明两点:

  1. 文中测试样本文档中的公司名、电话纯属虚构,如有累同纯属巧合,如果发生意外涉及到他人隐私,请联系我修改文章,谢谢。
  2. 我没有收spire.doc一分钱,确实是没想到国产中间件已经这么优秀了,如果文章起到广告效果了,spire.doc的公司愿意赞助我一点,我丝毫不介意,谁能跟钱有仇呢,哈哈。。。。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java开发中Word转PDF文件5种方案横向评测 的相关文章

  • 如何找出导致 poi 损坏 xlsx / xlsm 文件的原因

    我遇到的问题是 Apache POI 仅通过读取和写入就 损坏 了 xlsm xlsx 文件 例如使用以下代码 public class Snippet public static void main String args throws
  • 添加@Named时@SessionScoped不起作用

    考虑以下支持 bean import javax faces bean ManagedBean import javax faces bean SessionScoped ManagedBean SessionScoped public c
  • setSize() 不起作用?

    我有一个程序 需要两个按钮 一个是常规按钮 另一个具有根据鼠标悬停而变化的图片 目前 由于图片很大 JButton自定义也很大 我可以更改自定义的大小并保持图像 和翻转图像 成比例吗 我尝试过 setSize 但它没有任何作用 对于任何反馈
  • 如何生成源代码来创建我正在调试的对象?

    我的典型场景 我处理的遗留代码有一个错误 只有生产中的客户端才会遇到 我附加了一个调试器并找出如何重现该问题their系统给定their输入 但是 我还不知道为什么会发生错误 现在我想在本地系统上编写一个自动化测试来尝试重现然后修复错误 最
  • Java ASN.1 编译器

    现在我正在使用二进制笔记 http bnotes sourceforge net 解析 ASN 1 文件以在 Java 项目中使用 它采用 ASN 1 定义并生成 Java 类 让我可以操作 ASN 1 文件 我用扩展标记碰壁了 因为它不支
  • 在 Python 中静默打印 PDF

    我正在尝试使用 Python 打印 PDF 而不打开 PDF 查看器应用程序 Adobe Foxit 等 我还需要知道打印何时完成 以删除文件 Here http permalink gmane org gmane comp python
  • 将 hyperjaxb3 升级到 jpa 2.1

    我正在尝试在使用 maven jpa hibernate 和 hyperjaxb 的 eclipse 项目中升级到 JPA 2 1 当我尝试执行以下操作时出现以下错误Run As Run on Server从日食内部 java lang N
  • Java中单击和双击的区别

    我搜索论坛并看到以下代码 public void mouseClicked MouseEvent e if e getClickCount 2 System out println and it s a double click wasDo
  • 多个罐子、单个持久单元解决方案?

    包括我在内的一些人一直在努力将不同模块 jar 中的实体合并到单个持久性单元中 尤其是JavaSE 例如这里JPA 2 0 自动从不同的 jar 添加实体类到 PersistenceUnit https stackoverflow com
  • [重复]

    这个问题在这里已经有答案了 有什么区别List
  • Spring Security 的 AJAX 请求给出 403 Forbidden

    我有一个基于spring boot spring security thymeleaf的网站 在某些情况下我也使用ajax 问题 我在 Spring Security 中使用表单登录安全性 在浏览器中 登录后我可以使用rest API GE
  • PDF 附件 NodeMailer

    预先感谢您的回复 我编写了一些使用nodemailer 0 7 1的代码 它发送电子邮件并将pdf附加到电子邮件中 但是 pdf 附件在编码时会自行损坏或截断或发生其他情况 我之所以说这是附件之前的文件 即我本地的文件 是512kb 而电子
  • 在 Spring Boot 异常处理期间保留自定义 MDC 属性

    简短版本 有足够的细节 如何保留添加在MDC中的属性doFilter 的方法javax servlet Filter执行 public void doFilter ServletRequest request ServletResponse
  • 处理大数据表时应该如何使用Hibernate Mapping

    问题定义 我有一个包含大量数据 超过 100 000 行 的数据库表 表结构如下 AppID DocID DocStatus 1 100 0 1 101 1 2 200 0 2 300 1 每个 applicationID 可能有数千个文档
  • 从 API Explorer 调用 API 方法时不允许使用范围

    我在 Google App Engine 中有一个奇怪的行为 我正在使用 Eclipse 和 Java 进行开发 特别是使用 Google Cloud Endpoints 我使用以下设置创建了一个示例 API 实际上 我正在使用许多其他示波
  • 优化两个三位数乘积的最大回文数?

    我正在研究一个面试问题 我被问到这个问题 我应该编写一个程序 从两个三位数的乘积中找到最大的回文数 这里是question https projecteuler net problem 4 我想出了这种从底部开始的蛮力方法 public c
  • Java编译错误:包不存在

    在我的工作区 wsPrivate 中 我有 3 个 gradle 项目 刽子手 像素视图 Reports PixelView 和 Reports 项目编译良好 然而 Hangman 使用这两个项目 并且有些在编译时找不到包 请参阅以下错误
  • 是否可以将自定义清单添加到 Netbeans 6.7.1 中编译的 Java 库中?

    我尝试添加manifest file src dir manifest mf到project properties 但是查看build impl xml我发现manifest available通常伴随着main class条件 所以这让我
  • SSLHandShakeException 没有适当的协议

    我最近向我的网站添加了 SSL 可以通过 https 访问它 现在 当我的 java 应用程序尝试向我的网站发出请求并使用缓冲读取器从中读取时 它会生成此堆栈跟踪 我没有使用自签名证书 该证书来自 Namecheap 它使用 COMODO
  • 指定不带组件的GridBagLayout的网格参数

    我试图帮助另一个用户 但遇到了一个问题 我想用 GridBagLayout 来做到这一点 c1 c2 c3 10 80 10 v v r1 B1

随机推荐

  • 重写equals()方法

    1 如果想把持久类的实例放入set中 多值关联时 1对多 建议实现equals和hashcode2 想重用托管实例时 也要实现equals和hashcode 3 多个字段组合作为联合主键 必须实现equals和hashcode方法 equa
  • Pycharm安装opencv的几种办法(windows下)

    Pycharm安装opencv的几种方法 之前在默认环境中用pip安装过一次opencv 当时就是参考别人方法弄 稀里糊涂的 然后今天想在自己别的环境下 tensorflow 下安装终于弄懂了一些 暂时发现了几种安装的方法 特此记录下 方法
  • 基于XGBoost-LSTM的天然气价格预测研究(Python代码实现)

    个人主页 研学社的博客 欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Python代码实现 1 概述 预测成本模型是开发
  • 调试最长的一帧(第八天)

    先看看总体进度 先获取所有的图形上下文 然后进行checkEvents 请求分发消息并通过takeEvents 获取交互事件 再交由GUIEventHandler处理交互事件 中间的步骤 在checkeEvents里面 消息分发函数 消息处
  • java.lang.IllegalThreadStateException异常原因解析

    同一个Thread不能重复调用start方法 要 implements Runnable 通过使用匿名对象 如new Thread new MyThread start 可多次调用 public class test public stat
  • IOS自动打包

    打包过程 xcodebuild负责将工程源文件编译成xxx app xcrun负责给xxx app 签名并 打包成xxx ipa 第一步清理 xcodebuild clean 第二步编译 xcodebuild 第三步打包 xcrun sdk
  • ECC椭圆曲线加解密原理详解(配图)

    ECC椭圆曲线加解密原理详解 配图 本文主要参照 ECC加密算法入门介绍及 ECC椭圆曲线详解 有具体实例 前言 椭圆曲线 ECC 加密原理跟RSA加解密原理比起来 可真是晦涩难懂 拜读了Kalafinaian的文章 ECC椭圆曲线详解 有
  • Docker进入容器命令

    docker exec it 容器名称 bash 输入 exit 退出容器
  • No module named 'tensorflow.contrib'

    命令行报错如下 import tensorflow contrib slim as slim ModuleNotFoundError No module named tensorflow contrib tensorflow 2 0以后没有
  • (Struts2学习篇) Struts2数据校验之一

    数据校验的意义 WEB数据收集的复杂性 客户数据输入的误操作 其他恶意攻击 struts2数据校验的方法 客户端校验和服务端校验 客户端校验是指 在HTML画面上自动生成JavaScript校验代码 在用户提交到服务器之前在客户端浏览器中进
  • jq校验复选框是否选择了

    jq校验复选框是否选择了 var arr sup input checkbox name custom brand ids checked each function i arr sup i this val if arr sup leng
  • remote: Support for password authentication was removed on August 13, 2021. Please use a personal ac

    报错 remote Support for password authentication was removed on August 13 2021 Please use a personal access token instead r
  • 安装Ubuntu20.04后时间不准

    安装Ubuntu20 04后时间不准 买了一台瘦客户机 原先是安装Windows操作系统的 后面安装Ubuntu20 04后导致时间一直有问题 不准 解决办法 1 安装 ntpdate sudo apt get install ntpdat
  • 超硬核!程序员10种副业赚钱之道,实现月收入增加20k!

    大家好 我是良许 经常有小伙伴问我说 良许 你的副业搞得那么溜 能不能给我们介绍一些可操作性的副业 让我们在让我们在工作之余能有另外一份收入 为了响应大家的需求 本文我就整理了一些我所知道的适合程序员的副业 向大家做一个分享 这些副业 每个
  • Node.js一些报错的解决方案

    安装 https blog csdn net qq 48485223 article details 122709354 报错1 查询版本 npm v npm WARN logfile could not create logs dir E
  • Json的格式规范

    解决报错 Resolved org springframework web HttpMediaTypeNotSupportedException Content type application x www form urlencoded
  • OCR常用公开数据集整理

    OCR常用的数据集 在这个代码仓库里 提供了常用的OCR检测和识别中的通用公开数据集的下载链接 并且提供了json标签转成 txt标签的代码和转换好的 txt标签 该项目的详细github地址如下 https github com zcsw
  • 通过Windows10上的VS Code打开远端Ubuntu上的项目操作步骤

    Ubuntu版本要求是16 04及以上版本 这里以16 04为例 在Ubuntu上安装OpenSSH server 执行 sudo apt get install openssh server 在Windows 10 1803 上安装Win
  • go-casbin学习

    casbin学习 一 背景 1 Casbin是什么 Casbin 是一个授权库 在我们希望特定用户访问特定的 对象 或实体的流程中可以使用 主题 访问类型 例如 动作 可以是 读取 写入 删除 或开发者设置的任何其他动作 这是Casbin最
  • Java开发中Word转PDF文件5种方案横向评测

    Java开发中Word转PDF文件5种方案横向评测 前段时间接了个项目 需要各种处理Word模板 转PDF 签章等等 非常头疼 其中光是一个word转PDF就折磨我好久 实现转换很简单 但是效果总是达不到满意 于是我把市面上能找到的word