Word和pdf转换
前端需要预览word文件,浏览器不能预览doc格式,但是可以预览pdf,所以将word转成pdf格式提供预览
1.word转pdf
链接: https://pan.baidu.com/s/1Ab97kVVy1DPCLQ2725N3vg?pwd=hcnx 提取码: hcnx
1.引入本地jar包
在maven的bin目录下输入cmd进入执行命令
mvn install:install-file -DgroupId=com.aspose.words -DartifactId=aspose-words -Dversion=19.5 -Dpackaging=jar -Dfile=jar包的路径
2.在pom中加入依赖,和配置文件
<dependency>
<groupId>com.aspose.words</groupId>
<artifactId>aspose-words</artifactId>
<version>19.5</version>
</dependency>
将xml文件放在resource下(若不验证则转化出的pdf文档会有水印产生)
3.工具类AsposeUtil
package com.test.mybatistest.util;
import com.aspose.words.Document;
import com.aspose.words.FontSettings;
import com.aspose.words.License;
import com.aspose.words.SaveFormat;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
public class AsposeUtil {
public static void main(String[] args) throws Exception {
//将doc文件转换为pdf
AsposeUtil bean = new AsposeUtil();
bean.toPdf("F:\\file\\test.doc", "F:\\file\\testTopdf.pdf");
}
/**
* word转pdf
*
* @param inpath
* @param outpath
* @throws Exception
*/
public void toPdf(String inpath, String outpath) throws Exception {
if (!getLicense()) {
System.out.println("非法------------");
return;
}
System.out.println("开始使用Aspose.words进行转换");
long old = System.currentTimeMillis();
File file = new File(outpath);
FileOutputStream os = new FileOutputStream(file);
String osName = System.getProperty("os.name", "");
if (osName.startsWith("Mac OS")) {
//mac环境
} else if (osName.startsWith("Windows")) {
//windows环境
} else {
// linux环境 如果环境缺少中文字体会发生转换乱码
new FontSettings().setFontsFolder("/usr/share/fonts/chinese", true);
}
Document doc = new Document(inpath);
doc.save(os, SaveFormat.PDF);
long now = System.currentTimeMillis();
System.out.println("Aspose.words转换结束,共耗时:" + ((now - old) / 1000.0) + "秒");
}
/**
* 验证License 若不验证则转化出的pdf文档会有水印产生
*
* @return
*/
public boolean getLicense() {
boolean result = false;
try {
InputStream is = this.getClass().getClassLoader().getResourceAsStream("license.xml");
License aposeLic = new License();
aposeLic.setLicense(is);
result = true;
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
4.转换测试使用
2.pdf转word
1.依赖
<repositories>
<repository>
<id>aspose-maven-repository</id>
<url>https://repository.aspose.com/repo</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories><dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.20.0-GA</version>
</dependency>
<dependency>
<groupId>com.aspose</groupId>
<artifactId>aspose-pdf</artifactId>
<version>22.4</version>
</dependency>
2.破解jar包
先引入官方的包,找到maven仓库位置,执行util破解,替换生产的jar包(不破解的话只处理前4页的转换)
PDFJarCrack破解的util
执行后生成cracked文件,将原文件备份改为_back
package com.test.mybatistest.util;
import javassist.*;
import java.io.*;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.jar.JarOutputStream;public class PDFJarCrack {
public static void main(String[] args) throws Exception {
//填写自己下载的jar包地址
String jarPath = "F:\\maven\\apache-maven-3.6.3-bin\\maven-repository\\com\\aspose\\aspose-pdf\\22.4\\aspose-pdf-22.4.jar";
crack(jarPath);
}private static void crack(String jarName) {
try {
ClassPool.getDefault().insertClassPath(jarName);
CtClass ctClass = ClassPool.getDefault().getCtClass("com.aspose.pdf.ADocument");
CtMethod[] declaredMethods = ctClass.getDeclaredMethods();
int num = 0;
for (int i = 0; i < declaredMethods.length; i++) {
if (num == 2) {
break;
}
CtMethod method = declaredMethods[i];
CtClass[] ps = method.getParameterTypes();
if (ps.length == 2
&& method.getName().equals("lI")
&& ps[0].getName().equals("com.aspose.pdf.ADocument")
&& ps[1].getName().equals("int")) {
// 最多只能转换4页 处理
System.out.println(method.getReturnType());
System.out.println(ps[1].getName());
method.setBody("{return false;}");
num = 1;
}
if (ps.length == 0 && method.getName().equals("lt")) {
// 水印处理
method.setBody("{return true;}");
num = 2;
}
}
File file = new File(jarName);
ctClass.writeFile(file.getParent());
disposeJar(jarName, file.getParent() + "/com/aspose/pdf/ADocument.class");
} catch (NotFoundException e) {
e.printStackTrace();
} catch (CannotCompileException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}}
private static void disposeJar(String jarName, String replaceFile) {
List<String> deletes = new ArrayList<>();
deletes.add("META-INF/37E3C32D.SF");
deletes.add("META-INF/37E3C32D.RSA");
File oriFile = new File(jarName);
if (!oriFile.exists()) {
System.out.println("######Not Find File:" + jarName);
return;
}
//将文件名命名成备份文件
String bakJarName = jarName.substring(0, jarName.length() - 3) + "cracked.jar";
// File bakFile=new File(bakJarName);
try {
//创建文件(根据备份文件并删除部分)
JarFile jarFile = new JarFile(jarName);
JarOutputStream jos = new JarOutputStream(new FileOutputStream(bakJarName));
Enumeration entries = jarFile.entries();
while (entries.hasMoreElements()) {
JarEntry entry = (JarEntry) entries.nextElement();
if (!deletes.contains(entry.getName())) {
if (entry.getName().equals("com/aspose/pdf/ADocument.class")) {
System.out.println("Replace:-------" + entry.getName());
JarEntry jarEntry = new JarEntry(entry.getName());
jos.putNextEntry(jarEntry);
FileInputStream fin = new FileInputStream(replaceFile);
byte[] bytes = readStream(fin);
jos.write(bytes, 0, bytes.length);
} else {
jos.putNextEntry(entry);
byte[] bytes = readStream(jarFile.getInputStream(entry));
jos.write(bytes, 0, bytes.length);
}
} else {
System.out.println("Delete:-------" + entry.getName());
}
}
jos.flush();
jos.close();
jarFile.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}private static byte[] readStream(InputStream inStream) throws Exception {
ByteArrayOutputStream outSteam = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = -1;
while ((len = inStream.read(buffer)) != -1) {
outSteam.write(buffer, 0, len);
}
outSteam.close();
inStream.close();
return outSteam.toByteArray();
}
}
替换完jar包后,使用工具类转换 PdfUtils,就不会有只转换4页的问题
package com.test.mybatistest.util;
import com.aspose.pdf.Document;
import com.aspose.pdf.SaveFormat;import java.io.FileOutputStream;
import java.io.IOException;public class PdfUtils {
public static void main(String[] args) throws IOException {
pdf2doc("F:\\file\\pdf\\test.pdf");
}//pdf转doc
public static void pdf2doc(String pdfPath) {
long old = System.currentTimeMillis();
try {
//新建一个word文档
String wordPath = pdfPath.substring(0, pdfPath.lastIndexOf(".")) + ".docx";
FileOutputStream os = new FileOutputStream(wordPath);
//doc是将要被转化的word文档
Document doc = new Document(pdfPath);
//全面支持DOC, DOCX, OOXML, RTF HTML, OpenDocument, PDF, EPUB, XPS, SWF 相互转换
doc.save(os, SaveFormat.DocX);
os.close();
//转化用时
long now = System.currentTimeMillis();
System.out.println("Pdf 转 Word 共耗时:" + ((now - old) / 1000.0) + "秒");
} catch (Exception e) {
System.out.println("Pdf 转 Word 失败...");
e.printStackTrace();
}
}
}
执行成功
3.配合minio使用
minio一起使用,当前项目使用的minio存储文件,在项目里做word转换为pdf,保存自己需要的文件,删除转换过程产生的文件
Minio部分的代码
package com.test.mybatistest.minio;
import com.aspose.words.Document;
import com.aspose.words.FontSettings;
import com.aspose.words.License;
import com.aspose.words.SaveFormat;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.github.pagehelper.util.StringUtil;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.ThreadLocalRandom;
@Api(tags = "Minio")
@RestController
@Slf4j
@RequestMapping("/minio")
public class MinioController {
@Autowired
private MinioClient minioClient;
@Autowired
private MinioConfig minioConfig;
@Value("${minio.bucketName}")
private String bucketName;
/**
* 文件上传
*
* @param file
* @return
*/
@ApiOperation("文件上传-批量")
@PostMapping("/upload")
public Object upload(@RequestParam(name = "file", required = false) MultipartFile[] file) {
if (file == null || file.length == 0) {
return "上传文件不能为空";
}
List<FileResult> result = new ArrayList<>();
for (MultipartFile multipartFile : file) {
//3.文件上传
try {
String original = multipartFile.getOriginalFilename();
String last = getFileExtension(original);
if ("doc".equalsIgnoreCase(last) || "docx".equalsIgnoreCase(last)) {
result.add(saveWordToPdf(multipartFile, original));
} else {//其他文件的保存
result.add(putFile(fileName(original), original, multipartFile.getInputStream()));
}
} catch (Exception e) {
return "上传失败";
}
}
return result;
}
/**
* 保存文件的
*
* @param fileName
* @param original
* @param stream
* @return
* @throws Exception
*/
private FileResult putFile(String fileName, String original, InputStream stream) throws Exception {
//fileName 处理后的文件名,orgfileName 原文件名
String contentType = ViewContentType.getContentType(fileName);
minioClient.putObject(
PutObjectArgs.builder()
.bucket(bucketName)
.object(fileName)
.stream(stream, stream.available(), -1)
.contentType(contentType)
.build());
FileResult fileResult = new FileResult();
fileResult.setOrgName(original);
fileResult.setFileName(fileName);
fileResult.setPath(fileLink(bucketName, fileName));
return fileResult;
}
/**
* 保存一份word原文件,并生成一份pdf
*
* @param file
* @param original
* @return
* @throws Exception
*/
private FileResult saveWordToPdf(@RequestParam MultipartFile file, String original) throws Exception {
//获取文件原名和原格式,生成保存的文件名 aaa.docx
String fileName = fileName(original); // upload/20230310/uuid.docx
//先保存一份原文件
FileResult fileResult = this.putFile(fileName, original, file.getInputStream());
//转换为pdf文件,并保存处理
changPdfAndSave(file, original, fileName);
return fileResult;
}
/**
* 转换pdf并保存
*
* @param file
* @param original
* @param fileName
* @throws Exception
*/
private void changPdfAndSave(@RequestParam MultipartFile file, String original, String fileName) throws Exception {
String name = getFileName(original);//获取原文件名
FileInputStream fileInputStream = new FileInputStream(FileUtils.multipartFileToFile(file));
if (!getLicense()) {
System.out.println("非法------------");
return;
}
String docPath = "";
String pdfPath = "";
//根据环境判断项目路径,保存到项目里,在使用后需要删除
docPath = getSystemPath() + "/" + original;
pdfPath = getSystemPath() + "/" + name + ".pdf";
String subName = getFileName(fileName) + ".pdf";
String subfileName = name + ".pdf";
File fileOut = new File(pdfPath);
FileOutputStream os = new FileOutputStream(fileOut);
Document doc = new Document(fileInputStream);
doc.save(os, SaveFormat.PDF);
InputStream inputStream = FileUtils.fileToInputStream(new File(pdfPath));
this.putFile(subName, subfileName, inputStream);
//关闭流
fileInputStream.close();
inputStream.close();
os.close();
//删除原文件和生成的pdf文件
FileUtils.deleteFileOrDirectory(docPath);
FileUtils.deleteFileOrDirectory(pdfPath);
}
/**
* 获取项目地址
*
* @param
* @return
*/
private String getSystemPath() {
String path = new String();
String osName = System.getProperty("os.name", "");
if (osName.startsWith("Mac OS")) {
//mac
} else if (osName.startsWith("Windows")) {
//windows
path = System.getProperty("user.dir");
} else {
//在linux里获取的地址为 data/project/project.jar 截取最后一个斜杠data/project/
String url = System.getProperty("java.class.path");
path = url.substring(0, url.lastIndexOf("/"));
//如果是linux执行,需要添加这个,如果还有乱码需要在linux下安装中文字体
new FontSettings().setFontsFolder("/usr/share/fonts/chinese", true);
}
return path;
}
/**
* 创建访问路径
*
* @param bucketName
* @param fileName
* @return
*/
private String fileLink(String bucketName, String fileName) {
return minioConfig.getEndpoint() + '/' + bucketName + '/' + fileName;
}
/**
* 验证License 若不验证则转化出的pdf文档会有水印产生
*
* @return
*/
public boolean getLicense() {
boolean result = false;
try {
InputStream is = this.getClass().getClassLoader().getResourceAsStream("license.xml");
License aposeLic = new License();
aposeLic.setLicense(is);
result = true;
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
/**
* 生成图片名称
*
* @param originalFilename
* @return
*/
public String fileName(String originalFilename) {
StringBuffer sb = new StringBuffer();
String yyyyMMdd = new SimpleDateFormat("yyyyMMdd").format(new Date());
ThreadLocalRandom random = ThreadLocalRandom.current();
String uuid = new UUID(random.nextLong(), random.nextLong()).toString().replace(StringPool.DASH, StringPool.EMPTY);
sb.append("upload").append("/")
.append(yyyyMMdd).append("/")
.append(uuid).append(".")
.append(getFileExtension(originalFilename));
return sb.toString();
}
/**
* 获取文件后缀
*
* @param fullName
* @return
*/
public static String getFileExtension(String fullName) {
if (StringUtil.isEmpty(fullName)) return StringPool.EMPTY;
String fileName = new File(fullName).getName();
int dotIndex = fileName.lastIndexOf(".");
return (dotIndex == -1) ? "" : fileName.substring(dotIndex + 1);
}
/**
* 获取文件名字
*
* @param fullName
* @return
*/
public static String getFileName(String fullName) {
if (StringUtil.isEmpty(fullName)) return StringPool.EMPTY;
//String fileName = new File(fullName).getName();//不需要路径的名称
int dotIndex = fullName.lastIndexOf(".");//带路径的文件名称
return (dotIndex == -1) ? "" : fullName.substring(0, dotIndex);
}
}
文件流转换的Util
package com.test.mybatistest.minio;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
/**
* file工具类
*/
public class FileUtils {
/**
* file转InputStream
*
* @param file
* @return
*/
public static InputStream fileToInputStream(File file) {
InputStream inputStream = null;
try {
inputStream = new FileInputStream(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return inputStream;
}
/**
* file转OutputStream
*
* @param file
* @return
*/
public static OutputStream fileToOutputStream(File file) {
OutputStream inputStream = null;
try {
inputStream = new FileOutputStream(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return inputStream;
}
/**
* file转mult
*
* @param file
* @return
*/
public static MultipartFile fileToMultipartFile(File file) {
MultipartFile result = null;
if (null != file) {
try (FileInputStream input = new FileInputStream(file)) {
result = new MockMultipartFile(file.getName().concat("temp"), file.getName(), "text/plain", input);
} catch (IOException e) {
e.printStackTrace();
}
}
return result;
}
/**
* MultipartFile转换为file
*
* @param file
* @return
*/
public static File multipartFileToFile(MultipartFile file) {
File toFile = null;
if (file.equals("") || file.getSize() <= 0) {
file = null;
} else {
InputStream ins = null;
try {
ins = file.getInputStream();
toFile = new File(file.getOriginalFilename());
inputStreamToFile(ins, toFile);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
try {
ins.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
return toFile;
}
/**
* inputStream 转file
* @param ins
* @param file
*/
private static void inputStreamToFile(InputStream ins, File file) {
try {
OutputStream os = new FileOutputStream(file);
int bytesRead = 0;
byte[] buffer = new byte[8192];
while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
os.write(buffer, 0, bytesRead);
}
os.close();
ins.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 删除文件或文件夹
* @param fileName
* @return
*/
public static boolean deleteFileOrDirectory(String fileName) {
File file = new File(fileName); // fileName是路径或者file.getPath()获取的文件路径
if (file.exists()) {
if (file.isFile()) {
return deleteFile(fileName); // 是文件,调用删除文件的方法
} else {
return deleteDirectory(fileName); // 是文件夹,调用删除文件夹的方法
}
} else {
System.out.println("文件或文件夹删除失败:" + fileName);
return false;
}
}
/**
* 删除文件
*
* @param fileName 文件名
* @return 删除成功返回true, 失败返回false
*/
public static boolean deleteFile(String fileName) {
File file = new File(fileName);
if (file.isFile() && file.exists()) {
file.delete();
System.out.println("删除文件成功:" + fileName);
return true;
} else {
System.out.println("删除文件失败:" + fileName);
return false;
}
}
/**
* 删除文件夹
* 删除文件夹需要把包含的文件及文件夹先删除,才能成功
*
* @param directory 文件夹名
* @return 删除成功返回true, 失败返回false
*/
public static boolean deleteDirectory(String directory) {
// directory不以文件分隔符(/或\)结尾时,自动添加文件分隔符,不同系统下File.separator方法会自动添加相应的分隔符
if (!directory.endsWith(File.separator)) {
directory = directory + File.separator;
}
File directoryFile = new File(directory);
// 判断directory对应的文件是否存在,或者是否是一个文件夹
if (!directoryFile.exists() || !directoryFile.isDirectory()) {
System.out.println("文件夹删除失败,文件夹不存在" + directory);
return false;
}
boolean flag = true;
// 删除文件夹下的所有文件和文件夹
File[] files = directoryFile.listFiles();
for (int i = 0; i < files.length; i++) { // 循环删除所有的子文件及子文件夹
// 删除子文件
if (files[i].isFile()) {
flag = deleteFile(files[i].getAbsolutePath());
if (!flag) {
break;
}
} else { // 删除子文件夹
flag = deleteDirectory(files[i].getAbsolutePath());
if (!flag) {
break;
}
}
}
if (!flag) {
System.out.println("删除失败");
return false;
}
// 最后删除当前文件夹
if (directoryFile.delete()) {
System.out.println("删除成功:" + directory);
return true;
} else {
System.out.println("删除失败:" + directory);
return false;
}
}
public static File Dwg2Pdf(File dwgFile) throws IOException {
return null;
}
}
文件file类
package com.test.mybatistest.minio;
import lombok.Data;
import java.io.Serializable;
@Data
public class FileResult implements Serializable {
/**
* 文件原名
*/
private String orgName;
/**
* 文件路径
*/
private String fileName;
/**
* 文件访问路径
*/
private String path;
}
测试使用,pdf文件预览
4.在linux里做转换时的乱码问题
链接: https://pan.baidu.com/s/1-0OgdOL1BYp-cSS9qfUMOQ?pwd=1qif 提取码: 1qif
需要在linux下安装中文的字体库
将chinese,放在/usr/share下,没有fonts文件就创建
将下载的rpm文件放在需要安装字体的服务器上,执行
rpm -ivh fontconfig-2.13.0-4.3.el7.i686.rpm --nodeps --force
rpm -ivh ttmkfdir-3.0.9-42.el7.x86_64.rpm --nodeps --force
安装ttmkfdir来搜索目录中所有的字体信息,并汇总生成fonts.scale文件。
ttmkfdir -e /usr/share/X11/fonts/encodings/encodings.dir
看看etc下有没有fonts文件,没有就将fonts放在/etc/fonts下
vi /etc/fonts/fonts.conf 修改新的字体路径
<dir>/usr/share/fonts/chinese</dir>
fc-cache 刷新缓存
fc-list 查看字体
安装字体也可解决,压缩文件乱码问题
unzip -O CP936 中文的zip文件.zip
参考
linux离线安装字体_linux 离线安装字体_涟漪海洋的博客-CSDN博客
java word转pdf(完美转换,亲测可用)_java word转pdf完美解决_CxNull的博客-CSDN博客
Java实现PDF转Word-CSDN博客
Word和pdf转换相关推荐
- 小圆象PDF转换器:Word转PDF转换软件有哪些?Word转PDF简单方法分享
当我们刚接触到电脑时,我们最先使用的文档格式一般是 Word 格式,这种格式适合我们记录文件,在记录和书写方面有很大的优势.但是我们编辑完Word文档后,我们会选择转换成PDF格式保存,因为PDF格式 ...
- Word控件Spire.Doc 转换教程(二十三):保留或禁用从 Word 到 PDF 转换的超链接
超链接为读者提供了更多的附加信息,它被广泛用于我们的 word 文档.Spire.Doc 具有强大的超链接文字元素操作功能.开发者可以在word文档中添加.修改和删除超链接.Spire.Doc for ...
- java下freemarker2.3.28+aspose实现生成word文档生成、word转pdf转换
一.java生成word文档 java生成word文档常用的两种方式: (1)apache下的poi类库处理office文档 (2)freemarker编辑word文件转换的xml文件 通过网上了解, ...
- 开源在线excel编辑器_5款免费在线PDF转换成word或者excel的分享
word在日常工作中,应用广泛,但是里面关于PDF的转换工具必需要会员才可以使用,但又不愿意只为了转换一次而花费钱去买会员,本文为你们提供了5款免费在线PDF转换成word或者excel的网. 1.I ...
- pdf转换成word转换器在线
pdf转换成word转换器在线 PDF转Word软件很多,但是完美的转换的并不多,尤其是带图片.文字混排的,运用普通的pdf转换成word转换器在线转换出来的Word文件内容常常存在较多文字乱码的情况 ...
- 灵活自定义 PDF转换成Word转换器下载
借助PDF转换成Word转换器的帮助,我们可以非常轻松地实现PDF转换成为Word文件的需求.不过由于目前互联网上存在的PDF转换器质量参差不齐,转换技术也相差较大,因此用户很难找到一款真正具备高质量 ...
- word和pdf等常见文档格式如何转换
新手遇到文档转换问题时,常常因为找不到好的解决方法而弄得满头雾水,比如如何将PDF转成Word.Word怎么转成PDF.PPT可以转成PDF吗?等等,下面具体分享一些我的经验. 一.网页版迅捷PDF在 ...
- 如何将有打开密码的PDF转换成Word文件
想要把PDF转换成word文档但是发现PDF文件有打开口令密码该怎么办? 想要将有打开口令密码的PDF文件转换成Word文件,在我认为需要两个步骤,首先将PDF的口令密码找回或者破解,然后再将PDF文 ...
- 批量PDF转换成Office文件 PDF转换器下载
2019独角兽企业重金招聘Python工程师标准>>> 迅捷PDF转换成Word转换器采用了最新的一代的增强版核心技术,除了加强原超线程批量转换技术之外,新版本还提升了软件的多文件格 ...
最新文章
- 线程池中使用条件变量和信号量的性能比较
- 售卖ssr_博人传148集:SSR鸣人卡牌受追捧,“金钱之术”重现,太子被盯上
- 如何用纯 CSS 创作一个摇摇晃晃的 loader
- c++对vector中的元素进行随机排序
- 干货分享:如何使用Kubernetes的Ingress API
- solr java 设置 store_Solr 18 - 通过SolrJ局部更新Solr中的文档 (原子操作、非覆盖操作)...
- python 对目录下文件过滤删除
- 典型信息化案例点评(2)
- DIAView 嵌入视频监控(海康威视)
- 1+X云计算平台运维与开发认证(初级)样卷C
- matlab入门---数值计算
- 【HUSTOJ】1050: 字符图形6-星号倒三角
- 什么是Winsock WSAData ?
- 扩增子测序引入的假阳性稀有类群干扰对微生物群落多样性、构建机制及相互作用的研究...
- VS2017使用Visual Leak Detector
- Linux实战(20):Docker部署EKL入门环境记录文档
- 重启电脑数据丢失怎么恢复?这篇指南很受用!
- 肯德基创始人,在1009次失败后...
- “阿里/字节“大厂自动化测试面试题一般会问什么?以及技巧和答案
- 随机森林-sklearn.ensemble.RandomForestRegressor
热门文章
- 通信行业名词术语解释
- 双十一发货超2000万件,极智嘉(Geek+)柔性方案从容应对购物狂欢节
- 关于mybatis分页插件PageHelper的使用方法
- mongodb java 更新数据_MongoDB JAVA API更新数据示例
- buzz桌面服务器连接失败,Buzz 桌面 - 无与伦比的美丽,给「爱折腾」的你 - Android 应用 - 【最美应用】...
- html 定位 精灵技术 过度 2d变形 动画
- python爬取前程无忧分析一波机械职位信息
- eclipse serch查询的页面只能打开一个
- 2021年广东高考文综成绩查询,2020年广东高考成绩查询入口
- dubbo 面试18问