feat: 新增 convert 转换pdf子项目

This commit is contained in:
super_liu
2021-08-11 17:19:57 +08:00
parent 9b2b0145c0
commit e93edf3bbb
10 changed files with 1218 additions and 2 deletions
@@ -121,7 +121,7 @@ public class ActSarItemsEOService {
}
/***
* @Description: 标准解读流程入库"
* @Description: 国内外标准流程入库"
* @Author: yangxuenan
* @Date: 2020/12/7 13:48
* @Param: [standJson]
+260
View File
@@ -0,0 +1,260 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>foton-slrs-system-rest</artifactId>
<groupId>com.adc</groupId>
<version>3.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>adc-da-convert</artifactId>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.7</java.version>
<java_source_version>1.7</java_source_version>
<java_target_version>1.7</java_target_version>
<spring.version>4.3.9.RELEASE</spring.version>
<mybatis.version>3.4.0</mybatis.version>
<shiro.version>1.4.0-RC2</shiro.version>
<poi.version>4.1.2</poi.version>
</properties>
<repositories>
<repository>
<id>adc</id>
<url>http://60.247.58.121:8182/nexus/content/groups/public</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<distributionManagement>
<repository>
<id>thirdparty</id>
<name>Nexus Thirdparty Repository</name>
<url>http://60.247.58.121:8182/nexus/content/repositories/thirdparty/</url>
</repository>
</distributionManagement>
<dependencies>
<dependency>
<groupId>com.adc</groupId>
<artifactId>adc-da-swagger</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>com.adc</groupId>
<artifactId>adc-da-base</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>com.adc</groupId>
<artifactId>adc-da-sys</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>com.adc</groupId>
<artifactId>adc-da-util</artifactId>
<version>2.2.4</version>
<exclusions>
<exclusion>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk14</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<!-- SECURITY begin -->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>${shiro.version}</version>
</dependency>
<!-- SECURITY end -->
<dependency>
<groupId>com.adc</groupId>
<artifactId>adc-da-excel</artifactId>
<version>2.0.0</version>
</dependency>
<!-- poi begin -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>${poi.version}</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>${poi.version}</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>${poi.version}</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>${poi.version}</version>
<optional>true</optional>
</dependency>
<!-- poi end -->
<!--上传文件-->
<dependency>
<groupId>com.adc</groupId>
<artifactId>adc-da-file</artifactId>
<version>RELEASE</version>
</dependency>
<dependency>
<groupId>com.adc</groupId>
<artifactId>adc-da-file</artifactId>
<version>2.0.0</version>
</dependency>
<!--OFFICE CONVERTER BEGIN-->
<dependency>
<groupId>com.servlets</groupId>
<artifactId>cos</artifactId>
<version>05Nov2002</version>
</dependency>
<!--<dependency>
<groupId>com.artofsolving</groupId>
<artifactId>jodconverter</artifactId>
<version>2.2.1</version>
</dependency>-->
<dependency>
<groupId>com.artofsolving</groupId>
<artifactId>jodconverter</artifactId>
<scope>system</scope>
<version>2.2.2</version>
<systemPath>${basedir}/src/main/lib/jodconverter-2.2.2.jar</systemPath>
</dependency>
<dependency>
<groupId>org.openoffice</groupId>
<artifactId>juh</artifactId>
<version>3.0.1</version>
</dependency>
<dependency>
<groupId>org.openoffice</groupId>
<artifactId>jurt</artifactId>
<version>3.0.1</version>
</dependency>
<dependency>
<groupId>org.openoffice</groupId>
<artifactId>ridl</artifactId>
<version>3.0.1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jdk14</artifactId>
<version>1.7.21</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.openoffice</groupId>
<artifactId>unoil</artifactId>
<version>3.0.1</version>
</dependency>
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.3.1</version>
</dependency>
<!--OFFICE CONVERTER END-->
<!--ITEXT7 PDF文档编辑-->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>kernel</artifactId>
<version>7.0.4</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>io</artifactId>
<version>7.0.4</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>layout</artifactId>
<version>7.0.4</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>forms</artifactId>
<version>7.0.4</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>pdfa</artifactId>
<version>7.0.4</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>pdftest</artifactId>
<version>7.0.4</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.18</version>
</dependency>
<!--rabbitMQ-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<!--<dependency>
<groupId>com.adc</groupId>
<artifactId>adc-da-lawss</artifactId>
<version>1.0.0</version>
</dependency>-->
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<compilerVersion>${java.version}</compilerVersion>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
@@ -0,0 +1,19 @@
package com.adc.da.convert.common;
public enum ConvertStateEnum {
NO_CONVERT(0,"未转换"),CONVERING(1,"转换中"),CONVERT_SUCCESS(2,"转换成功"),CONVERT_ERROR(3,"转换失败");
private int value;
private String lable;
private ConvertStateEnum(int value, String lable) {
this.value = value;
this.lable = lable;
}
public int getValue() {
return value;
}
public String getLable() {
return lable;
}
}
@@ -0,0 +1,265 @@
package com.adc.da.convert.common;
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 com.itextpdf.kernel.pdf.PdfReader;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import java.io.*;
/**
* @Author yangxuenan
* @Description 文档转换
* Date 2018/8/24 13:44
* @Param
* @return
**/
public class DocConverter {
private static final Logger logger = LoggerFactory.getLogger(DocConverter.class);
// 环境 1windows 2:linux
private static final int ENVIRONMENT = 1;
// (只涉及pdf2swf路径问题)
private String fileString;
// 输入路径 ,如果不设置就输出在默认的位置
private String outputPath = "";
//转化文件名称
private String fileName;
//转换pdf文件
private File pdfFile;
//转换成swf文件
private File swfFile;
//待转换doc文件
private File docFile;
//为文件加水印后文件路径
String waterPdfPath;
@Value("${convert.host}")
private String convertHost;
public DocConverter(String fileString,String fileType) {
ini(fileString,fileType);
}
/**
* @Author yangxuenan
* @Description 重新设置file
* Date 2018/8/24 13:50
* @Param [fileString, fileType]
* @return void
**/
public void setFile(String fileString,String fileType) {
ini(fileString,fileType);
}
/**
* @Author yangxuenan
* @Description 初始化
* Date 2018/8/24 13:50
* @Param [fileString, fileType]
* @return void
**/
private void ini(String fileString,String fileType) {
this.fileString = fileString;
fileName = fileString.substring(0, fileString.lastIndexOf("."));
//判断文件类型,进行不同操作
if(".doc".equals(fileType) || ".docx".equals(fileType)){
docFile = new File(fileString);
pdfFile = new File(fileName + ".pdf");
swfFile = new File(fileName + ".swf");
} else if (".pdf".equals(fileType)){
pdfFile = new File(fileName + ".pdf");
swfFile = new File(fileName + ".swf");
}
}
/**
* @Author yangxuenan
* @Description 转为PDF
* Date 2018/8/24 13:50
* @Param []
* @return void
**/
private void doc2pdf() throws Exception {
if (docFile.exists()) {
if (!pdfFile.exists()) {
logger.info("转换服务地址接口:"+convertHost);
//连接openOffice
OpenOfficeConnection connection = new SocketOpenOfficeConnection(convertHost,8100);
try {
connection.connect();
//使用openOffice将doc文件转换问pdf文件
DocumentConverter converter = new OpenOfficeDocumentConverter(connection);
converter.convert(docFile, pdfFile);
// 关闭连接
connection.disconnect();
logger.info("****pdf转换成功,PDF输出:" + pdfFile.getPath()+ "****");
} catch (java.net.ConnectException e) {
logger.error(e.getMessage(),e);
logger.info("****swf转换器异常,openoffice服务未启动!****");
throw e;
} catch (com.artofsolving.jodconverter.openoffice.connection.OpenOfficeException e) {
logger.error(e.getMessage(),e);
logger.info("****swf转换器异常,读取转换文件失败****");
throw e;
} catch (Exception e) {
logger.error(e.getMessage(),e);
throw e;
}
} else {
logger.info("****已经转换为pdf,不需要再进行转化****");
}
} else {
logger.info("****swf转换器异常,需要转换的文档不存在,无法转换****");
}
}
/**
* @Author yangxuenan
* @Description 转换成 swf
* Date 2018/8/24 13:51
* @Param [fileType]
* @return void
**/
/*private void pdf2swf(String fileType) throws Exception {
Runtime r = Runtime.getRuntime();
if (!swfFile.exists()) {
if (pdfFile.exists()) {
// windows环境处理
if (ENVIRONMENT == 1) {
try {
//使用swfTools工具将pdf文件转换为swf文件
//String paperSwfFile = swfFile.getPath().replace(".swf","%.swf");
Process p = r.exec("G:/swftTools/pdf2swf.exe "+ waterPdfPath + " -o "+ swfFile.getPath() + " -f -T 9 -t -s languagedir=G:/xpdf/xpdf-chinese-simplified");
logger.info("****swf转换成功,文件输出:" + swfFile.getPath() + "****");
//如果源文件为doc类文件,将过渡的pdf文件删除
if(".doc".equals(fileType) || ".docx".equals(fileType)){
if (pdfFile.exists()) {
if(!pdfFile.delete()){
logger.error("文件删除失败!!!");
}
}
}
} catch (IOException e) {
logger.error(e.getMessage(),e);
throw e;
}
} else if (ENVIRONMENT == 2) {// linux环境处理
try {
Process p = r.exec("pdf2swf " + pdfFile.getPath()
+ " -o " + swfFile.getPath() + " -f -T 9 -t -s storeallcharacters");
logger.info("****swf转换成功,文件输出:" + swfFile.getPath() + "****");
if (pdfFile.exists()) {
if(!pdfFile.delete()){
logger.error("文件删除失败!!!");
}
}
} catch (Exception e) {
logger.error(e.getMessage(),e);
throw e;
}
}
} else {
logger.info("****pdf不存在,无法转换****");
}
} else {
logger.info("****swf已经存在不需要转换****");
}
}*/
static String loadStream(InputStream in) throws IOException {
int ptr = 0;
in = new BufferedInputStream(in);
StringBuilder buffer = new StringBuilder();
while ((ptr = in.read()) != -1) {
buffer.append((char) ptr);
}
return buffer.toString();
}
/**
* @Author yangxuenan
* @Description 转换主方法
* Date 2018/8/24 13:51
* @Param [fileType]
* @return boolean
**/
public boolean conver(String fileType) {
if (swfFile.exists()) {
logger.info("****swf转换器开始工作,该文件已经转换为swf****");
return true;
}
if (ENVIRONMENT == 1) {
logger.info("****swf转换器开始工作,当前设置运行环境windows****");
} else {
logger.info("****swf转换器开始工作,当前设置运行环境linux****");
}
try {
//判断待转换文件类型,如果为doc文件需要先转为pdf类型文件
if(".doc".equals(fileType) || ".docx".equals(fileType)){
doc2pdf();
// pdf2swf(fileType);
} else if (".pdf".equals(fileType)){
// pdf2swf(fileType);
}
} catch (Exception e) {
logger.error(e.getMessage(),e);
return false;
}
if (swfFile.exists()) {
return true;
} else {
return false;
}
}
/**
* @Author yangxuenan
* @Description 返回文件路径
* Date 2018/8/24 13:52
* @Param []
* @return java.lang.String
**/
public String getswfPath() {
if (swfFile.exists()) {
//获取转换后的swf文件路径
String tempString = swfFile.getPath();
tempString = tempString.replaceAll("\\\\", "/");
return tempString;
} else {
return "";
}
}
/**
* @Author yangxuenan
* @Description 设置输出路径
* Date 2018/8/24 13:52
* @Param [outputPath]
* @return void
**/
public void setOutputPath(String outputPath) {
this.outputPath = outputPath;
if (!outputPath.equals("")) {
String realName = fileName.substring(fileName.lastIndexOf("/"),
fileName.lastIndexOf("."));
if (outputPath.charAt(outputPath.length()) == '/') {
swfFile = new File(outputPath + realName + ".swf");
}
}
}
}
@@ -0,0 +1,243 @@
package com.adc.da.convert.common;
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 com.artofsolving.jodconverter.openoffice.converter.StreamOpenOfficeDocumentConverter;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.*;
public class DocConverterPdf {
private static final Logger logger = LoggerFactory.getLogger(DocConverterPdf.class);
private static final int ENVIRONMENT = 1;// 环境 1windows 2:linux
private String fileString;// (只涉及pdf2swf路径问题)
private String outputPath = "";// 输入路径 ,如果不设置就输出在默认的位置
private String fileName;
private File pdfFile;
private File convertPdfFile;
private File swfFile;
private File docFile;
String waterPdfPath;
private String convertHost;
public DocConverterPdf(String fileString, String fileType) {
ini(fileString,fileType);
}
/**
* 重新设置file
*
* @param fileString
*/
public void setFile(String fileString,String fileType) {
ini(fileString,fileType);
}
/**
* 初始化
*
* @param fileString
*/
private void ini(String fileString,String fileType) {
this.fileString = fileString;
fileName = fileString.substring(0, fileString.lastIndexOf("."));
if(".doc".equals(fileType.toLowerCase()) || ".docx".equals(fileType.toLowerCase()) || ".xlsx".equals(fileType.toLowerCase()) || ".xls".equals(fileType.toLowerCase()) || ".ppt".equals(fileType.toLowerCase()) || ".pptx".equals(fileType.toLowerCase())){
docFile = new File(fileString);
convertPdfFile=new File(fileName+"_C"+ ".pdf");
pdfFile = new File(fileName + ".pdf");
swfFile = new File(fileName + ".swf");
} else if (".pdf".equals(fileType)){
pdfFile = new File(fileName + ".pdf");
swfFile = new File(fileName + ".swf");
}
}
/**
* 转为PDF
*
* @param
*/
private void doc2pdf() throws Exception {
if (!pdfFile.exists()) {
OpenOfficeConnection connection = null;
logger.info("转换服务地址接口:"+convertHost);
try {
if(StringUtils.isNotBlank(convertHost)){
connection = new SocketOpenOfficeConnection(convertHost,8100);
}else{
connection = new SocketOpenOfficeConnection(8100);
}
connection.connect();
DocumentConverter converter = new StreamOpenOfficeDocumentConverter(connection);
converter.convert(docFile, convertPdfFile);
//addWaterToPdf(pdfFile,userId);
// close the connection
connection.disconnect();
// 开始设置PDF文档相关属性保证其安全性
logger.info("开始设置转换后的PDF文件安全性相关设置");
PDFEditUtils.setPDFFileSecurity(pdfFile.getAbsolutePath(),convertPdfFile.getAbsolutePath());
logger.info("****pdf转换成功,PDF输出:" + pdfFile.getPath()+ "****");
} catch (java.net.ConnectException e) {
logger.error(e.getMessage(),e);
logger.info("****pdf转换器异常,openoffice服务未启动!****");
throw e;
} catch (com.artofsolving.jodconverter.openoffice.connection.OpenOfficeException e) {
logger.error(e.getMessage(),e);
logger.info("****pdf转换器异常,读取转换文件失败****");
throw e;
} catch (Exception e) {
logger.error(e.getMessage(),e);
throw e;
}
} else {
logger.info("****已经转换为pdf,不需要再进行转化****");
}
}
/**
* 转换成 swf
*/
@SuppressWarnings("unused")
/*private void pdf2swf(String fileType) throws Exception {
Runtime r = Runtime.getRuntime();
if (!swfFile.exists()) {
if (pdfFile.exists()) {
if (ENVIRONMENT == 1) {// windows环境处理
try {
//String paperSwfFile = swfFile.getPath().replace(".swf","%.swf");
Process p = r.exec("G:/swftTools/pdf2swf.exe "+ waterPdfPath + " -o "+ swfFile.getPath() + " -f -T 9 -t -s languagedir=G:/xpdf/xpdf-chinese-simplified");
logger.info("****swf转换成功,文件输出:" + swfFile.getPath() + "****");
if(".doc".equals(fileType) || ".docx".equals(fileType)){
*//*if (pdfFile.exists()) {
pdfFile.delete();
}*//*
}
} catch (IOException e) {
logger.error(e.getMessage(),e);
throw e;
}
} else if (ENVIRONMENT == 2) {// linux环境处理
try {
Process p = r.exec("pdf2swf " + pdfFile.getPath()
+ " -o " + swfFile.getPath() + " -f -T 9 -t -s storeallcharacters");
logger.info("****swf转换成功,文件输出:" + swfFile.getPath() + "****");
if (pdfFile.exists()) {
if(!pdfFile.delete()){
logger.error("文件删除失败!!!");
}
}
} catch (Exception e) {
logger.error(e.getMessage(),e);
throw e;
}
}
} else {
logger.info("****pdf不存在,无法转换****");
}
} else {
logger.info("****swf已经存在不需要转换****");
}
}*/
static String loadStream(InputStream in) throws IOException {
int ptr = 0;
in = new BufferedInputStream(in);
StringBuilder buffer = new StringBuilder();
while ((ptr = in.read()) != -1) {
buffer.append((char) ptr);
}
return buffer.toString();
}
/**
* 转换主方法
*/
@SuppressWarnings("unused")
public File conver(String fileType) {
if (ENVIRONMENT == 1) {
logger.info("****swf转换器开始工作,当前设置运行环境windows****");
} else {
logger.info("****swf转换器开始工作,当前设置运行环境linux****");
}
try {
if(StringUtils.isNotBlank(fileType)){
fileType = fileType.toUpperCase();
if(".DOC".equals(fileType) || ".DOCX".equals(fileType) || ".XLSX".equals(fileType) || ".XLS".equals(fileType) || ".PPT".equals(fileType) || ".PPTX".equals(fileType)){
doc2pdf();
/*pdf2swf(fileType);*/
} else if (".PDF".equals(fileType)){
/*pdf2swf(fileType);*/
}
}else{
logger.error("文件类型后缀获取失败,请检查文件名称格式是否正确");
}
} catch (Exception e) {
logger.error(e.getMessage(),e);
return new File("");
}
return pdfFile;
}
/**
* 返回文件路径
*
* @param
*/
public String getswfPath() {
if (swfFile.exists()) {
String tempString = swfFile.getPath();
tempString = tempString.replaceAll("\\\\", "/");
return tempString;
} else {
return "";
}
}
public String getpdfPath() {
if (pdfFile!= null && !pdfFile.getPath().isEmpty()) {
String tempString = pdfFile.getPath();
tempString = tempString.replaceAll("\\\\", "/");
return tempString;
} else {
return "";
}
}
/**
* 设置输出路径
*/
public void setOutputPath(String outputPath) {
this.outputPath = outputPath;
if (!outputPath.equals("")) {
String realName = fileName.substring(fileName.lastIndexOf("/"), fileName.lastIndexOf("."));
//TODO 此处的if判断执行的代码逻辑完全一样, 因此将其判断注释掉,直接执行
/* if (outputPath.charAt(outputPath.length()) == '/') {
swfFile = new File(outputPath + realName + ".swf");
} else {
swfFile = new File(outputPath + realName + ".swf");
}*/
swfFile = new File(outputPath + realName + ".swf");
}
}
public String getConvertHost() {
return convertHost;
}
public void setConvertHost(String convertHost) {
this.convertHost = convertHost;
}
}
@@ -0,0 +1,225 @@
package com.adc.da.convert.common;
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 org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
public class DocConverterPdfOld {
private static final Logger logger = LoggerFactory.getLogger(DocConverterPdf.class);
private static final int ENVIRONMENT = 1;// 环境 1windows 2:linux
private String fileString;// (只涉及pdf2swf路径问题)
private String outputPath = "";// 输入路径 ,如果不设置就输出在默认的位置
private String fileName;
private File pdfFile;
private File convertPdfFile;
private File swfFile;
private File docFile;
String waterPdfPath;
public DocConverterPdfOld(String fileString, String fileType) {
ini(fileString,fileType);
}
/**
* 重新设置file
*
* @param fileString
*/
public void setFile(String fileString,String fileType) {
ini(fileString,fileType);
}
/**
* 初始化
*
* @param fileString
*/
private void ini(String fileString,String fileType) {
this.fileString = fileString;
fileName = fileString.substring(0, fileString.lastIndexOf("."));
if(".doc".equals(fileType) || ".docx".equals(fileType) || ".xlsx".equals(fileType) || ".xls".equals(fileType) || ".ppt".equals(fileType) || ".pptx".equals(fileType)){
docFile = new File(fileString);
convertPdfFile=new File(fileName+"_C"+ ".pdf");
pdfFile = new File(fileName + ".pdf");
swfFile = new File(fileName + ".swf");
} else if (".pdf".equals(fileType)){
pdfFile = new File(fileName + ".pdf");
swfFile = new File(fileName + ".swf");
}
}
/**
* 转为PDF
*
* @param
*/
private void doc2pdf() throws Exception {
if (!pdfFile.exists()) {
OpenOfficeConnection connection = new SocketOpenOfficeConnection(8100);
try {
connection.connect();
DocumentConverter converter = new OpenOfficeDocumentConverter(connection);
converter.convert(docFile, convertPdfFile);
//addWaterToPdf(pdfFile,userId);
// close the connection
connection.disconnect();
// 开始设置PDF文档相关属性保证其安全性
logger.info("开始设置转换后的PDF文件安全性相关设置");
logger.info("****pdf转换成功,PDF输出:" + pdfFile.getPath()+ "****");
} catch (java.net.ConnectException e) {
logger.error(e.getMessage(),e);
logger.info("****pdf转换器异常,openoffice服务未启动!****");
throw e;
} catch (com.artofsolving.jodconverter.openoffice.connection.OpenOfficeException e) {
logger.error(e.getMessage(),e);
logger.info("****pdf转换器异常,读取转换文件失败****");
throw e;
} catch (Exception e) {
logger.error(e.getMessage(),e);
throw e;
}
} else {
logger.info("****已经转换为pdf,不需要再进行转化****");
}
}
/**
* 转换成 swf
*/
@SuppressWarnings("unused")
/*private void pdf2swf(String fileType) throws Exception {
Runtime r = Runtime.getRuntime();
if (!swfFile.exists()) {
if (pdfFile.exists()) {
if (ENVIRONMENT == 1) {// windows环境处理
try {
//String paperSwfFile = swfFile.getPath().replace(".swf","%.swf");
Process p = r.exec("G:/swftTools/pdf2swf.exe "+ waterPdfPath + " -o "+ swfFile.getPath() + " -f -T 9 -t -s languagedir=G:/xpdf/xpdf-chinese-simplified");
logger.info("****swf转换成功,文件输出:" + swfFile.getPath() + "****");
if(".doc".equals(fileType) || ".docx".equals(fileType)){
*//*if (pdfFile.exists()) {
pdfFile.delete();
}*//*
}
} catch (IOException e) {
logger.error(e.getMessage(),e);
throw e;
}
} else if (ENVIRONMENT == 2) {// linux环境处理
try {
Process p = r.exec("pdf2swf " + pdfFile.getPath()
+ " -o " + swfFile.getPath() + " -f -T 9 -t -s storeallcharacters");
logger.info("****swf转换成功,文件输出:" + swfFile.getPath() + "****");
if (pdfFile.exists()) {
if(!pdfFile.delete()){
logger.error("文件删除失败!!!");
}
}
} catch (Exception e) {
logger.error(e.getMessage(),e);
throw e;
}
}
} else {
logger.info("****pdf不存在,无法转换****");
}
} else {
logger.info("****swf已经存在不需要转换****");
}
}*/
static String loadStream(InputStream in) throws IOException {
int ptr = 0;
in = new BufferedInputStream(in);
StringBuilder buffer = new StringBuilder();
while ((ptr = in.read()) != -1) {
buffer.append((char) ptr);
}
return buffer.toString();
}
/**
* 转换主方法
*/
@SuppressWarnings("unused")
public File conver(String fileType) {
if (ENVIRONMENT == 1) {
logger.info("****swf转换器开始工作,当前设置运行环境windows****");
} else {
logger.info("****swf转换器开始工作,当前设置运行环境linux****");
}
try {
if(".doc".equals(fileType) || ".docx".equals(fileType) || ".xlsx".equals(fileType) || ".xls".equals(fileType) || ".ppt".equals(fileType) || ".pptx".equals(fileType)){
doc2pdf();
/*pdf2swf(fileType);*/
} else if (".pdf".equals(fileType)){
/*pdf2swf(fileType);*/
}
} catch (Exception e) {
logger.error(e.getMessage(),e);
return new File("");
}
return pdfFile;
}
/**
* 返回文件路径
*
* @param
*/
public String getswfPath() {
if (swfFile.exists()) {
String tempString = swfFile.getPath();
tempString = tempString.replaceAll("\\\\", "/");
return tempString;
} else {
return "";
}
}
public String getpdfPath() {
if (!pdfFile.getPath().isEmpty()) {
String tempString = pdfFile.getPath();
tempString = tempString.replaceAll("\\\\", "/");
return tempString;
} else {
return "";
}
}
/**
* 设置输出路径
*/
public void setOutputPath(String outputPath) {
this.outputPath = outputPath;
if (!outputPath.equals("")) {
String realName = fileName.substring(fileName.lastIndexOf("/"), fileName.lastIndexOf("."));
//TODO 此处的if判断执行的代码逻辑完全一样, 因此将其判断注释掉,直接执行
/* if (outputPath.charAt(outputPath.length()) == '/') {
swfFile = new File(outputPath + realName + ".swf");
} else {
swfFile = new File(outputPath + realName + ".swf");
}*/
swfFile = new File(outputPath + realName + ".swf");
}
}
}
@@ -0,0 +1,34 @@
package com.adc.da.convert.common;
import com.itextpdf.kernel.pdf.*;
import java.io.File;
import java.io.IOException;
/***
*
* @MethodName:PDF编辑工具类
* @author: zhangyanduan
* @param:
* @return:
* date: 2019/3/6 18:36
*/
public class PDFEditUtils {
//设置安全性
public static void setPDFFileSecurity(String descFilePath,String srcFilePath) throws IOException {
checkOutFile(descFilePath);
PdfReader reader = new PdfReader(srcFilePath, new ReaderProperties());
PdfWriter writer = new PdfWriter(descFilePath, new WriterProperties()
.setStandardEncryption(null, "1234qwer".getBytes(), EncryptionConstants.ALLOW_SCREENREADERS,
EncryptionConstants.ENCRYPTION_AES_128 | EncryptionConstants.DO_NOT_ENCRYPT_METADATA));
PdfDocument pdfDoc = new PdfDocument(reader, writer);
pdfDoc.close();
}
private static void checkOutFile(String descFilePath){
File desc=new File(descFilePath);
desc.getParentFile().mkdirs();
}
}
@@ -0,0 +1,169 @@
package com.adc.da.convert.common;
import com.adc.da.util.utils.UUID;
import com.itextpdf.text.*;
import com.itextpdf.text.log.Logger;
import com.itextpdf.text.log.LoggerFactory;
import com.itextpdf.text.pdf.*;
import org.apache.commons.lang.StringUtils;
import sun.misc.BASE64Encoder;
import java.io.*;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
public class SplitPdf {
private static final Logger logger = LoggerFactory.getLogger(SplitPdf.class);
public static String splitPDFFile(String inputPath,
String outputPath, int fromPage, int toPage) {
Document document = new Document();
InputStream inputStream = null;
OutputStream outputStream = null;
String allPassword = "";
try {
logger.info("*********开始拆分pdf**********");
inputStream = new FileInputStream(inputPath);
outputStream = new FileOutputStream(outputPath);
PdfReader inputPDF = new PdfReader(inputStream);
int totalPages = inputPDF.getNumberOfPages();
//make fromPage equals to toPage if it is greater
if(fromPage > toPage ) {
fromPage = toPage;
}
if(toPage > totalPages) {
toPage = totalPages;
}
// Create a writer for the outputstream
PdfWriter writer = PdfWriter.getInstance(document, outputStream);
Map<String,String> pwdMap = setFilePassword();
allPassword = pwdMap.get("allPwd");
String filepassword = pwdMap.get("filePwd");
writer.setEncryption(filepassword.getBytes(), "1234qwer".getBytes(),
PdfWriter.ALLOW_PRINTING, PdfWriter.ENCRYPTION_AES_128);
document.open();
//构造文件,防止初始化文件为空
//document.add(new Chunk(""));
PdfContentByte cb = writer.getDirectContent(); // Holds the PDF data
PdfImportedPage page;
while(fromPage <= toPage) {
Rectangle pageSize = inputPDF.getPageSize(fromPage);
document.setPageSize(new Rectangle(pageSize.getWidth(),pageSize.getHeight()));
document.newPage();
page = writer.getImportedPage(inputPDF, fromPage);
// 此处将文档的旋转参数写入新的文档中
/* PdfDictionary pageN = inputPDF.getPageN(fromPage);
PdfNumber asNumber = pageN.getAsNumber(PdfName.ROTATE);
PdfDictionary additional = new PdfDictionary();
additional.put(PdfName.ROTATE,asNumber);
page.setAdditional(additional);*/
cb.addTemplate(page, 0, 0);
fromPage++;
}
outputStream.flush();
document.close();
inputStream.close();
outputStream.close();
//加密码
/*String path = outputPath.replace("测试文件拆分\\","测试文件拆分\\加密码\\");
PDFEditUtils.setPDFFileSecurity(outputPath,outputPath);*/
}catch (IllegalArgumentException ie){
logger.error("拆分过程中,读取文件失败");
logger.error(ie.getMessage(),ie);
logger.error(ie.getMessage());
} catch (IOException ioe) {
logger.error("拆分过程中,读取文件IO失败");
logger.error(ioe.getMessage(),ioe);
logger.error(ioe.getMessage());
}catch (Exception e) {
logger.error(e.getMessage(),e);
logger.error(e.getMessage());
} finally {
if(document.isOpen()){
document.close();
}
try {
if (inputStream != null){
inputStream.close();
}
if (outputStream != null){
outputStream.close();
}
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
return allPassword;
}
/**
* 利用libreOffice将office文档转换成pdf
* @param inputFile 目标文件地址
* @param pdfFile 输出文件夹
* @return
*/
public static boolean convertOffice2PDF(String inputFile, String pdfFile){
long start = System.currentTimeMillis();
String command;
boolean flag;
String osName = System.getProperty("os.name");
if (osName.contains("Windows")) {
command = "cmd /c soffice --headless --invisible --convert-to pdf:writer_pdf_Export " + inputFile + " --outdir " + pdfFile;
}else {
command = "libreoffice --headless --invisible --convert-to pdf:writer_pdf_Export " + inputFile + " --outdir " + pdfFile;
}
flag = executeLibreOfficeCommand(command);
long end = System.currentTimeMillis();
logger.debug("用时:{} ms"+(end - start));
return flag;
}
/**
* 执行command指令
* @param command
* @return
*/
public static boolean executeLibreOfficeCommand(String command) {
logger.info("开始进行转化.......");
Process process;// Process可以控制该子进程的执行或获取该子进程的信息
try {
logger.info("convertOffice2PDF cmd : {}"+ command);
process = Runtime.getRuntime().exec(command);// exec()方法指示Java虚拟机创建一个子进程执行指定的可执行程序,并返回与该子进程对应的Process对象实例。
// 下面两个可以获取输入输出流
// InputStream errorStream = process.getErrorStream();
// InputStream inputStream = process.getInputStream();
} catch (IOException e) {
logger.error(" convertOffice2PDF {} error"+command, e);
return false;
}
int exitStatus = 0;
try {
exitStatus = process.waitFor();// 等待子进程完成再往下执行,返回值是子线程执行完毕的返回值,返回0表示正常结束
// 第二种接受返回值的方法
int i = process.exitValue(); // 接收执行完毕的返回值
logger.debug("返回值:"+i);
} catch (InterruptedException e) {
logger.info("InterruptedException convertOffice2PDF {}"+ command);
return false;
}
logger.info("convertOffice2PDF cmd exitStatus {}"+ exitStatus);
process.destroy(); // 销毁子进程
logger.info("转化结束.......");
return true;
}
//设置文件密码
public static Map<String,String> setFilePassword(){
String allPwd = UUID.randomUUID(20);
String filePwd = allPwd.substring(0,5) + allPwd.substring(15,20);
Map<String,String> map = new HashMap<>();
map.put("allPwd",allPwd);
map.put("filePwd",filePwd);
return map;
}
}
Binary file not shown.
+2 -1
View File
@@ -39,7 +39,8 @@
<module>adc-da-search</module>
<module>adc-da-slrs</module>
<module>adc-da-activiti</module>
<!-- <module>adc-da-search</module>-->
<module>adc-da-convert</module>
<!-- <module>adc-da-search</module>-->
</modules>
<repositories>