Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
M
midjourney-proxy
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
徐少华
midjourney-proxy
Commits
d5f7ebc4
Commit
d5f7ebc4
authored
Jul 29, 2019
by
songxiang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
错题本2.75期相关代码
parent
56de0445
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
1277 additions
and
1112 deletions
+1277
-1112
FilePathConstant.java
...ain/java/com/pcloud/common/constant/FilePathConstant.java
+69
-0
StoreFlowInfoDto.java
...src/main/java/com/pcloud/common/dto/StoreFlowInfoDto.java
+149
-0
FileUtils.java
...mmon/src/main/java/com/pcloud/common/utils/FileUtils.java
+5
-5
ImageUtils.java
...mon/src/main/java/com/pcloud/common/utils/ImageUtils.java
+39
-85
PictureUtil.java
...on/src/main/java/com/pcloud/common/utils/PictureUtil.java
+354
-358
OssUtils.java
...rc/main/java/com/pcloud/common/utils/aliyun/OssUtils.java
+3
-3
UrlUtils.java
...ain/java/com/pcloud/common/utils/httpclient/UrlUtils.java
+2
-18
PdfUtils.java
...n/src/main/java/com/pcloud/common/utils/pdf/PdfUtils.java
+5
-7
StringUtil.java
.../main/java/com/pcloud/common/utils/string/StringUtil.java
+15
-0
WordNewUtils.java
.../main/java/com/pcloud/common/utils/word/WordNewUtils.java
+632
-632
WordUtils.java
...src/main/java/com/pcloud/common/utils/word/WordUtils.java
+4
-4
No files found.
pcloud-common/src/main/java/com/pcloud/common/constant/FilePathConstant.java
0 → 100644
View file @
d5f7ebc4
/*
* 武汉理工数字传播工程有限公司源代码,版权归武汉理工数字传播工程有限公司所有.
* 项目名称 : pcloud-common
* 创建日期 : 2017年3月3日
* 修改历史 :
* 1. [2017年3月3日]创建文件 by xnxqs
*/
package
com
.
pcloud
.
common
.
constant
;
/**
*
*
* @Author: songx
* @Date: 2019/7/29,14:11
*/
public
class
FilePathConstant
{
/**
* 视频剪切文件夹
*/
public
final
static
String
CUT
=
getFolder
(
"cut"
);
/**
* 下载文件夹
*/
public
final
static
String
DOWNLOAD
=
getFolder
(
"download"
);
/**
* 生成图片地址
*/
public
final
static
String
IMAGE
=
getFolder
(
"image"
);
/**
* 生成带水印文件夹
*/
public
final
static
String
IMAGE_WATERMARK
=
getFolder
(
"image/watermark"
);
/**
* 生成音频文件夹
*/
public
final
static
String
AUDIO
=
getFolder
(
"audio"
);
/**
* 生成PDF文件夹
*/
public
final
static
String
PDF
=
getFolder
(
"pdf"
);
/**
* 生成WORD文件夹
*/
public
final
static
String
WORD
=
getFolder
(
"word"
);
/**
* 生成TEXT文件夹
*/
public
final
static
String
TEXT
=
getFolder
(
"text"
);
/**
* 组装文件夹路径
*
* @param folderName
* @return
*/
private
static
String
getFolder
(
String
folderName
)
{
return
OSConstant
.
USERDIR
+
OSConstant
.
SEPARATOR
+
"files"
+
folderName
+
OSConstant
.
SEPARATOR
;
}
}
pcloud-common/src/main/java/com/pcloud/common/dto/StoreFlowInfoDto.java
0 → 100644
View file @
d5f7ebc4
package
com
.
pcloud
.
common
.
dto
;
import
com.pcloud.common.dto.BaseDto
;
import
java.math.BigDecimal
;
/**
* @Describe: TODO
* @Author: zhangdongwei
* @Date: Create on 11:35 2019/7/24 0024
*/
public
class
StoreFlowInfoDto
extends
BaseDto
{
/**
* 标识(appId/productId/bookGroupId)
*/
private
Long
originId
;
/**
* 类型(APP/PRODUCT/BOOK_GROUP)
*/
private
String
originType
;
/**
*具体类型
*/
private
String
typeCode
;
/**
* 标题
*/
private
String
title
;
/**
* 封面图片
*/
private
String
coverImg
;
/**
* 价格
*/
private
BigDecimal
price
;
/**
* 开始时间(MM-dd)
*/
private
String
startDate
;
/**
* 结束时间(MM-dd)
*/
private
String
endDate
;
/**
* 数量(应用、作品下的资源数量, 社群书的群数量,等)
*/
private
Integer
resourceNum
;
/**
* 数量(资源的item数量,群的成员数量,等)
*/
private
Integer
resourceItemNum
;
public
Long
getOriginId
()
{
return
originId
;
}
public
void
setOriginId
(
Long
originId
)
{
this
.
originId
=
originId
;
}
public
String
getOriginType
()
{
return
originType
;
}
public
void
setOriginType
(
String
originType
)
{
this
.
originType
=
originType
;
}
public
String
getTypeCode
()
{
return
typeCode
;
}
public
void
setTypeCode
(
String
typeCode
)
{
this
.
typeCode
=
typeCode
;
}
public
String
getTitle
()
{
return
title
;
}
public
void
setTitle
(
String
title
)
{
this
.
title
=
title
;
}
public
String
getCoverImg
()
{
return
coverImg
;
}
public
void
setCoverImg
(
String
coverImg
)
{
this
.
coverImg
=
coverImg
;
}
public
BigDecimal
getPrice
()
{
return
price
;
}
public
void
setPrice
(
BigDecimal
price
)
{
this
.
price
=
price
;
}
public
String
getStartDate
()
{
return
startDate
;
}
public
void
setStartDate
(
String
startDate
)
{
this
.
startDate
=
startDate
;
}
public
String
getEndDate
()
{
return
endDate
;
}
public
void
setEndDate
(
String
endDate
)
{
this
.
endDate
=
endDate
;
}
public
Integer
getResourceNum
()
{
return
resourceNum
;
}
public
void
setResourceNum
(
Integer
resourceNum
)
{
this
.
resourceNum
=
resourceNum
;
}
public
Integer
getResourceItemNum
()
{
return
resourceItemNum
;
}
public
void
setResourceItemNum
(
Integer
resourceItemNum
)
{
this
.
resourceItemNum
=
resourceItemNum
;
}
@Override
public
String
toString
()
{
return
"StoreFlowInfoDto{"
+
"originId="
+
originId
+
", originType='"
+
originType
+
'\''
+
", typeCode='"
+
typeCode
+
'\''
+
", title='"
+
title
+
'\''
+
", coverImg='"
+
coverImg
+
'\''
+
", price="
+
price
+
", startDate='"
+
startDate
+
'\''
+
", endDate='"
+
endDate
+
'\''
+
", resourceNum="
+
resourceNum
+
", resourceItemNum="
+
resourceItemNum
+
"} "
+
super
.
toString
();
}
}
pcloud-common/src/main/java/com/pcloud/common/utils/FileUtils.java
View file @
d5f7ebc4
...
...
@@ -29,7 +29,7 @@ import org.slf4j.Logger;
import
org.slf4j.LoggerFactory
;
import
com.pcloud.common.constant.AliyunConstant
;
import
com.pcloud.common.constant.FilePathConst
;
import
com.pcloud.common.constant.FilePathConst
ant
;
import
com.pcloud.common.constant.OSConstant
;
import
com.pcloud.common.entity.UploadResultInfo
;
import
com.pcloud.common.exceptions.BizException
;
...
...
@@ -215,7 +215,7 @@ public class FileUtils {
/**
* 传入文件夹路径,该方法能够实现创建整个路径
*
* @param
p
ath
* @param
fileP
ath
* 文件夹路径,不包含文件名称及后缀名
*/
public
static
boolean
isDir
(
String
filePath
)
{
...
...
@@ -882,7 +882,7 @@ public class FileUtils {
String
fileType
=
getFileType
(
url
);
String
localFilePath
=
url
;
if
(
url
.
startsWith
(
"http"
))
{
localFilePath
=
FilePathConst
.
TEXT_PATH
+
UUIDUitl
.
taskName
()
+
"."
+
fileType
;
localFilePath
=
FilePathConst
ant
.
TEXT
+
UUIDUitl
.
taskName
()
+
"."
+
fileType
;
downloadFileFromUrl
(
url
,
localFilePath
);
}
try
{
...
...
@@ -919,7 +919,7 @@ public class FileUtils {
return
null
;
}
// 下载文件
String
downloadPath
=
FilePathConst
.
DOWNLOAD_PATH
+
UUIDUitl
.
generateString
(
32
)
+
"."
+
fileType
;
String
downloadPath
=
FilePathConst
ant
.
DOWNLOAD
+
UUIDUitl
.
generateString
(
32
)
+
"."
+
fileType
;
FileUtils
.
downloadFileFromUrl
(
url
,
downloadPath
);
// 剪切文件
String
cutPath
=
clipByPercent
(
new
File
(
downloadPath
),
percent
);
...
...
@@ -969,7 +969,7 @@ public class FileUtils {
throw
new
FileException
(
FileException
.
FILE_READ_FAILURE
,
"剪切的文件必须大于1KB"
);
}
// 输出文件路径
String
outFilePath
=
FilePathConst
.
CUT_PATH
+
UUIDUitl
.
generateString
(
12
)
+
"_"
+
inputFile
.
getName
();
String
outFilePath
=
FilePathConst
ant
.
CUT
+
UUIDUitl
.
generateString
(
12
)
+
"_"
+
inputFile
.
getName
();
creatFiles
(
outFilePath
);
// 剪切长度
cutLength
=
cutLength
>
inputFile
.
length
()
?
inputFile
.
length
()
:
cutLength
;
...
...
pcloud-common/src/main/java/com/pcloud/common/utils/ImageUtils.java
View file @
d5f7ebc4
...
...
@@ -11,16 +11,12 @@ import java.math.BigDecimal;
import
javax.imageio.ImageIO
;
import
org.apache.commons.lang3.StringUtils
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
com.itextpdf.text.Image
;
import
com.pcloud.common.constant.AliyunConstant
;
import
com.pcloud.common.constant.FilePathConst
;
import
com.pcloud.common.constant.ImageConstant
;
import
com.pcloud.common.entity.UploadResultInfo
;
import
com.pcloud.common.enums.ImageEnum
;
import
com.pcloud.common.exceptions.BizException
;
import
com.pcloud.common.exceptions.FileException
;
...
...
@@ -738,37 +734,32 @@ public class ImageUtils {
* @param fileUrl
* @return
*/
// public static UploadResultInfo transcodeToWebp(String fileUrl, int quality) {
// LOGGER.info("【IMAGE API】image transcode to webp.<START>.[fileUrl]=" + fileUrl
// + ",[quality]=" + quality);
// String fileNameAll = FileUtils.getFileNameAll(fileUrl);
// String localFilePath = FilePathConst.DOWNLOAD_PATH + fileNameAll;
// FileUtils.downloadFileFromUrl(fileUrl, localFilePath);
// String outputFilePath = FilePathConst.IMAGE_PATH + "webp/" + fileNameAll +
// ".webp";
// FileUtils.creatFiles(outputFilePath);
// UploadResultInfo uploadResultInfo = null;
// try {
// String os = System.getProperty("os.name");
// if (os.toLowerCase().startsWith("win")) {
// executeCwebp4Win(localFilePath, outputFilePath, quality);
// } else {
// executeCwebp4Linux(localFilePath, outputFilePath, quality);
// }
// uploadResultInfo = OssUtils.uploadLocalFile4Child(outputFilePath, fileUrl);
// } catch (Exception e) {
// LOGGER.error("An error happend when convert to webp. Img is: " +
// e.getMessage(), e);
// throw new FileException(FileException.FILE_CONVERT_FAIL, "transcode to webp
// is fail!");
// } finally {
// FileUtils.deleteFile(localFilePath);
// FileUtils.deleteFile(outputFilePath);
// }
// LOGGER.info("【IMAGE API】image transcode to webp.<START>.[uploadResultInfo]="
// + uploadResultInfo);
// return uploadResultInfo;
// }
// public static UploadResultInfo transcodeToWebp(String fileUrl, int quality) {
// LOGGER.info("【IMAGE API】image transcode to webp.<START>.[fileUrl]=" + fileUrl + ",[quality]=" + quality);
// String fileNameAll = FileUtils.getFileNameAll(fileUrl);
// String localFilePath = FilePathConstant.DOWNLOAD_PATH + fileNameAll;
// FileUtils.downloadFileFromUrl(fileUrl, localFilePath);
// String outputFilePath = FilePathConstant.IMAGE_PATH + "webp/" + fileNameAll + ".webp";
// FileUtils.creatFiles(outputFilePath);
// UploadResultInfo uploadResultInfo = null;
// try {
// String os = System.getProperty("os.name");
// if (os.toLowerCase().startsWith("win")) {
// executeCwebp4Win(localFilePath, outputFilePath, quality);
// } else {
// executeCwebp4Linux(localFilePath, outputFilePath, quality);
// }
// uploadResultInfo = OssUtils.uploadLocalFile4Child(outputFilePath, fileUrl);
// } catch (Exception e) {
// LOGGER.error("An error happend when convert to webp. Img is: " + e.getMessage(), e);
// throw new FileException(FileException.FILE_CONVERT_FAIL, "transcode to webp is fail!");
// } finally {
// FileUtils.deleteFile(localFilePath);
// FileUtils.deleteFile(outputFilePath);
// }
// LOGGER.info("【IMAGE API】image transcode to webp.<START>.[uploadResultInfo]=" + uploadResultInfo);
// return uploadResultInfo;
// }
/**
* execute cwebp command:cwebp [options] input_file -o output_file.webp
...
...
@@ -778,15 +769,13 @@ public class ImageUtils {
* @param quality
* @throws Exception
*/
// private static void executeCwebp4Win(String inputFilePath, String
// outputFilePath, int quality) throws Exception {
// Process process = new ProcessBuilder("cwebp", "-q", (quality == 0 ? 80 :
// quality) + "", inputFilePath, "-o",
// outputFilePath).redirectErrorStream(true).start();
// if (0 != process.waitFor()) {
// throw new Exception("process wait for fail!");
// }
// }
// private static void executeCwebp4Win(String inputFilePath, String outputFilePath, int quality) throws Exception {
// Process process = new ProcessBuilder("cwebp", "-q", (quality == 0 ? 80 : quality) + "", inputFilePath, "-o",
// outputFilePath).redirectErrorStream(true).start();
// if (0 != process.waitFor()) {
// throw new Exception("process wait for fail!");
// }
// }
/**
* execute cwebp command:cwebp [options] input_file -o output_file.webp
...
...
@@ -796,47 +785,12 @@ public class ImageUtils {
* @param quality
* @throws Exception
*/
// private static void executeCwebp4Linux(String inputFilePath, String
// outputFilePath, int quality) throws Exception {
// Process process = new ProcessBuilder("/usr/local/bin/cwebp", "-q", (quality
// == 0 ? 80 : quality) + "",
// inputFilePath, "-o", outputFilePath).redirectErrorStream(true).start();
// if (0 != process.waitFor()) {
// throw new Exception("process wait for fail!");
// }
// }
/**
* 上传的图片转换成webpO
*
* @param localFilePath
* 源文件的本地路径
* @param httpUrl
* 源文件上传后的路径,主要用于子文件上传时对应http文件路径
*/
public
static
UploadResultInfo
toWebp
(
String
fileUrl
)
{
// String fileNameAll = FileUtils.getFileNameAll(fileUrl);
// String localFilePath = FilePathConst.DOWNLOAD_PATH + fileNameAll;
// FileUtils.downloadFileFromUrl(fileUrl, localFilePath);
// String tragetPath = null;
// try {
// tragetPath = com.dcg.util.ImageUtils.transcodeToWebp(localFilePath, 80);
// } catch (Exception e) {
// LOGGER.error("【IMAGE】图片转换成webp失败:" + e.getMessage(), e);
// return null;
// }
// if (StringUtils.isEmpty(tragetPath)) {
// return null;
// private static void executeCwebp4Linux(String inputFilePath, String outputFilePath, int quality) throws Exception {
// Process process = new ProcessBuilder("/usr/local/bin/cwebp", "-q", (quality == 0 ? 80 : quality) + "",
// inputFilePath, "-o", outputFilePath).redirectErrorStream(true).start();
// if (0 != process.waitFor()) {
// throw new Exception("process wait for fail!");
// }
// try {
// return OssUtils.uploadLocalFile4Child(tragetPath, fileUrl);
// } catch (Exception e) {
// LOGGER.error("【IMAGE】图片转换成webp,上传失败:" + e.getMessage(), e);
// } finally {
// FileUtils.deleteFile(localFilePath);
// FileUtils.deleteFile(tragetPath);
// }
return
null
;
}
// }
}
pcloud-common/src/main/java/com/pcloud/common/utils/PictureUtil.java
View file @
d5f7ebc4
package
com
.
pcloud
.
common
.
utils
;
/**
* Created by ${user} on ${date}
*/
import
com.alibaba.fastjson.JSON
;
import
com.pcloud.common.entity.UploadResultInfo
;
import
com.pcloud.common.enums.ImageTypeEnum
;
import
com.pcloud.common.utils.aliyun.OssUtils
;
import
com.pcloud.common.utils.httpclient.SimpleHttpUtils
;
import
com.pcloud.common.utils.json.JSONUtils
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
javax.imageio.ImageIO
;
import
java.awt.*
;
import
java.awt.image.BufferedImage
;
import
java.io.*
;
import
java.net.URL
;
import
java.util.ArrayList
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
/**
* @author TianChao
* @date 2018/10/13 15:02
*/
public
class
PictureUtil
{
private
static
final
Logger
LOGGER
=
LoggerFactory
.
getLogger
(
PictureUtil
.
class
);
private
static
Color
defaultColor
=
new
Color
(
252
,
252
,
252
);
private
static
Color
borderColor
=
new
Color
(
221
,
221
,
221
);
private
static
String
playPic
=
"https://file.5rs.me/oss/uploadfe/png/3c687bffac4d885ecfff8517d6c3f9c2.png"
;
private
static
String
defaultBackgroundPic
=
"https://oss.5rs.me/oss/uploadfe/png/3003b8978e85052f96ababdf7d46f70a.png"
;
public
static
Color
getImagePixel
(
BufferedImage
bi
)
{
if
(
bi
.
getWidth
()*
bi
.
getHeight
()>
500000
)
{
BufferedImage
pic1
=
new
BufferedImage
(
157
,
224
,
BufferedImage
.
SCALE_SMOOTH
);
Graphics
graphics
=
pic1
.
getGraphics
();
graphics
.
drawImage
(
bi
.
getScaledInstance
(
157
,
224
,
Image
.
SCALE_SMOOTH
),
0
,
0
,
null
);
graphics
.
dispose
();
bi
=
pic1
;
}
int
width
=
bi
.
getWidth
();
int
height
=
bi
.
getHeight
();
int
sum
=
width
*
height
;
int
minx
=
bi
.
getMinX
();
int
miny
=
bi
.
getMinY
();
int
R
=
0
;
int
G
=
0
;
int
B
=
0
;
List
<
String
>
list
=
new
ArrayList
<>();
for
(
int
i
=
minx
;
i
<
width
;
i
++)
{
for
(
int
j
=
miny
;
j
<
height
;
j
++)
{
int
pixel
=
bi
.
getRGB
(
i
,
j
);
if
(
pixel
==
Color
.
white
.
getRGB
()
||
pixel
==
Color
.
black
.
getRGB
()){
continue
;
}
R
=(
pixel
&
0xff0000
)
>>
16
;
G
=(
pixel
&
0xff00
)
>>
8
;
B
=(
pixel
&
0xff
);
if
((
R
>
230
&&
G
>
230
&&
B
>
230
)
||(
R
<
30
&&
G
<
30
&&
B
<
30
)){
continue
;
}
list
.
add
(
R
+
"-"
+
G
+
"-"
+
B
);
}
}
// R = R/sum;
// G = G/sum;
// B = B/sum;
// return new Color(R,G,B);
return
getMaxCount
(
list
);
}
public
static
Color
getMaxCount
(
List
<
String
>
s
)
{
List
<
String
>
list
=
s
;
Map
<
String
,
Integer
>
map
=
new
HashMap
<
String
,
Integer
>();
for
(
String
c
:
list
)
{
Integer
l
=
map
.
get
(
c
);
if
(
l
==
null
)
l
=
1
;
else
l
++;
map
.
put
(
c
,
l
);
}
String
max
=
null
;
long
num
=
0
;
for
(
Map
.
Entry
<
String
,
Integer
>
entry
:
map
.
entrySet
())
{
String
key
=
entry
.
getKey
();
Integer
temp
=
entry
.
getValue
();
if
(
max
==
null
||
temp
>
num
)
{
max
=
key
;
num
=
temp
;
}
}
String
str
[]
=
max
.
split
(
"\\-"
);
if
(
str
.
length
==
3
)
{
return
new
Color
(
Integer
.
parseInt
(
str
[
0
]),
Integer
.
parseInt
(
str
[
1
]),
Integer
.
parseInt
(
str
[
2
]));
}
return
Color
.
gray
;
}
public
static
String
getB16
(
int
R
,
int
G
,
int
B
){
String
[]
h
=
new
String
[
256
];
h
[
0
]=
"00"
;
h
[
1
]=
"01"
;
h
[
2
]=
"02"
;
h
[
3
]=
"03"
;
h
[
4
]=
"04"
;
h
[
5
]=
"05"
;
h
[
6
]=
"06"
;
h
[
7
]=
"07"
;
h
[
8
]=
"08"
;
h
[
9
]=
"09"
;
h
[
10
]=
"0A"
;
h
[
11
]=
"0B"
;
h
[
12
]=
"0C"
;
h
[
13
]=
"0D"
;
h
[
14
]=
"0E"
;
h
[
15
]=
"0F"
;
h
[
16
]=
"10"
;
h
[
17
]=
"11"
;
h
[
18
]=
"12"
;
h
[
19
]=
"13"
;
h
[
20
]=
"14"
;
h
[
21
]=
"15"
;
h
[
22
]=
"16"
;
h
[
23
]=
"17"
;
h
[
24
]=
"18"
;
h
[
25
]=
"19"
;
h
[
26
]=
"1A"
;
h
[
27
]=
"1B"
;
h
[
28
]=
"1C"
;
h
[
29
]=
"1D"
;
h
[
30
]=
"1E"
;
h
[
31
]=
"1F"
;
h
[
32
]=
"20"
;
h
[
33
]=
"21"
;
h
[
34
]=
"22"
;
h
[
35
]=
"23"
;
h
[
36
]=
"24"
;
h
[
37
]=
"25"
;
h
[
38
]=
"26"
;
h
[
39
]=
"27"
;
h
[
40
]=
"28"
;
h
[
41
]=
"29"
;
h
[
42
]=
"2A"
;
h
[
43
]=
"2B"
;
h
[
44
]=
"2C"
;
h
[
45
]=
"2D"
;
h
[
46
]=
"2E"
;
h
[
47
]=
"2F"
;
h
[
48
]=
"30"
;
h
[
49
]=
"31"
;
h
[
50
]=
"32"
;
h
[
51
]=
"33"
;
h
[
52
]=
"34"
;
h
[
53
]=
"35"
;
h
[
54
]=
"36"
;
h
[
55
]=
"37"
;
h
[
56
]=
"38"
;
h
[
57
]=
"39"
;
h
[
58
]=
"3A"
;
h
[
59
]=
"3B"
;
h
[
60
]=
"3C"
;
h
[
61
]=
"3D"
;
h
[
62
]=
"3E"
;
h
[
63
]=
"3F"
;
h
[
64
]=
"40"
;
h
[
65
]=
"41"
;
h
[
66
]=
"42"
;
h
[
67
]=
"43"
;
h
[
68
]=
"44"
;
h
[
69
]=
"45"
;
h
[
70
]=
"46"
;
h
[
71
]=
"47"
;
h
[
72
]=
"48"
;
h
[
73
]=
"49"
;
h
[
74
]=
"4A"
;
h
[
75
]=
"4B"
;
h
[
76
]=
"4C"
;
h
[
77
]=
"4D"
;
h
[
78
]=
"4E"
;
h
[
79
]=
"4F"
;
h
[
80
]=
"50"
;
h
[
81
]=
"51"
;
h
[
82
]=
"52"
;
h
[
83
]=
"53"
;
h
[
84
]=
"54"
;
h
[
85
]=
"55"
;
h
[
86
]=
"56"
;
h
[
87
]=
"57"
;
h
[
88
]=
"58"
;
h
[
89
]=
"59"
;
h
[
90
]=
"5A"
;
h
[
91
]=
"5B"
;
h
[
92
]=
"5C"
;
h
[
93
]=
"5D"
;
h
[
94
]=
"5E"
;
h
[
95
]=
"6F"
;
h
[
96
]=
"60"
;
h
[
97
]=
"61"
;
h
[
98
]=
"62"
;
h
[
99
]=
"63"
;
h
[
100
]=
"64"
;
h
[
101
]=
"65"
;
h
[
102
]=
"66"
;
h
[
103
]=
"67"
;
h
[
104
]=
"68"
;
h
[
105
]=
"69"
;
h
[
106
]=
"6A"
;
h
[
107
]=
"6B"
;
h
[
108
]=
"6C"
;
h
[
109
]=
"6D"
;
h
[
110
]=
"6E"
;
h
[
111
]=
"6F"
;
h
[
112
]=
"70"
;
h
[
113
]=
"71"
;
h
[
114
]=
"72"
;
h
[
115
]=
"73"
;
h
[
116
]=
"74"
;
h
[
117
]=
"75"
;
h
[
118
]=
"76"
;
h
[
119
]=
"77"
;
h
[
120
]=
"78"
;
h
[
121
]=
"79"
;
h
[
122
]=
"7A"
;
h
[
123
]=
"7B"
;
h
[
124
]=
"7C"
;
h
[
125
]=
"7D"
;
h
[
126
]=
"7E"
;
h
[
127
]=
"7F"
;
h
[
128
]=
"80"
;
h
[
129
]=
"81"
;
h
[
130
]=
"82"
;
h
[
131
]=
"83"
;
h
[
132
]=
"84"
;
h
[
133
]=
"85"
;
h
[
134
]=
"86"
;
h
[
135
]=
"87"
;
h
[
136
]=
"88"
;
h
[
137
]=
"89"
;
h
[
138
]=
"8A"
;
h
[
139
]=
"8B"
;
h
[
140
]=
"8C"
;
h
[
141
]=
"8D"
;
h
[
142
]=
"8E"
;
h
[
143
]=
"8F"
;
h
[
144
]=
"90"
;
h
[
145
]=
"91"
;
h
[
146
]=
"92"
;
h
[
147
]=
"93"
;
h
[
148
]=
"94"
;
h
[
149
]=
"95"
;
h
[
150
]=
"96"
;
h
[
151
]=
"97"
;
h
[
152
]=
"98"
;
h
[
153
]=
"99"
;
h
[
154
]=
"9A"
;
h
[
155
]=
"9B"
;
h
[
156
]=
"9C"
;
h
[
157
]=
"9D"
;
h
[
158
]=
"9E"
;
h
[
159
]=
"9F"
;
h
[
160
]=
"A0"
;
h
[
161
]=
"A1"
;
h
[
162
]=
"A2"
;
h
[
163
]=
"A3"
;
h
[
164
]=
"A4"
;
h
[
165
]=
"A5"
;
h
[
166
]=
"A6"
;
h
[
167
]=
"A7"
;
h
[
168
]=
"A8"
;
h
[
169
]=
"A9"
;
h
[
170
]=
"AA"
;
h
[
171
]=
"AB"
;
h
[
172
]=
"AC"
;
h
[
173
]=
"AD"
;
h
[
174
]=
"AE"
;
h
[
175
]=
"AF"
;
h
[
176
]=
"B0"
;
h
[
177
]=
"B1"
;
h
[
178
]=
"B2"
;
h
[
179
]=
"B3"
;
h
[
180
]=
"B4"
;
h
[
181
]=
"B5"
;
h
[
182
]=
"B6"
;
h
[
183
]=
"B7"
;
h
[
184
]=
"B8"
;
h
[
185
]=
"B9"
;
h
[
186
]=
"BA"
;
h
[
187
]=
"BB"
;
h
[
188
]=
"BC"
;
h
[
189
]=
"BD"
;
h
[
190
]=
"BE"
;
h
[
191
]=
"BF"
;
h
[
192
]=
"C0"
;
h
[
193
]=
"C1"
;
h
[
194
]=
"C2"
;
h
[
195
]=
"C3"
;
h
[
196
]=
"C4"
;
h
[
197
]=
"C5"
;
h
[
198
]=
"C6"
;
h
[
199
]=
"C7"
;
h
[
200
]=
"C8"
;
h
[
201
]=
"C9"
;
h
[
202
]=
"CA"
;
h
[
203
]=
"CB"
;
h
[
204
]=
"CC"
;
h
[
205
]=
"CD"
;
h
[
206
]=
"CE"
;
h
[
207
]=
"CF"
;
h
[
208
]=
"D0"
;
h
[
209
]=
"D1"
;
h
[
210
]=
"D2"
;
h
[
211
]=
"D3"
;
h
[
212
]=
"D4"
;
h
[
213
]=
"D5"
;
h
[
214
]=
"D6"
;
h
[
215
]=
"D7"
;
h
[
216
]=
"D8"
;
h
[
217
]=
"D9"
;
h
[
218
]=
"DA"
;
h
[
219
]=
"DB"
;
h
[
220
]=
"DC"
;
h
[
221
]=
"DD"
;
h
[
222
]=
"DE"
;
h
[
223
]=
"DF"
;
h
[
224
]=
"E0"
;
h
[
225
]=
"E1"
;
h
[
226
]=
"E2"
;
h
[
227
]=
"E3"
;
h
[
228
]=
"E4"
;
h
[
229
]=
"E5"
;
h
[
230
]=
"E6"
;
h
[
231
]=
"E7"
;
h
[
232
]=
"E8"
;
h
[
233
]=
"E9"
;
h
[
234
]=
"EA"
;
h
[
235
]=
"EB"
;
h
[
236
]=
"EC"
;
h
[
237
]=
"ED"
;
h
[
238
]=
"EE"
;
h
[
239
]=
"EF"
;
h
[
240
]=
"F0"
;
h
[
241
]=
"F1"
;
h
[
242
]=
"F2"
;
h
[
243
]=
"F3"
;
h
[
244
]=
"F4"
;
h
[
245
]=
"F5"
;
h
[
246
]=
"F6"
;
h
[
247
]=
"F7"
;
h
[
248
]=
"F8"
;
h
[
249
]=
"F9"
;
h
[
250
]=
"FA"
;
h
[
251
]=
"FB"
;
h
[
252
]=
"FC"
;
h
[
253
]=
"FD"
;
h
[
254
]=
"FE"
;
h
[
255
]=
"FF"
;
return
"#"
+
h
[
R
]
+
h
[
G
]
+
h
[
B
];
}
public
static
Color
getImagePixel
(
String
imgFile
)
{
BufferedImage
bi
=
null
;
Color
imagePixel
;
try
{
if
(
imgFile
.
contains
(
"http"
)){
bi
=
ImageIO
.
read
(
new
URL
(
imgFile
));
}
else
{
bi
=
ImageIO
.
read
(
new
File
(
imgFile
));
}
imagePixel
=
getImagePixel
(
bi
);
}
catch
(
Exception
e
)
{
imagePixel
=
Color
.
gray
;
LOGGER
.
warn
(
"生成图片失败,图片="
+
imgFile
+
","
+
e
.
getMessage
(),
e
);
}
return
imagePixel
;
}
public
static
String
toBrowserHexValue
(
int
number
)
{
StringBuilder
builder
=
new
StringBuilder
(
Integer
.
toHexString
(
number
&
0xff
));
while
(
builder
.
length
()
<
2
)
{
builder
=
new
StringBuilder
(
"0"
).
append
(
builder
);
}
return
builder
.
toString
().
toUpperCase
();
}
public
static
Color
toColorFromString
(
String
colorStr
){
colorStr
=
colorStr
.
substring
(
2
);
Color
color
=
new
Color
(
Integer
.
parseInt
(
colorStr
,
16
))
;
return
color
;
}
private
static
BufferedImage
subPicByWhite
(
BufferedImage
picImage
){
return
picImage
.
getSubimage
(
9
,
9
,
699
,
300
);
}
public
static
String
getQrCover
(
String
bookPic
,
boolean
isDefault
){
String
resultPath
=
""
;
try
{
Color
color
=
null
;
try
{
color
=
getImagePixel
(
bookPic
);
}
catch
(
Exception
e
){
color
=
Color
.
gray
;
}
String
lightIcon
=
"https://oss.5rs.me/oss/uploadfe/png/12dcbc38528d926912c444765d786a9a.png"
;
String
deepIcon
=
"https://oss.5rs.me/oss/uploadfe/png/60612a7415bdac8533568ae0c21a94b6.png"
;
String
icon
;
if
(
color
!=
null
&&
(
color
.
getRed
()<
180
||
color
.
getBlue
()<
180
||
color
.
getGreen
()<
180
)){
icon
=
lightIcon
;
}
else
{
icon
=
deepIcon
;
}
String
html
=
"<div style = \"position: relative;width: 700px;height: 300px;border: 0px solid green;background-color: #fcfcfc;text-align: center;\"> <div style = \"position: absolute;width: 100%;height: 66%;background-color: rgb("
+
color
.
getRed
()+
","
+
color
.
getGreen
()+
","
+
color
.
getBlue
()+
");overflow: hidden;\"> <div style = \"position: absolute;top: 20px;right: -20px;background-image: url('"
+
icon
+
"');background-size: 100%;width: 219px;height: 149px;\"> </div> </div><div style=\"position: relative;display: inline-block;width: 158px;height: 225px;box-shadow: 0px 4px 14px 2px rgba(14, 47, 70, 0.2);border-radius: 4px;border: solid 1px #ddd; margin-top: 35px;background: url('"
+
bookPic
+
"') no-repeat;background-size: cover;background-position: center;\"></div></div>"
;
Map
<
String
,
String
>
header
=
new
HashMap
<>();
header
.
put
(
"Content-Type"
,
"application/json"
);
Map
<
String
,
String
>
param
=
new
HashMap
<>();
param
.
put
(
"htmlCode"
,
html
);
String
postResult
=
HttpKit
.
post
(
"http://192.168.1.7:8216/transcode/htm2img/jpg"
,
JSON
.
toJSONString
(
param
));
Map
map
=
JSONUtils
.
jsonToMap
(
postResult
,
String
.
class
,
String
.
class
);
String
pic
=
(
String
)
map
.
get
(
"data"
);
BufferedImage
bookPicImage
=
ImageIO
.
read
(
new
URL
(
pic
));
BufferedImage
bufferedImage
=
subPicByWhite
(
bookPicImage
);
ByteArrayOutputStream
os
=
new
ByteArrayOutputStream
();
ImageIO
.
write
(
bufferedImage
,
ImageTypeEnum
.
JPG
.
value
,
os
);
UploadResultInfo
uploadResultInfo
=
OssUtils
.
uploadFileByte
(
os
.
toByteArray
(),
UUIDUitl
.
taskName
(),
ImageTypeEnum
.
JPG
.
value
);
os
.
close
();
resultPath
=
uploadResultInfo
==
null
?
null
:
uploadResultInfo
.
getUrl
();
}
catch
(
Exception
e
)
{
LOGGER
.
error
(
"生成合成图失败,url="
+
bookPic
+
"====="
+
e
.
getMessage
(),
e
);
}
return
resultPath
;
}
public
static
void
main
(
String
[]
args
)
{
// String bookPic = "https://file.5rs.me/oss/upload/image/jpg/c2c7f0b85f9f4eb683cd86a2945bc5e5.jpg";
String
bookPic
=
"https://oss.5rs.me/oss/uploadfe/jpg/e88c2f608fe4365f5c0efd7dda0eb59e.jpg"
;
Color
color
;
if
(
bookPic
.
contains
(
"/oss/"
)){
String
s
=
SimpleHttpUtils
.
httpGet
(
bookPic
+
"?x-oss-process=image/average-hue"
,
null
);
System
.
out
.
println
(
s
);
Map
map
=
JSONUtils
.
jsonToMap
(
s
,
String
.
class
,
String
.
class
);
String
rgb
=
(
String
)
map
.
get
(
"RGB"
);
color
=
toColorFromString
(
rgb
);
}
else
{
color
=
getImagePixel
(
bookPic
);
}
String
lightIcon
=
"https://oss.5rs.me/oss/uploadfe/png/12dcbc38528d926912c444765d786a9a.png"
;
String
deepIcon
=
"https://oss.5rs.me/oss/uploadfe/png/60612a7415bdac8533568ae0c21a94b6.png"
;
String
icon
;
if
(
color
!=
null
&&
(
color
.
getRed
()<
180
||
color
.
getBlue
()<
180
||
color
.
getGreen
()<
180
)){
icon
=
lightIcon
;
}
else
{
icon
=
deepIcon
;
}
String
html
=
"<div style = \"position: relative;width: 700px;height: 300px;border: 0px solid green;background-color: #fcfcfc;text-align: center;\"> <div style = \"position: absolute;width: 100%;height: 66%;background-color: rgb("
+
color
.
getRed
()+
","
+
color
.
getGreen
()+
","
+
color
.
getBlue
()+
");overflow: hidden;\"> <div style = \"position: absolute;top: 20px;right: -20px;background-image: url('"
+
icon
+
"');background-size: 100%;width: 219px;height: 149px;\"> </div> </div><div style=\"position: relative;display: inline-block;width: 158px;height: 225px;box-shadow: 0px 4px 14px 2px rgba(14, 47, 70, 0.2);border-radius: 4px;border: solid 1px #ddd; margin-top: 35px;background: url('"
+
bookPic
+
"') no-repeat;background-size: cover;background-position: center;\"></div></div>"
;
Map
<
String
,
String
>
header
=
new
HashMap
<>();
header
.
put
(
"Content-Type"
,
"application/json"
);
Map
<
String
,
String
>
param
=
new
HashMap
<>();
param
.
put
(
"htmlCode"
,
html
);
String
postResult
=
HttpKit
.
post
(
"http://192.168.92.111:8214/transcode/htm2img/jpg"
,
JSON
.
toJSONString
(
param
));
// String s = SimpleHttpUtils.httpRequest("http://localhost:8214/transcode/htm2img/jpg", param,"POST","utf-8",header);
Map
map
=
JSONUtils
.
jsonToMap
(
postResult
,
String
.
class
,
String
.
class
);
String
pic
=
(
String
)
map
.
get
(
"data"
);
System
.
out
.
println
(
pic
);
try
{
BufferedImage
bookPicImage
=
ImageIO
.
read
(
new
URL
(
pic
));
BufferedImage
bufferedImage
=
subPicByWhite
(
bookPicImage
);
OutputStream
os
=
new
FileOutputStream
(
"C:\\Users\\LiHao\\Desktop\\封面图\\result.jpg"
);
ImageIO
.
write
(
bufferedImage
,
ImageTypeEnum
.
JPG
.
value
,
os
);
os
.
close
();
}
catch
(
IOException
e
)
{
e
.
printStackTrace
();
}
// String bookPic = "C:\\Users\\LiHao\\Desktop\\封面图\\aa.jpg";
// String playPic = "C:\\Users\\LiHao\\Desktop\\封面图\\播放按钮.png";
// String defaultBackgroundPic = "C:\\Users\\LiHao\\Desktop\\封面图\\默认图背景.png";
// String resultPath = "C:\\Users\\LiHao\\Desktop\\封面图\\result.jpg";
// Boolean isDefalut = false;
// try {
// //取书封面和播放按钮图
// BufferedImage bookPicImage;
// BufferedImage playPicImage;
// BufferedImage defaultBackgroudImage;
// if(bookPic.contains("https:")){
// bookPicImage = ImageIO.read(new URL(bookPic));
// playPicImage = ImageIO.read(new URL(playPic));
// defaultBackgroudImage = ImageIO.read(new URL(defaultBackgroundPic));
// }else{
// bookPicImage = ImageIO.read(new File(bookPic));
// playPicImage = ImageIO.read(new File(playPic));
// defaultBackgroudImage = ImageIO.read(new File(defaultBackgroundPic));
// }
//
// //画一个空的背景
// BufferedImage bg = new BufferedImage(702, 299, BufferedImage.TYPE_3BYTE_BGR);
// Graphics2D g = bg.createGraphics();
// //获取主题色
// Color c = getImagePixel(bookPic);
//
//
// //画纯色的背景或者默认背景图
// g.setColor(c);
// if(isDefalut){
// g.drawImage(defaultBackgroudImage.getScaledInstance(702,196, Image.SCALE_DEFAULT), 0, 0, null);
// }else {
// g.fillRect(0, 0, 702, 196);
// }
// g.setColor(new Color(252, 252, 252));
// g.fillRect(0, 196, 702, 102);
//
// g.setColor(new Color(221, 221, 221));
// //插入书籍图和播放按钮
// g.drawImage(bookPicImage.getScaledInstance(172,238, Image.SCALE_DEFAULT), 265, 30, null);
// g.drawImage(playPicImage.getScaledInstance(80,80, Image.SCALE_DEFAULT), 306, 105, null);
// g.drawRect(265,30,172,238);
//
// for(int i=0;i<3;i++){
//
// }
//
// //保存图片
// if(bookPic.contains("https:")) {
// ByteArrayOutputStream os = new ByteArrayOutputStream();
// ImageIO.write(bg, ImageTypeEnum.JPG.value, os);
// UploadResultInfo uploadResultInfo = OssUtils.uploadFileByte(os.toByteArray(), UUIDUitl.taskName(), ImageTypeEnum.JPG.value);
// os.close();
// s = uploadResultInfo == null ? null : uploadResultInfo.getUrl();
// }else{
// OutputStream os = new FileOutputStream(resultPath);
// ImageIO.write(bg, ImageTypeEnum.JPG.value, os);
// os.close();
// }
// System.out.println(s);
// } catch (Exception e) {
// System.out.println(e.getMessage());
// }
}
}
package
com
.
pcloud
.
common
.
utils
;
/**
* Created by ${user} on ${date}
*/
import
com.alibaba.fastjson.JSON
;
import
com.pcloud.common.entity.UploadResultInfo
;
import
com.pcloud.common.enums.ImageTypeEnum
;
import
com.pcloud.common.utils.aliyun.OssUtils
;
import
com.pcloud.common.utils.httpclient.SimpleHttpUtils
;
import
com.pcloud.common.utils.json.JSONUtils
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
javax.imageio.ImageIO
;
import
java.awt.*
;
import
java.awt.image.BufferedImage
;
import
java.io.*
;
import
java.net.URL
;
import
java.util.ArrayList
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
/**
* @author TianChao
* @date 2018/10/13 15:02
*/
public
class
PictureUtil
{
private
static
final
Logger
LOGGER
=
LoggerFactory
.
getLogger
(
PictureUtil
.
class
);
private
static
Color
defaultColor
=
new
Color
(
252
,
252
,
252
);
private
static
Color
borderColor
=
new
Color
(
221
,
221
,
221
);
private
static
String
playPic
=
"https://file.5rs.me/oss/uploadfe/png/3c687bffac4d885ecfff8517d6c3f9c2.png"
;
private
static
String
defaultBackgroundPic
=
"https://oss.5rs.me/oss/uploadfe/png/3003b8978e85052f96ababdf7d46f70a.png"
;
public
static
Color
getImagePixel
(
BufferedImage
bi
)
{
if
(
bi
.
getWidth
()*
bi
.
getHeight
()>
500000
)
{
BufferedImage
pic1
=
new
BufferedImage
(
157
,
224
,
BufferedImage
.
SCALE_SMOOTH
);
Graphics
graphics
=
pic1
.
getGraphics
();
graphics
.
drawImage
(
bi
.
getScaledInstance
(
157
,
224
,
Image
.
SCALE_SMOOTH
),
0
,
0
,
null
);
graphics
.
dispose
();
bi
=
pic1
;
}
int
width
=
bi
.
getWidth
();
int
height
=
bi
.
getHeight
();
int
sum
=
width
*
height
;
int
minx
=
bi
.
getMinX
();
int
miny
=
bi
.
getMinY
();
int
R
=
0
;
int
G
=
0
;
int
B
=
0
;
List
<
String
>
list
=
new
ArrayList
<>();
for
(
int
i
=
minx
;
i
<
width
;
i
++)
{
for
(
int
j
=
miny
;
j
<
height
;
j
++)
{
int
pixel
=
bi
.
getRGB
(
i
,
j
);
if
(
pixel
==
Color
.
white
.
getRGB
()
||
pixel
==
Color
.
black
.
getRGB
()){
continue
;
}
R
=(
pixel
&
0xff0000
)
>>
16
;
G
=(
pixel
&
0xff00
)
>>
8
;
B
=(
pixel
&
0xff
);
if
((
R
>
230
&&
G
>
230
&&
B
>
230
)
||(
R
<
30
&&
G
<
30
&&
B
<
30
)){
continue
;
}
list
.
add
(
R
+
"-"
+
G
+
"-"
+
B
);
}
}
return
getMaxCount
(
list
);
}
public
static
Color
getMaxCount
(
List
<
String
>
s
)
{
List
<
String
>
list
=
s
;
Map
<
String
,
Integer
>
map
=
new
HashMap
<
String
,
Integer
>();
for
(
String
c
:
list
)
{
Integer
l
=
map
.
get
(
c
);
if
(
l
==
null
)
l
=
1
;
else
l
++;
map
.
put
(
c
,
l
);
}
String
max
=
null
;
long
num
=
0
;
for
(
Map
.
Entry
<
String
,
Integer
>
entry
:
map
.
entrySet
())
{
String
key
=
entry
.
getKey
();
Integer
temp
=
entry
.
getValue
();
if
(
max
==
null
||
temp
>
num
)
{
max
=
key
;
num
=
temp
;
}
}
String
str
[]
=
max
.
split
(
"\\-"
);
if
(
str
.
length
==
3
)
{
return
new
Color
(
Integer
.
parseInt
(
str
[
0
]),
Integer
.
parseInt
(
str
[
1
]),
Integer
.
parseInt
(
str
[
2
]));
}
return
Color
.
gray
;
}
public
static
String
getB16
(
int
R
,
int
G
,
int
B
){
String
[]
h
=
new
String
[
256
];
h
[
0
]=
"00"
;
h
[
1
]=
"01"
;
h
[
2
]=
"02"
;
h
[
3
]=
"03"
;
h
[
4
]=
"04"
;
h
[
5
]=
"05"
;
h
[
6
]=
"06"
;
h
[
7
]=
"07"
;
h
[
8
]=
"08"
;
h
[
9
]=
"09"
;
h
[
10
]=
"0A"
;
h
[
11
]=
"0B"
;
h
[
12
]=
"0C"
;
h
[
13
]=
"0D"
;
h
[
14
]=
"0E"
;
h
[
15
]=
"0F"
;
h
[
16
]=
"10"
;
h
[
17
]=
"11"
;
h
[
18
]=
"12"
;
h
[
19
]=
"13"
;
h
[
20
]=
"14"
;
h
[
21
]=
"15"
;
h
[
22
]=
"16"
;
h
[
23
]=
"17"
;
h
[
24
]=
"18"
;
h
[
25
]=
"19"
;
h
[
26
]=
"1A"
;
h
[
27
]=
"1B"
;
h
[
28
]=
"1C"
;
h
[
29
]=
"1D"
;
h
[
30
]=
"1E"
;
h
[
31
]=
"1F"
;
h
[
32
]=
"20"
;
h
[
33
]=
"21"
;
h
[
34
]=
"22"
;
h
[
35
]=
"23"
;
h
[
36
]=
"24"
;
h
[
37
]=
"25"
;
h
[
38
]=
"26"
;
h
[
39
]=
"27"
;
h
[
40
]=
"28"
;
h
[
41
]=
"29"
;
h
[
42
]=
"2A"
;
h
[
43
]=
"2B"
;
h
[
44
]=
"2C"
;
h
[
45
]=
"2D"
;
h
[
46
]=
"2E"
;
h
[
47
]=
"2F"
;
h
[
48
]=
"30"
;
h
[
49
]=
"31"
;
h
[
50
]=
"32"
;
h
[
51
]=
"33"
;
h
[
52
]=
"34"
;
h
[
53
]=
"35"
;
h
[
54
]=
"36"
;
h
[
55
]=
"37"
;
h
[
56
]=
"38"
;
h
[
57
]=
"39"
;
h
[
58
]=
"3A"
;
h
[
59
]=
"3B"
;
h
[
60
]=
"3C"
;
h
[
61
]=
"3D"
;
h
[
62
]=
"3E"
;
h
[
63
]=
"3F"
;
h
[
64
]=
"40"
;
h
[
65
]=
"41"
;
h
[
66
]=
"42"
;
h
[
67
]=
"43"
;
h
[
68
]=
"44"
;
h
[
69
]=
"45"
;
h
[
70
]=
"46"
;
h
[
71
]=
"47"
;
h
[
72
]=
"48"
;
h
[
73
]=
"49"
;
h
[
74
]=
"4A"
;
h
[
75
]=
"4B"
;
h
[
76
]=
"4C"
;
h
[
77
]=
"4D"
;
h
[
78
]=
"4E"
;
h
[
79
]=
"4F"
;
h
[
80
]=
"50"
;
h
[
81
]=
"51"
;
h
[
82
]=
"52"
;
h
[
83
]=
"53"
;
h
[
84
]=
"54"
;
h
[
85
]=
"55"
;
h
[
86
]=
"56"
;
h
[
87
]=
"57"
;
h
[
88
]=
"58"
;
h
[
89
]=
"59"
;
h
[
90
]=
"5A"
;
h
[
91
]=
"5B"
;
h
[
92
]=
"5C"
;
h
[
93
]=
"5D"
;
h
[
94
]=
"5E"
;
h
[
95
]=
"6F"
;
h
[
96
]=
"60"
;
h
[
97
]=
"61"
;
h
[
98
]=
"62"
;
h
[
99
]=
"63"
;
h
[
100
]=
"64"
;
h
[
101
]=
"65"
;
h
[
102
]=
"66"
;
h
[
103
]=
"67"
;
h
[
104
]=
"68"
;
h
[
105
]=
"69"
;
h
[
106
]=
"6A"
;
h
[
107
]=
"6B"
;
h
[
108
]=
"6C"
;
h
[
109
]=
"6D"
;
h
[
110
]=
"6E"
;
h
[
111
]=
"6F"
;
h
[
112
]=
"70"
;
h
[
113
]=
"71"
;
h
[
114
]=
"72"
;
h
[
115
]=
"73"
;
h
[
116
]=
"74"
;
h
[
117
]=
"75"
;
h
[
118
]=
"76"
;
h
[
119
]=
"77"
;
h
[
120
]=
"78"
;
h
[
121
]=
"79"
;
h
[
122
]=
"7A"
;
h
[
123
]=
"7B"
;
h
[
124
]=
"7C"
;
h
[
125
]=
"7D"
;
h
[
126
]=
"7E"
;
h
[
127
]=
"7F"
;
h
[
128
]=
"80"
;
h
[
129
]=
"81"
;
h
[
130
]=
"82"
;
h
[
131
]=
"83"
;
h
[
132
]=
"84"
;
h
[
133
]=
"85"
;
h
[
134
]=
"86"
;
h
[
135
]=
"87"
;
h
[
136
]=
"88"
;
h
[
137
]=
"89"
;
h
[
138
]=
"8A"
;
h
[
139
]=
"8B"
;
h
[
140
]=
"8C"
;
h
[
141
]=
"8D"
;
h
[
142
]=
"8E"
;
h
[
143
]=
"8F"
;
h
[
144
]=
"90"
;
h
[
145
]=
"91"
;
h
[
146
]=
"92"
;
h
[
147
]=
"93"
;
h
[
148
]=
"94"
;
h
[
149
]=
"95"
;
h
[
150
]=
"96"
;
h
[
151
]=
"97"
;
h
[
152
]=
"98"
;
h
[
153
]=
"99"
;
h
[
154
]=
"9A"
;
h
[
155
]=
"9B"
;
h
[
156
]=
"9C"
;
h
[
157
]=
"9D"
;
h
[
158
]=
"9E"
;
h
[
159
]=
"9F"
;
h
[
160
]=
"A0"
;
h
[
161
]=
"A1"
;
h
[
162
]=
"A2"
;
h
[
163
]=
"A3"
;
h
[
164
]=
"A4"
;
h
[
165
]=
"A5"
;
h
[
166
]=
"A6"
;
h
[
167
]=
"A7"
;
h
[
168
]=
"A8"
;
h
[
169
]=
"A9"
;
h
[
170
]=
"AA"
;
h
[
171
]=
"AB"
;
h
[
172
]=
"AC"
;
h
[
173
]=
"AD"
;
h
[
174
]=
"AE"
;
h
[
175
]=
"AF"
;
h
[
176
]=
"B0"
;
h
[
177
]=
"B1"
;
h
[
178
]=
"B2"
;
h
[
179
]=
"B3"
;
h
[
180
]=
"B4"
;
h
[
181
]=
"B5"
;
h
[
182
]=
"B6"
;
h
[
183
]=
"B7"
;
h
[
184
]=
"B8"
;
h
[
185
]=
"B9"
;
h
[
186
]=
"BA"
;
h
[
187
]=
"BB"
;
h
[
188
]=
"BC"
;
h
[
189
]=
"BD"
;
h
[
190
]=
"BE"
;
h
[
191
]=
"BF"
;
h
[
192
]=
"C0"
;
h
[
193
]=
"C1"
;
h
[
194
]=
"C2"
;
h
[
195
]=
"C3"
;
h
[
196
]=
"C4"
;
h
[
197
]=
"C5"
;
h
[
198
]=
"C6"
;
h
[
199
]=
"C7"
;
h
[
200
]=
"C8"
;
h
[
201
]=
"C9"
;
h
[
202
]=
"CA"
;
h
[
203
]=
"CB"
;
h
[
204
]=
"CC"
;
h
[
205
]=
"CD"
;
h
[
206
]=
"CE"
;
h
[
207
]=
"CF"
;
h
[
208
]=
"D0"
;
h
[
209
]=
"D1"
;
h
[
210
]=
"D2"
;
h
[
211
]=
"D3"
;
h
[
212
]=
"D4"
;
h
[
213
]=
"D5"
;
h
[
214
]=
"D6"
;
h
[
215
]=
"D7"
;
h
[
216
]=
"D8"
;
h
[
217
]=
"D9"
;
h
[
218
]=
"DA"
;
h
[
219
]=
"DB"
;
h
[
220
]=
"DC"
;
h
[
221
]=
"DD"
;
h
[
222
]=
"DE"
;
h
[
223
]=
"DF"
;
h
[
224
]=
"E0"
;
h
[
225
]=
"E1"
;
h
[
226
]=
"E2"
;
h
[
227
]=
"E3"
;
h
[
228
]=
"E4"
;
h
[
229
]=
"E5"
;
h
[
230
]=
"E6"
;
h
[
231
]=
"E7"
;
h
[
232
]=
"E8"
;
h
[
233
]=
"E9"
;
h
[
234
]=
"EA"
;
h
[
235
]=
"EB"
;
h
[
236
]=
"EC"
;
h
[
237
]=
"ED"
;
h
[
238
]=
"EE"
;
h
[
239
]=
"EF"
;
h
[
240
]=
"F0"
;
h
[
241
]=
"F1"
;
h
[
242
]=
"F2"
;
h
[
243
]=
"F3"
;
h
[
244
]=
"F4"
;
h
[
245
]=
"F5"
;
h
[
246
]=
"F6"
;
h
[
247
]=
"F7"
;
h
[
248
]=
"F8"
;
h
[
249
]=
"F9"
;
h
[
250
]=
"FA"
;
h
[
251
]=
"FB"
;
h
[
252
]=
"FC"
;
h
[
253
]=
"FD"
;
h
[
254
]=
"FE"
;
h
[
255
]=
"FF"
;
return
"#"
+
h
[
R
]
+
h
[
G
]
+
h
[
B
];
}
public
static
Color
getImagePixel
(
String
imgFile
)
{
BufferedImage
bi
=
null
;
Color
imagePixel
;
try
{
if
(
imgFile
.
contains
(
"http"
)){
bi
=
ImageIO
.
read
(
new
URL
(
imgFile
));
}
else
{
bi
=
ImageIO
.
read
(
new
File
(
imgFile
));
}
imagePixel
=
getImagePixel
(
bi
);
}
catch
(
Exception
e
)
{
imagePixel
=
Color
.
gray
;
LOGGER
.
warn
(
"生成图片失败,图片="
+
imgFile
+
","
+
e
.
getMessage
(),
e
);
}
return
imagePixel
;
}
public
static
String
toBrowserHexValue
(
int
number
)
{
StringBuilder
builder
=
new
StringBuilder
(
Integer
.
toHexString
(
number
&
0xff
));
while
(
builder
.
length
()
<
2
)
{
builder
=
new
StringBuilder
(
"0"
).
append
(
builder
);
}
return
builder
.
toString
().
toUpperCase
();
}
public
static
Color
toColorFromString
(
String
colorStr
){
colorStr
=
colorStr
.
substring
(
2
);
Color
color
=
new
Color
(
Integer
.
parseInt
(
colorStr
,
16
))
;
return
color
;
}
private
static
BufferedImage
subPicByWhite
(
BufferedImage
picImage
){
return
picImage
.
getSubimage
(
9
,
9
,
699
,
300
);
}
public
static
String
getQrCover
(
String
bookPic
,
boolean
isDefault
){
String
resultPath
=
""
;
try
{
Color
color
=
null
;
try
{
color
=
getImagePixel
(
bookPic
);
}
catch
(
Exception
e
){
color
=
Color
.
gray
;
}
String
lightIcon
=
"https://oss.5rs.me/oss/uploadfe/png/12dcbc38528d926912c444765d786a9a.png"
;
String
deepIcon
=
"https://oss.5rs.me/oss/uploadfe/png/60612a7415bdac8533568ae0c21a94b6.png"
;
String
icon
;
if
(
color
!=
null
&&
(
color
.
getRed
()<
180
||
color
.
getBlue
()<
180
||
color
.
getGreen
()<
180
)){
icon
=
lightIcon
;
}
else
{
icon
=
deepIcon
;
}
String
html
=
"<div style = \"position: relative;width: 700px;height: 300px;border: 0px solid green;background-color: #fcfcfc;text-align: center;\"> <div style = \"position: absolute;width: 100%;height: 66%;background-color: rgb("
+
color
.
getRed
()+
","
+
color
.
getGreen
()+
","
+
color
.
getBlue
()+
");overflow: hidden;\"> <div style = \"position: absolute;top: 20px;right: -20px;background-image: url('"
+
icon
+
"');background-size: 100%;width: 219px;height: 149px;\"> </div> </div><div style=\"position: relative;display: inline-block;width: 158px;height: 225px;box-shadow: 0px 4px 14px 2px rgba(14, 47, 70, 0.2);border-radius: 4px;border: solid 1px #ddd; margin-top: 35px;background: url('"
+
bookPic
+
"') no-repeat;background-size: cover;background-position: center;\"></div></div>"
;
Map
<
String
,
String
>
header
=
new
HashMap
<>();
header
.
put
(
"Content-Type"
,
"application/json"
);
Map
<
String
,
String
>
param
=
new
HashMap
<>();
param
.
put
(
"htmlCode"
,
html
);
String
postResult
=
HttpKit
.
post
(
"http://192.168.1.7:8216/transcode/htm2img/jpg"
,
JSON
.
toJSONString
(
param
));
Map
map
=
JSONUtils
.
jsonToMap
(
postResult
,
String
.
class
,
String
.
class
);
String
pic
=
(
String
)
map
.
get
(
"data"
);
BufferedImage
bookPicImage
=
ImageIO
.
read
(
new
URL
(
pic
));
BufferedImage
bufferedImage
=
subPicByWhite
(
bookPicImage
);
ByteArrayOutputStream
os
=
new
ByteArrayOutputStream
();
ImageIO
.
write
(
bufferedImage
,
ImageTypeEnum
.
JPG
.
value
,
os
);
UploadResultInfo
uploadResultInfo
=
OssUtils
.
uploadFileByte
(
os
.
toByteArray
(),
UUIDUitl
.
taskName
(),
ImageTypeEnum
.
JPG
.
value
);
os
.
close
();
resultPath
=
uploadResultInfo
==
null
?
null
:
uploadResultInfo
.
getUrl
();
}
catch
(
Exception
e
)
{
LOGGER
.
error
(
"生成合成图失败,url="
+
bookPic
+
"====="
+
e
.
getMessage
(),
e
);
}
return
resultPath
;
}
public
static
void
main
(
String
[]
args
)
{
// String bookPic = "https://file.5rs.me/oss/upload/image/jpg/c2c7f0b85f9f4eb683cd86a2945bc5e5.jpg";
String
bookPic
=
"https://oss.5rs.me/oss/uploadfe/jpg/e88c2f608fe4365f5c0efd7dda0eb59e.jpg"
;
Color
color
;
if
(
bookPic
.
contains
(
"/oss/"
)){
String
s
=
SimpleHttpUtils
.
httpGet
(
bookPic
+
"?x-oss-process=image/average-hue"
,
null
);
System
.
out
.
println
(
s
);
Map
map
=
JSONUtils
.
jsonToMap
(
s
,
String
.
class
,
String
.
class
);
String
rgb
=
(
String
)
map
.
get
(
"RGB"
);
color
=
toColorFromString
(
rgb
);
}
else
{
color
=
getImagePixel
(
bookPic
);
}
String
lightIcon
=
"https://oss.5rs.me/oss/uploadfe/png/12dcbc38528d926912c444765d786a9a.png"
;
String
deepIcon
=
"https://oss.5rs.me/oss/uploadfe/png/60612a7415bdac8533568ae0c21a94b6.png"
;
String
icon
;
if
(
color
!=
null
&&
(
color
.
getRed
()<
180
||
color
.
getBlue
()<
180
||
color
.
getGreen
()<
180
)){
icon
=
lightIcon
;
}
else
{
icon
=
deepIcon
;
}
String
html
=
"<div style = \"position: relative;width: 700px;height: 300px;border: 0px solid green;background-color: #fcfcfc;text-align: center;\"> <div style = \"position: absolute;width: 100%;height: 66%;background-color: rgb("
+
color
.
getRed
()+
","
+
color
.
getGreen
()+
","
+
color
.
getBlue
()+
");overflow: hidden;\"> <div style = \"position: absolute;top: 20px;right: -20px;background-image: url('"
+
icon
+
"');background-size: 100%;width: 219px;height: 149px;\"> </div> </div><div style=\"position: relative;display: inline-block;width: 158px;height: 225px;box-shadow: 0px 4px 14px 2px rgba(14, 47, 70, 0.2);border-radius: 4px;border: solid 1px #ddd; margin-top: 35px;background: url('"
+
bookPic
+
"') no-repeat;background-size: cover;background-position: center;\"></div></div>"
;
Map
<
String
,
String
>
header
=
new
HashMap
<>();
header
.
put
(
"Content-Type"
,
"application/json"
);
Map
<
String
,
String
>
param
=
new
HashMap
<>();
param
.
put
(
"htmlCode"
,
html
);
String
postResult
=
HttpKit
.
post
(
"http://192.168.92.111:8214/transcode/htm2img/jpg"
,
JSON
.
toJSONString
(
param
));
// String s = SimpleHttpUtils.httpRequest("http://localhost:8214/transcode/htm2img/jpg", param,"POST","utf-8",header);
Map
map
=
JSONUtils
.
jsonToMap
(
postResult
,
String
.
class
,
String
.
class
);
String
pic
=
(
String
)
map
.
get
(
"data"
);
System
.
out
.
println
(
pic
);
try
{
BufferedImage
bookPicImage
=
ImageIO
.
read
(
new
URL
(
pic
));
BufferedImage
bufferedImage
=
subPicByWhite
(
bookPicImage
);
OutputStream
os
=
new
FileOutputStream
(
"C:\\Users\\LiHao\\Desktop\\封面图\\result.jpg"
);
ImageIO
.
write
(
bufferedImage
,
ImageTypeEnum
.
JPG
.
value
,
os
);
os
.
close
();
}
catch
(
IOException
e
)
{
e
.
printStackTrace
();
}
// String bookPic = "C:\\Users\\LiHao\\Desktop\\封面图\\aa.jpg";
// String playPic = "C:\\Users\\LiHao\\Desktop\\封面图\\播放按钮.png";
// String defaultBackgroundPic = "C:\\Users\\LiHao\\Desktop\\封面图\\默认图背景.png";
// String resultPath = "C:\\Users\\LiHao\\Desktop\\封面图\\result.jpg";
// Boolean isDefalut = false;
// try {
// //取书封面和播放按钮图
// BufferedImage bookPicImage;
// BufferedImage playPicImage;
// BufferedImage defaultBackgroudImage;
// if(bookPic.contains("https:")){
// bookPicImage = ImageIO.read(new URL(bookPic));
// playPicImage = ImageIO.read(new URL(playPic));
// defaultBackgroudImage = ImageIO.read(new URL(defaultBackgroundPic));
// }else{
// bookPicImage = ImageIO.read(new File(bookPic));
// playPicImage = ImageIO.read(new File(playPic));
// defaultBackgroudImage = ImageIO.read(new File(defaultBackgroundPic));
// }
//
// //画一个空的背景
// BufferedImage bg = new BufferedImage(702, 299, BufferedImage.TYPE_3BYTE_BGR);
// Graphics2D g = bg.createGraphics();
// //获取主题色
// Color c = getImagePixel(bookPic);
//
//
// //画纯色的背景或者默认背景图
// g.setColor(c);
// if(isDefalut){
// g.drawImage(defaultBackgroudImage.getScaledInstance(702,196, Image.SCALE_DEFAULT), 0, 0, null);
// }else {
// g.fillRect(0, 0, 702, 196);
// }
// g.setColor(new Color(252, 252, 252));
// g.fillRect(0, 196, 702, 102);
//
// g.setColor(new Color(221, 221, 221));
// //插入书籍图和播放按钮
// g.drawImage(bookPicImage.getScaledInstance(172,238, Image.SCALE_DEFAULT), 265, 30, null);
// g.drawImage(playPicImage.getScaledInstance(80,80, Image.SCALE_DEFAULT), 306, 105, null);
// g.drawRect(265,30,172,238);
//
// for(int i=0;i<3;i++){
//
// }
//
// //保存图片
// if(bookPic.contains("https:")) {
// ByteArrayOutputStream os = new ByteArrayOutputStream();
// ImageIO.write(bg, ImageTypeEnum.JPG.value, os);
// UploadResultInfo uploadResultInfo = OssUtils.uploadFileByte(os.toByteArray(), UUIDUitl.taskName(), ImageTypeEnum.JPG.value);
// os.close();
// s = uploadResultInfo == null ? null : uploadResultInfo.getUrl();
// }else{
// OutputStream os = new FileOutputStream(resultPath);
// ImageIO.write(bg, ImageTypeEnum.JPG.value, os);
// os.close();
// }
// System.out.println(s);
// } catch (Exception e) {
// System.out.println(e.getMessage());
// }
}
}
pcloud-common/src/main/java/com/pcloud/common/utils/aliyun/OssUtils.java
View file @
d5f7ebc4
...
...
@@ -40,7 +40,7 @@ import com.aliyuncs.mts.model.v20140618.SubmitSnapshotJobRequest;
import
com.aliyuncs.mts.model.v20140618.SubmitSnapshotJobResponse.SnapshotJob
;
import
com.aliyuncs.profile.DefaultProfile
;
import
com.pcloud.common.constant.AliyunConstant
;
import
com.pcloud.common.constant.FilePathConst
;
import
com.pcloud.common.constant.FilePathConst
ant
;
import
com.pcloud.common.constant.UrlConstant
;
import
com.pcloud.common.dto.OssImageCropDTO
;
import
com.pcloud.common.dto.OssImageDTO
;
...
...
@@ -1600,7 +1600,7 @@ public class OssUtils {
// 创建OSSClient实例
OSSClient
ossClient
=
getOSSClient
(
bucketName
);
// 生成新的图片地址
String
localPath
=
FilePathConst
.
IMAGE_PATH
+
UUIDUitl
.
generateString
(
32
)
+
"."
+
fileType
;
String
localPath
=
FilePathConst
ant
.
IMAGE
+
UUIDUitl
.
generateString
(
32
)
+
"."
+
fileType
;
FileUtils
.
creatFiles
(
localPath
);
try
{
ossClient
.
getObject
(
request
,
new
File
(
localPath
));
...
...
@@ -1720,7 +1720,7 @@ public class OssUtils {
// 创建OSSClient实例
OSSClient
ossClient
=
getOSSClient
(
bucketName
);
// 生成带水印的本地图片地址
String
localPath
=
FilePathConst
.
IMAGE_WATERMARK_PATH
+
fileName
+
"_"
+
LocalDateUtils
.
getYmdhmss
()
+
"."
String
localPath
=
FilePathConst
ant
.
IMAGE_WATERMARK
+
fileName
+
"_"
+
LocalDateUtils
.
getYmdhmss
()
+
"."
+
fileType
;
FileUtils
.
creatFiles
(
localPath
);
ossClient
.
getObject
(
request
,
new
File
(
localPath
));
...
...
pcloud-common/src/main/java/com/pcloud/common/utils/httpclient/UrlUtils.java
View file @
d5f7ebc4
...
...
@@ -14,7 +14,6 @@ import org.apache.http.util.EntityUtils;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
com.alibaba.fastjson.JSONArray
;
import
com.alibaba.fastjson.JSONObject
;
import
com.pcloud.common.utils.rsa.MD5
;
import
com.pcloud.common.utils.string.StringUtil
;
...
...
@@ -25,17 +24,9 @@ import com.pcloud.common.utils.string.StringUtil;
*/
public
class
UrlUtils
{
/**
*
*/
private
static
final
Logger
LOGGER
=
LoggerFactory
.
getLogger
(
UrlUtils
.
class
);
/**
* 请求地址(新郎接口)
*/
private
static
final
String
REQUEST_URL
=
"https://api.weibo.com/2/short_url/shorten.json?source=1681459862&url_long="
;
/**
* 请求地址(OWN)
*/
private
static
final
String
REQUEST_URL2
=
"https://rays.5rs.me/convert/v1.0/url/shorten"
;
...
...
@@ -51,20 +42,13 @@ public class UrlUtils {
public
static
final
String
PRIVATE_KEY
=
"lgsc1205"
;
/**
* 获取短链接
(新浪)
* 获取短链接
*
* @param long_url
* @return
*/
public
static
String
getShortUrl
(
String
long_url
)
{
String
result
=
callHttp
(
REQUEST_URL
+
long_url
);
if
(
StringUtil
.
isEmpty
(
result
))
{
return
null
;
}
JSONObject
resultObject
=
JSONObject
.
parseObject
(
result
);
JSONArray
array
=
resultObject
.
getJSONArray
(
"urls"
);
JSONObject
object
=
array
.
getJSONObject
(
0
);
return
object
.
getString
(
"url_short"
);
return
getShortUrl4Own
(
long_url
);
}
/**
...
...
pcloud-common/src/main/java/com/pcloud/common/utils/pdf/PdfUtils.java
View file @
d5f7ebc4
...
...
@@ -29,7 +29,7 @@ import com.itextpdf.text.pdf.PdfPTable;
import
com.itextpdf.text.pdf.PdfReader
;
import
com.itextpdf.text.pdf.PdfStamper
;
import
com.itextpdf.text.pdf.PdfWriter
;
import
com.pcloud.common.constant.FilePathConst
;
import
com.pcloud.common.constant.FilePathConst
ant
;
import
com.pcloud.common.entity.UploadResultInfo
;
import
com.pcloud.common.exceptions.BizException
;
import
com.pcloud.common.exceptions.FileException
;
...
...
@@ -105,7 +105,7 @@ public class PdfUtils {
*/
private
static
String
pdfConvert
(
byte
[]
b
,
String
fileName
,
String
prefix
,
String
format
)
throws
FileException
{
// 解析PDF文件
String
outPath
=
FilePathConst
.
PDF_PATH
+
fileName
+
"_"
+
UUIDUitl
.
generateString
(
12
);
String
outPath
=
FilePathConst
ant
.
PDF
+
fileName
+
"_"
+
UUIDUitl
.
generateString
(
12
);
File
fi
=
new
File
(
outPath
);
if
(!
fi
.
exists
())
{
fi
.
mkdirs
();
...
...
@@ -161,7 +161,7 @@ public class PdfUtils {
/**
* 创建PDF
*
* @param pdf
ChunkD
Os
* @param pdf
P
Os
* @return
* @throws Exception
*/
...
...
@@ -176,7 +176,7 @@ public class PdfUtils {
OutputStream
os
=
null
;
try
{
// 输出路径
outPath
=
FilePathConst
.
PDF_PATH
+
UUIDUitl
.
taskName
()
+
".pdf"
;
outPath
=
FilePathConst
ant
.
PDF
+
UUIDUitl
.
taskName
()
+
".pdf"
;
FileUtils
.
creatFiles
(
outPath
);
// 创建输出流
os
=
new
FileOutputStream
(
new
File
(
outPath
));
...
...
@@ -358,10 +358,8 @@ public class PdfUtils {
/**
* 加水印(字符串)
*
* @param
inputFile
* @param
filePath
* 需要加水印的PDF路径
* @param outputFile
* 输出生成PDF的路径
* @param waterMarkName
* 水印字符
*/
...
...
pcloud-common/src/main/java/com/pcloud/common/utils/string/StringUtil.java
View file @
d5f7ebc4
...
...
@@ -590,5 +590,20 @@ public class StringUtil extends StringUtilParent {
}
return
false
;
}
/**
* 过滤HTML标签
*
* @param str
* @return
*/
public
static
String
replaceHtml
(
String
str
)
{
if
(
StringUtil
.
isEmpty
(
str
))
{
return
""
;
}
Pattern
p_html
=
Pattern
.
compile
(
"<[^>]+>"
,
Pattern
.
CASE_INSENSITIVE
);
Matcher
m_html
=
p_html
.
matcher
(
str
);
return
m_html
.
replaceAll
(
""
).
replaceAll
(
" "
,
""
);
}
}
pcloud-common/src/main/java/com/pcloud/common/utils/word/WordNewUtils.java
View file @
d5f7ebc4
package
com
.
pcloud
.
common
.
utils
.
word
;
import
java.io.ByteArrayInputStream
;
import
java.io.FileOutputStream
;
import
java.io.InputStream
;
import
java.io.OutputStream
;
import
java.math.BigInteger
;
import
java.util.List
;
import
org.apache.poi.POIXMLDocument
;
import
org.apache.poi.openxml4j.exceptions.InvalidFormatException
;
import
org.apache.poi.openxml4j.opc.OPCPackage
;
import
org.apache.poi.util.Units
;
import
org.apache.poi.wp.usermodel.HeaderFooterType
;
import
org.apache.poi.xwpf.usermodel.XWPFDocument
;
import
org.apache.poi.xwpf.usermodel.XWPFFooter
;
import
org.apache.poi.xwpf.usermodel.XWPFHeader
;
import
org.apache.poi.xwpf.usermodel.XWPFParagraph
;
import
org.apache.poi.xwpf.usermodel.XWPFPicture
;
import
org.apache.poi.xwpf.usermodel.XWPFPictureData
;
import
org.apache.poi.xwpf.usermodel.XWPFRun
;
import
org.apache.poi.xwpf.usermodel.XWPFTable
;
import
org.apache.poi.xwpf.usermodel.XWPFTableCell
;
import
org.apache.poi.xwpf.usermodel.XWPFTableRow
;
import
org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblWidth
;
import
org.openxmlformats.schemas.wordprocessingml.x2006.main.STTblWidth
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
com.pcloud.common.constant.FilePathConst
;
import
com.pcloud.common.constant.WordConstant
;
import
com.pcloud.common.exceptions.BizException
;
import
com.pcloud.common.exceptions.FileException
;
import
com.pcloud.common.utils.FileUtils
;
import
com.pcloud.common.utils.ListUtils
;
import
com.pcloud.common.utils.UUIDUitl
;
import
com.pcloud.common.utils.string.StringUtil
;
import
com.pcloud.common.utils.word.dto.ParagraphDTO
;
import
com.pcloud.common.utils.word.dto.RunDTO
;
import
com.pcloud.common.utils.word.dto.RunImageDTO
;
import
com.pcloud.common.utils.word.dto.RunTableDTO
;
import
com.pcloud.common.utils.word.dto.RunTextDTO
;
import
com.pcloud.common.utils.word.dto.WordDTO
;
import
com.pcloud.common.utils.word.enums.ParagraphType
;
/**
* 重新定义word工具类
*
* @author:songx
* @date:2019/5/27,10:06
*/
public
class
WordNewUtils
{
private
static
final
Logger
LOGGER
=
LoggerFactory
.
getLogger
(
WordNewUtils
.
class
);
// public static void main(String[] args) {
// List<ParagraphDTO> paragraphDTOS = new ArrayList<>();
// // 页眉
// paragraphDTOS.add(getHeader1());
// paragraphDTOS.add(getHeader2());
// // 标题
// paragraphDTOS.add(getParagraph1());
// // 内容
// paragraphDTOS.add(getParagraph2());
// paragraphDTOS.add(getParagraph3());
// paragraphDTOS.add(getParagraph4());
// paragraphDTOS.add(getParagraph4());
// // 页脚
// paragraphDTOS.add(getFooter1());
// try {
// System.out.println(create(paragraphDTOS));
// } catch (Exception e) {
// LOGGER.error(e.getMessage(), e);
// }
// System.out.println("Game over!");
// }
//
// private static ParagraphDTO getHeader1() {
// RunTextDTO runTextDTO = RunTextDTO
// .newText("?????的个人专属错题本 共40道错题", 9, "微软雅黑");
// return ParagraphDTO.newHeader(ParagraphType.text, runTextDTO);
// }
//
// private static ParagraphDTO getHeader2() {
// RunTextDTO runTextDTO = RunTextDTO
// .newText("来源《书名书名书名书名书名书名书名书书名书名书名书书名书名书名书》", 9, "微软雅黑");
// return ParagraphDTO.newHeader(ParagraphType.text, runTextDTO);
// }
//
// private static ParagraphDTO getParagraph1() {
// RunTextDTO runTextDTO = RunTextDTO
// .newText("个人专属错题本", 18, "微软雅黑", true);
// return ParagraphDTO.newParagraph(ParagraphType.text, ParagraphAlignment.CENTER, runTextDTO, 1);
// }
//
// private static ParagraphDTO getParagraph2() {
// RunTextDTO runTextDTO = RunTextDTO
// .newText("完成下面错题练习,扫描二维码核对答案,并记录练习结果:", 11, "微软雅黑", true);
// return ParagraphDTO.newParagraph(ParagraphType.text, runTextDTO, 1);
// }
//
// private static ParagraphDTO getParagraph3() {
// RunImageDTO runImageDTO = RunImageDTO
// .newImage("I:\\TEST\\image\\02.jpg", 80, 80, null, listAfterTexts3(11, "微软雅黑"));
// return ParagraphDTO.newParagraph(ParagraphType.image, TextAlignment.TOP, runImageDTO, 1);
// }
//
// private static ParagraphDTO getParagraph4() {
// RunImageDTO runImageDTO = RunImageDTO
// .newImage("I:\\TEST\\image\\2.jpg", 200, 500);
// return ParagraphDTO.newParagraph(ParagraphType.image, runImageDTO, 3);
// }
//
// private static ParagraphDTO getFooter1() {
// RunTextDTO runTextDTO = RunTextDTO.newText("反复练习,攻克错题", 11, "微软雅黑");
// return ParagraphDTO.newFooter(ParagraphType.text, ParagraphAlignment.CENTER, runTextDTO);
// }
//
// /**
// * 组装图片后面的文字
// *
// * @param fontSize
// * @param fontFamily
// * @return
// */
// private static List<RunTextDTO> listAfterTexts3(int fontSize, String fontFamily) {
// List<RunTextDTO> afterRuns = Lists.newArrayList();
// afterRuns.add(RunTextDTO.newText(" 答对", fontSize, fontFamily));
// afterRuns.add(RunTextDTO.newText(" 10 ", fontSize, fontFamily, UnderlinePatterns.SINGLE));
// afterRuns.add(RunTextDTO.newText("道题,答错", fontSize, fontFamily));
// afterRuns.add(RunTextDTO.newText(" 11 ", fontSize, fontFamily, UnderlinePatterns.SINGLE));
// afterRuns.add(RunTextDTO.newText("道题,日期", fontSize, fontFamily));
// afterRuns.add(RunTextDTO.newText(" " + LocalDateUtils.getDateNow() + " ", fontSize, fontFamily,
// UnderlinePatterns.SINGLE));
// return afterRuns;
// }
/**
* 创建WORD
*
* @param wordDTO
* @return
* @throws Exception
*/
public
static
String
create
(
WordDTO
wordDTO
)
throws
FileException
{
LOGGER
.
info
(
"【WORD】创建WORD文档,<START>"
);
if
(
wordDTO
==
null
||
ListUtils
.
isEmpty
(
wordDTO
.
getParagraphs
()))
{
return
null
;
}
String
wordTemplate
=
null
;
String
outPath
=
null
;
CustomXWPFDocument
document
=
null
;
FileOutputStream
fos
=
null
;
try
{
wordTemplate
=
FilePathConst
.
WORD_PATH
+
UUIDUitl
.
taskName
()
+
".docx"
;
FileUtils
.
downloadFileFromUrl
(
WordConstant
.
TEMPLATE_URL
,
wordTemplate
);
OPCPackage
pack
=
POIXMLDocument
.
openPackage
(
wordTemplate
);
document
=
new
CustomXWPFDocument
(
pack
);
// 添加内容到文档中
addParagraphs
(
wordDTO
,
document
);
// 生成目标word
outPath
=
FilePathConst
.
WORD_PATH
+
UUIDUitl
.
taskName
()
+
".docx"
;
fos
=
new
FileOutputStream
(
outPath
);
document
.
write
(
fos
);
fos
.
flush
();
}
catch
(
Exception
e
)
{
LOGGER
.
error
(
"【WORD】创建WORD文档失败:"
+
e
.
getMessage
(),
e
);
throw
new
FileException
(
FileException
.
FILE_CONTENT_ERROR
,
e
.
getMessage
());
}
finally
{
close
(
document
,
fos
);
FileUtils
.
deleteFile
(
wordTemplate
);
}
LOGGER
.
info
(
"【WORD】创建WORD文档,<END>.[outPath]="
+
outPath
);
return
outPath
;
}
/**
* 添加内容到WORD中
*
* @param wordDTO
* @param document
* @throws BizException
*/
private
static
void
addParagraphs
(
WordDTO
wordDTO
,
CustomXWPFDocument
document
)
{
List
<
ParagraphDTO
>
paragraphDTOS
=
wordDTO
.
getParagraphs
();
for
(
ParagraphDTO
paragraphDTO
:
paragraphDTOS
)
{
ParagraphType
paragraphType
=
paragraphDTO
.
getParagraphType
();
if
(
ParagraphType
.
table
.
equals
(
paragraphType
))
{
addTable
(
paragraphDTO
,
document
);
}
else
if
(
ParagraphType
.
image
.
equals
(
paragraphType
))
{
addImage
(
wordDTO
,
paragraphDTO
,
document
);
}
else
if
(
ParagraphType
.
text
.
equals
(
paragraphType
))
{
addText
(
wordDTO
,
paragraphDTO
,
document
);
}
}
}
/**
* 获取段落
*
* @param paragraphDTO
* @param document
* @return
*/
private
static
XWPFParagraph
getParagraph
(
ParagraphDTO
paragraphDTO
,
CustomXWPFDocument
document
)
{
if
(
paragraphDTO
.
isHeader
())
{
XWPFHeader
xwpfHeader
=
document
.
createHeader
(
HeaderFooterType
.
DEFAULT
);
return
xwpfHeader
.
createParagraph
();
}
else
if
(
paragraphDTO
.
isFooter
())
{
XWPFFooter
xwpfFooter
=
document
.
createFooter
(
HeaderFooterType
.
DEFAULT
);
return
xwpfFooter
.
createParagraph
();
}
else
{
return
document
.
createParagraph
();
}
}
/**
* 添加文本块
*
* @param wordDTO
* @param paragraphDTO
* @throws BizException
*/
private
static
void
addText
(
WordDTO
wordDTO
,
ParagraphDTO
paragraphDTO
,
CustomXWPFDocument
document
)
throws
BizException
{
XWPFParagraph
paragraph
=
getParagraph
(
paragraphDTO
,
document
);
// 设置段落样式
setParagraphStyle
(
paragraphDTO
,
paragraph
);
// 设置段落块样式
if
(
paragraphDTO
.
getRun
()
!=
null
)
{
setTextStyle
(
wordDTO
,
(
RunTextDTO
)
paragraphDTO
.
getRun
(),
paragraph
);
}
else
if
(!
ListUtils
.
isEmpty
(
paragraphDTO
.
getRuns
()))
{
for
(
RunDTO
runDTO
:
paragraphDTO
.
getRuns
())
{
setTextStyle
(
wordDTO
,
(
RunTextDTO
)
runDTO
,
paragraph
);
}
}
// 添加空行
addEmptyText
(
paragraphDTO
.
getAfterEmpty
(),
document
);
}
/**
* 添加空行
*
* @param afterEmpty
* @param document
* @throws BizException
*/
private
static
void
addEmptyText
(
int
afterEmpty
,
CustomXWPFDocument
document
)
throws
BizException
{
for
(
int
i
=
0
;
i
<
afterEmpty
;
i
++)
{
setTextStyle
(
null
,
RunTextDTO
.
newEmpty
(),
document
.
createParagraph
());
}
}
/**
* 设置段落样式
*
* @param paragraphDTO
* @param paragraph
*/
private
static
void
setParagraphStyle
(
ParagraphDTO
paragraphDTO
,
XWPFParagraph
paragraph
)
{
// 与前一行的间距
if
(
paragraphDTO
.
getSpacingBefore
()
>
0
)
{
paragraph
.
setSpacingBeforeLines
(
paragraphDTO
.
getSpacingBefore
());
}
// 与下一行的间距
if
(
paragraphDTO
.
getSpacingAfter
()
>
0
)
{
paragraph
.
setSpacingAfterLines
(
paragraphDTO
.
getSpacingAfter
());
}
// 对齐
if
(
paragraphDTO
.
getParagraphAlignment
()
!=
null
)
{
paragraph
.
setFontAlignment
(
paragraphDTO
.
getParagraphAlignment
().
getValue
());
}
// 水平居中
if
(
paragraphDTO
.
getTextAlignment
()
!=
null
)
{
paragraph
.
setVerticalAlignment
(
paragraphDTO
.
getTextAlignment
());
}
}
/**
* 设置文本样式
*
* @param wordDTO
* @param runTextDTO
* @param paragraph
*/
private
static
void
setTextStyle
(
WordDTO
wordDTO
,
RunTextDTO
runTextDTO
,
XWPFParagraph
paragraph
)
{
XWPFRun
xwpfRun
=
paragraph
.
createRun
();
xwpfRun
.
setText
(
runTextDTO
.
getText
());
// 是否加粗
xwpfRun
.
setBold
(
runTextDTO
.
isBold
());
// 字体大小
if
(
runTextDTO
.
getFontSize
()
>
0
)
{
xwpfRun
.
setFontSize
(
runTextDTO
.
getFontSize
());
}
else
if
(
wordDTO
!=
null
&&
wordDTO
.
getFontSize
()
>
0
)
{
xwpfRun
.
setFontSize
(
wordDTO
.
getFontSize
());
}
// 字体
if
(
runTextDTO
.
getFontFamily
()
!=
null
)
{
xwpfRun
.
setFontFamily
(
runTextDTO
.
getFontFamily
());
}
else
if
(
wordDTO
!=
null
&&
wordDTO
.
getFontFamily
()
!=
null
)
{
xwpfRun
.
setFontFamily
(
wordDTO
.
getFontFamily
());
}
// 下划线
if
(
runTextDTO
.
getUnderlinePatterns
()
!=
null
)
{
xwpfRun
.
setUnderline
(
runTextDTO
.
getUnderlinePatterns
());
}
}
/**
* 添加表格
*
* @param paragraphDTO
* @throws BizException
*/
private
static
void
addTable
(
ParagraphDTO
paragraphDTO
,
CustomXWPFDocument
document
)
throws
BizException
{
XWPFParagraph
paragraph
=
document
.
createParagraph
();
// 设置段落样式
setParagraphStyle
(
paragraphDTO
,
paragraph
);
// 创建表格
if
(
paragraphDTO
.
getRun
()
!=
null
)
{
createTable
((
RunTableDTO
)
paragraphDTO
.
getRun
(),
document
);
}
else
if
(!
ListUtils
.
isEmpty
(
paragraphDTO
.
getRuns
()))
{
for
(
RunDTO
runDTO
:
paragraphDTO
.
getRuns
())
{
createTable
((
RunTableDTO
)
runDTO
,
document
);
}
}
// 添加空行
addEmptyText
(
paragraphDTO
.
getAfterEmpty
(),
document
);
}
/**
* 创建表格
*
* @param runTableDTO
* @param document
*/
private
static
void
createTable
(
RunTableDTO
runTableDTO
,
CustomXWPFDocument
document
)
{
String
[][]
contents
=
runTableDTO
.
getContents
();
if
(
contents
==
null
||
contents
.
length
<
1
)
{
return
;
}
int
rowNum
=
contents
.
length
;
// 总行数
int
colNum
=
runTableDTO
.
getColumnWidths
().
length
;
// 总列数
if
(
colNum
<
1
)
{
throw
new
FileException
(
FileException
.
FILE_CONTENT_ERROR
,
"表格列数与内容列数不一致"
);
}
// 创建表格
XWPFTable
ComTable
=
document
.
createTable
();
// 列宽自动分割
CTTblWidth
comTableWidth
=
ComTable
.
getCTTbl
().
addNewTblPr
().
addNewTblW
();
comTableWidth
.
setType
(
STTblWidth
.
DXA
);
comTableWidth
.
setW
(
BigInteger
.
valueOf
(
9072
));
// 设置行和列
for
(
int
i
=
0
;
i
<
rowNum
;
i
++)
{
String
[]
cols
=
contents
[
i
];
// 创建行
XWPFTableRow
comTableRow
=
i
==
0
?
ComTable
.
getRow
(
0
)
:
ComTable
.
createRow
();
for
(
int
j
=
0
;
j
<
colNum
;
j
++)
{
String
text
=
(
j
>=
cols
.
length
||
StringUtil
.
isEmpty
(
cols
[
j
]))
?
""
:
cols
[
j
];
// 填充单元格内容
XWPFTableCell
cell
=
null
;
if
(
i
==
0
)
{
cell
=
j
==
0
?
comTableRow
.
getCell
(
0
)
:
comTableRow
.
addNewTableCell
();
}
else
{
cell
=
comTableRow
.
getCell
(
j
);
}
cell
.
setText
(
text
);
cell
.
setVerticalAlignment
(
runTableDTO
.
getVertAlign
());
}
// 行高
if
(
runTableDTO
.
getHeight
()
>
0
)
{
comTableRow
.
setHeight
(
runTableDTO
.
getHeight
());
}
}
}
/**
* 添加图片和文本
*
* @param paragraphDTO
* @param document
*/
private
static
void
addImage
(
WordDTO
wordDTO
,
ParagraphDTO
paragraphDTO
,
CustomXWPFDocument
document
)
{
XWPFParagraph
paragraph
=
null
;
if
(
paragraphDTO
.
isHeader
())
{
XWPFHeader
header
=
document
.
createHeader
(
HeaderFooterType
.
DEFAULT
);
paragraph
=
header
.
createParagraph
();
addImageHeader
(
wordDTO
,
paragraphDTO
,
paragraph
,
header
);
}
else
{
paragraph
=
document
.
createParagraph
();
addImageContent
(
wordDTO
,
paragraphDTO
,
paragraph
,
document
);
}
// 设置段落样式
setParagraphStyle
(
paragraphDTO
,
paragraph
);
// 添加空行
addEmptyText
(
paragraphDTO
.
getAfterEmpty
(),
document
);
}
/**
* 页眉中插入图片
*
* @param wordDTO
* @param paragraphDTO
* @param paragraph
* @param header
*/
private
static
void
addImageHeader
(
WordDTO
wordDTO
,
ParagraphDTO
paragraphDTO
,
XWPFParagraph
paragraph
,
XWPFHeader
header
)
{
// 创建图片
if
(
paragraphDTO
.
getRun
()
!=
null
)
{
createImageHeader
(
wordDTO
,
(
RunImageDTO
)
paragraphDTO
.
getRun
(),
paragraph
,
header
);
}
else
if
(!
ListUtils
.
isEmpty
(
paragraphDTO
.
getRuns
()))
{
for
(
RunDTO
runDTO
:
paragraphDTO
.
getRuns
())
{
createImageHeader
(
wordDTO
,
(
RunImageDTO
)
runDTO
,
paragraph
,
header
);
}
}
}
/**
* 内容中插入图片
*
* @param wordDTO
* @param paragraphDTO
* @param paragraph
* @param document
*/
private
static
void
addImageContent
(
WordDTO
wordDTO
,
ParagraphDTO
paragraphDTO
,
XWPFParagraph
paragraph
,
CustomXWPFDocument
document
)
{
// 创建图片
if
(
paragraphDTO
.
getRun
()
!=
null
)
{
createImageContent
(
wordDTO
,
(
RunImageDTO
)
paragraphDTO
.
getRun
(),
paragraph
,
document
);
}
else
if
(!
ListUtils
.
isEmpty
(
paragraphDTO
.
getRuns
()))
{
for
(
RunDTO
runDTO
:
paragraphDTO
.
getRuns
())
{
createImageContent
(
wordDTO
,
(
RunImageDTO
)
runDTO
,
paragraph
,
document
);
}
}
}
/**
* 创建图片和文本
*
* @param wordDTO
* @param runImageDTO
* @param paragraph
* @param document
*/
private
static
void
createImageContent
(
WordDTO
wordDTO
,
RunImageDTO
runImageDTO
,
XWPFParagraph
paragraph
,
CustomXWPFDocument
document
)
{
// 前置文本
addImageBefore
(
wordDTO
,
runImageDTO
,
paragraph
);
try
{
// 图片
String
relationId
=
addPictureContent
(
runImageDTO
,
document
);
if
(!
StringUtil
.
isEmpty
(
relationId
))
{
int
id
=
document
.
getAllPictures
().
size
()
-
1
;
document
.
createPicture
(
paragraph
,
relationId
,
id
,
runImageDTO
.
getWidth
(),
runImageDTO
.
getHeight
());
}
}
catch
(
Exception
e
)
{
LOGGER
.
error
(
"【WORD】创建WORD文档失败:"
+
e
.
getMessage
(),
e
);
}
// 后置文本
addImageAfter
(
wordDTO
,
runImageDTO
,
paragraph
);
}
/**
* 创建图片
*
* @param wordDTO
* @param runImageDTO
* @param paragraph
* @param header
*/
private
static
void
createImageHeader
(
WordDTO
wordDTO
,
RunImageDTO
runImageDTO
,
XWPFParagraph
paragraph
,
XWPFHeader
header
)
{
// 前置文本
addImageBefore
(
wordDTO
,
runImageDTO
,
paragraph
);
// 图片
addPictureHeader
(
runImageDTO
,
paragraph
,
header
);
// 后置文本
addImageAfter
(
wordDTO
,
runImageDTO
,
paragraph
);
}
/**
* 图片前置文本
*
* @param wordDTO
* @param runImageDTO
* @param paragraph
*/
private
static
void
addImageBefore
(
WordDTO
wordDTO
,
RunImageDTO
runImageDTO
,
XWPFParagraph
paragraph
)
{
List
<
RunTextDTO
>
beforeTexts
=
runImageDTO
.
getBeforeTexts
();
if
(!
ListUtils
.
isEmpty
(
beforeTexts
))
{
for
(
RunTextDTO
runTextDTO
:
beforeTexts
)
{
setTextStyle
(
wordDTO
,
runTextDTO
,
paragraph
);
}
}
}
/**
* 图片后置文本
*
* @param wordDTO
* @param runImageDTO
* @param paragraph
*/
private
static
void
addImageAfter
(
WordDTO
wordDTO
,
RunImageDTO
runImageDTO
,
XWPFParagraph
paragraph
)
{
List
<
RunTextDTO
>
afterTexts
=
runImageDTO
.
getAfterTexts
();
if
(!
ListUtils
.
isEmpty
(
afterTexts
))
{
for
(
RunTextDTO
runTextDTO
:
afterTexts
)
{
setTextStyle
(
wordDTO
,
runTextDTO
,
paragraph
);
}
}
}
/**
* 添加页眉图片
*
* @param runImageDTO
* @param paragraph
* @param header
*/
private
static
void
addPictureHeader
(
RunImageDTO
runImageDTO
,
XWPFParagraph
paragraph
,
XWPFHeader
header
)
{
InputStream
is
=
null
;
String
imageUrl
=
runImageDTO
.
getImageUrl
();
if
(!
StringUtil
.
isEmpty
(
imageUrl
))
{
if
(
imageUrl
.
startsWith
(
"http"
))
{
is
=
new
ByteArrayInputStream
(
FileUtils
.
downloadByteFromUrl
(
imageUrl
));
}
else
{
is
=
new
ByteArrayInputStream
(
FileUtils
.
file2byte
(
imageUrl
));
}
}
else
if
(
runImageDTO
.
getImageByte
()
!=
null
)
{
is
=
new
ByteArrayInputStream
(
runImageDTO
.
getImageByte
());
}
XWPFRun
run
=
paragraph
.
createRun
();
try
{
XWPFPicture
picture
=
run
.
addPicture
(
is
,
XWPFDocument
.
PICTURE_TYPE_JPEG
,
"123"
,
Units
.
toEMU
(
runImageDTO
.
getWidth
()),
Units
.
toEMU
(
runImageDTO
.
getHeight
()));
//这段必须有,不然打开的logo图片不显示
String
blipID
=
""
;
for
(
XWPFPictureData
picturedata
:
header
.
getAllPackagePictures
())
{
blipID
=
header
.
getRelationId
(
picturedata
);
}
picture
.
getCTPicture
().
getBlipFill
().
getBlip
().
setEmbed
(
blipID
);
run
.
addTab
();
}
catch
(
Exception
e
)
{
LOGGER
.
error
(
"【WORD】WORD页眉图片生成失败:"
+
e
.
getMessage
(),
e
);
}
finally
{
try
{
if
(
is
!=
null
)
{
is
.
close
();
is
=
null
;
}
}
catch
(
Exception
e
)
{
}
}
}
/**
* 添加图片数据
*
* @param runImageDTO
* @param document
* @return
* @throws InvalidFormatException
*/
private
static
String
addPictureContent
(
RunImageDTO
runImageDTO
,
CustomXWPFDocument
document
)
throws
InvalidFormatException
{
String
relationId
=
null
;
String
imageUrl
=
runImageDTO
.
getImageUrl
();
if
(!
StringUtil
.
isEmpty
(
imageUrl
))
{
if
(
imageUrl
.
startsWith
(
"http"
))
{
relationId
=
document
.
addPictureData
(
FileUtils
.
downloadByteFromUrl
(
imageUrl
),
XWPFDocument
.
PICTURE_TYPE_JPEG
);
}
else
{
relationId
=
document
.
addPictureData
(
FileUtils
.
file2byte
(
imageUrl
),
XWPFDocument
.
PICTURE_TYPE_JPEG
);
}
}
else
if
(
runImageDTO
.
getImageByte
()
!=
null
)
{
relationId
=
document
.
addPictureData
(
runImageDTO
.
getImageByte
(),
XWPFDocument
.
PICTURE_TYPE_JPEG
);
}
return
relationId
;
}
/**
* 根据图片类型获取对应的图片类型代码
*
* @param picType
* @return
*/
public
static
int
getPictureType
(
String
picType
)
{
int
res
=
CustomXWPFDocument
.
PICTURE_TYPE_PICT
;
if
(
picType
!=
null
)
{
if
(
picType
.
equalsIgnoreCase
(
"png"
))
{
res
=
CustomXWPFDocument
.
PICTURE_TYPE_PNG
;
}
else
if
(
picType
.
equalsIgnoreCase
(
"dib"
))
{
res
=
CustomXWPFDocument
.
PICTURE_TYPE_DIB
;
}
else
if
(
picType
.
equalsIgnoreCase
(
"emf"
))
{
res
=
CustomXWPFDocument
.
PICTURE_TYPE_EMF
;
}
else
if
(
picType
.
equalsIgnoreCase
(
"jpg"
)
||
picType
.
equalsIgnoreCase
(
"jpeg"
))
{
res
=
CustomXWPFDocument
.
PICTURE_TYPE_JPEG
;
}
else
if
(
picType
.
equalsIgnoreCase
(
"wmf"
))
{
res
=
CustomXWPFDocument
.
PICTURE_TYPE_WMF
;
}
}
return
res
;
}
/**
* 结束关闭文件流
*
* @param document
* @param os
*/
public
static
void
close
(
CustomXWPFDocument
document
,
OutputStream
os
)
{
try
{
if
(
document
!=
null
)
{
document
.
close
();
document
=
null
;
}
if
(
os
!=
null
)
{
os
.
close
();
os
=
null
;
}
}
catch
(
Exception
e
)
{
LOGGER
.
error
(
"【WORD】WORD文件流关闭失败:"
+
e
.
getMessage
(),
e
);
}
}
}
package
com
.
pcloud
.
common
.
utils
.
word
;
import
java.io.ByteArrayInputStream
;
import
java.io.FileOutputStream
;
import
java.io.InputStream
;
import
java.io.OutputStream
;
import
java.math.BigInteger
;
import
java.util.List
;
import
org.apache.poi.POIXMLDocument
;
import
org.apache.poi.openxml4j.exceptions.InvalidFormatException
;
import
org.apache.poi.openxml4j.opc.OPCPackage
;
import
org.apache.poi.util.Units
;
import
org.apache.poi.wp.usermodel.HeaderFooterType
;
import
org.apache.poi.xwpf.usermodel.XWPFDocument
;
import
org.apache.poi.xwpf.usermodel.XWPFFooter
;
import
org.apache.poi.xwpf.usermodel.XWPFHeader
;
import
org.apache.poi.xwpf.usermodel.XWPFParagraph
;
import
org.apache.poi.xwpf.usermodel.XWPFPicture
;
import
org.apache.poi.xwpf.usermodel.XWPFPictureData
;
import
org.apache.poi.xwpf.usermodel.XWPFRun
;
import
org.apache.poi.xwpf.usermodel.XWPFTable
;
import
org.apache.poi.xwpf.usermodel.XWPFTableCell
;
import
org.apache.poi.xwpf.usermodel.XWPFTableRow
;
import
org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblWidth
;
import
org.openxmlformats.schemas.wordprocessingml.x2006.main.STTblWidth
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
com.pcloud.common.constant.FilePathConst
ant
;
import
com.pcloud.common.constant.WordConstant
;
import
com.pcloud.common.exceptions.BizException
;
import
com.pcloud.common.exceptions.FileException
;
import
com.pcloud.common.utils.FileUtils
;
import
com.pcloud.common.utils.ListUtils
;
import
com.pcloud.common.utils.UUIDUitl
;
import
com.pcloud.common.utils.string.StringUtil
;
import
com.pcloud.common.utils.word.dto.ParagraphDTO
;
import
com.pcloud.common.utils.word.dto.RunDTO
;
import
com.pcloud.common.utils.word.dto.RunImageDTO
;
import
com.pcloud.common.utils.word.dto.RunTableDTO
;
import
com.pcloud.common.utils.word.dto.RunTextDTO
;
import
com.pcloud.common.utils.word.dto.WordDTO
;
import
com.pcloud.common.utils.word.enums.ParagraphType
;
/**
* 重新定义word工具类
*
* @author:songx
* @date:2019/5/27,10:06
*/
public
class
WordNewUtils
{
private
static
final
Logger
LOGGER
=
LoggerFactory
.
getLogger
(
WordNewUtils
.
class
);
// public static void main(String[] args) {
// List<ParagraphDTO> paragraphDTOS = new ArrayList<>();
// // 页眉
// paragraphDTOS.add(getHeader1());
// paragraphDTOS.add(getHeader2());
// // 标题
// paragraphDTOS.add(getParagraph1());
// // 内容
// paragraphDTOS.add(getParagraph2());
// paragraphDTOS.add(getParagraph3());
// paragraphDTOS.add(getParagraph4());
// paragraphDTOS.add(getParagraph4());
// // 页脚
// paragraphDTOS.add(getFooter1());
// try {
// System.out.println(create(paragraphDTOS));
// } catch (Exception e) {
// LOGGER.error(e.getMessage(), e);
// }
// System.out.println("Game over!");
// }
//
// private static ParagraphDTO getHeader1() {
// RunTextDTO runTextDTO = RunTextDTO
// .newText("?????的个人专属错题本 共40道错题", 9, "微软雅黑");
// return ParagraphDTO.newHeader(ParagraphType.text, runTextDTO);
// }
//
// private static ParagraphDTO getHeader2() {
// RunTextDTO runTextDTO = RunTextDTO
// .newText("来源《书名书名书名书名书名书名书名书书名书名书名书书名书名书名书》", 9, "微软雅黑");
// return ParagraphDTO.newHeader(ParagraphType.text, runTextDTO);
// }
//
// private static ParagraphDTO getParagraph1() {
// RunTextDTO runTextDTO = RunTextDTO
// .newText("个人专属错题本", 18, "微软雅黑", true);
// return ParagraphDTO.newParagraph(ParagraphType.text, ParagraphAlignment.CENTER, runTextDTO, 1);
// }
//
// private static ParagraphDTO getParagraph2() {
// RunTextDTO runTextDTO = RunTextDTO
// .newText("完成下面错题练习,扫描二维码核对答案,并记录练习结果:", 11, "微软雅黑", true);
// return ParagraphDTO.newParagraph(ParagraphType.text, runTextDTO, 1);
// }
//
// private static ParagraphDTO getParagraph3() {
// RunImageDTO runImageDTO = RunImageDTO
// .newImage("I:\\TEST\\image\\02.jpg", 80, 80, null, listAfterTexts3(11, "微软雅黑"));
// return ParagraphDTO.newParagraph(ParagraphType.image, TextAlignment.TOP, runImageDTO, 1);
// }
//
// private static ParagraphDTO getParagraph4() {
// RunImageDTO runImageDTO = RunImageDTO
// .newImage("I:\\TEST\\image\\2.jpg", 200, 500);
// return ParagraphDTO.newParagraph(ParagraphType.image, runImageDTO, 3);
// }
//
// private static ParagraphDTO getFooter1() {
// RunTextDTO runTextDTO = RunTextDTO.newText("反复练习,攻克错题", 11, "微软雅黑");
// return ParagraphDTO.newFooter(ParagraphType.text, ParagraphAlignment.CENTER, runTextDTO);
// }
//
// /**
// * 组装图片后面的文字
// *
// * @param fontSize
// * @param fontFamily
// * @return
// */
// private static List<RunTextDTO> listAfterTexts3(int fontSize, String fontFamily) {
// List<RunTextDTO> afterRuns = Lists.newArrayList();
// afterRuns.add(RunTextDTO.newText(" 答对", fontSize, fontFamily));
// afterRuns.add(RunTextDTO.newText(" 10 ", fontSize, fontFamily, UnderlinePatterns.SINGLE));
// afterRuns.add(RunTextDTO.newText("道题,答错", fontSize, fontFamily));
// afterRuns.add(RunTextDTO.newText(" 11 ", fontSize, fontFamily, UnderlinePatterns.SINGLE));
// afterRuns.add(RunTextDTO.newText("道题,日期", fontSize, fontFamily));
// afterRuns.add(RunTextDTO.newText(" " + LocalDateUtils.getDateNow() + " ", fontSize, fontFamily,
// UnderlinePatterns.SINGLE));
// return afterRuns;
// }
/**
* 创建WORD
*
* @param wordDTO
* @return
* @throws Exception
*/
public
static
String
create
(
WordDTO
wordDTO
)
throws
FileException
{
LOGGER
.
info
(
"【WORD】创建WORD文档,<START>"
);
if
(
wordDTO
==
null
||
ListUtils
.
isEmpty
(
wordDTO
.
getParagraphs
()))
{
return
null
;
}
String
wordTemplate
=
null
;
String
outPath
=
null
;
CustomXWPFDocument
document
=
null
;
FileOutputStream
fos
=
null
;
try
{
wordTemplate
=
FilePathConst
ant
.
WORD
+
UUIDUitl
.
taskName
()
+
".docx"
;
FileUtils
.
downloadFileFromUrl
(
WordConstant
.
TEMPLATE_URL
,
wordTemplate
);
OPCPackage
pack
=
POIXMLDocument
.
openPackage
(
wordTemplate
);
document
=
new
CustomXWPFDocument
(
pack
);
// 添加内容到文档中
addParagraphs
(
wordDTO
,
document
);
// 生成目标word
outPath
=
FilePathConst
ant
.
WORD
+
UUIDUitl
.
taskName
()
+
".docx"
;
fos
=
new
FileOutputStream
(
outPath
);
document
.
write
(
fos
);
fos
.
flush
();
}
catch
(
Exception
e
)
{
LOGGER
.
error
(
"【WORD】创建WORD文档失败:"
+
e
.
getMessage
(),
e
);
throw
new
FileException
(
FileException
.
FILE_CONTENT_ERROR
,
e
.
getMessage
());
}
finally
{
close
(
document
,
fos
);
FileUtils
.
deleteFile
(
wordTemplate
);
}
LOGGER
.
info
(
"【WORD】创建WORD文档,<END>.[outPath]="
+
outPath
);
return
outPath
;
}
/**
* 添加内容到WORD中
*
* @param wordDTO
* @param document
* @throws BizException
*/
private
static
void
addParagraphs
(
WordDTO
wordDTO
,
CustomXWPFDocument
document
)
{
List
<
ParagraphDTO
>
paragraphDTOS
=
wordDTO
.
getParagraphs
();
for
(
ParagraphDTO
paragraphDTO
:
paragraphDTOS
)
{
ParagraphType
paragraphType
=
paragraphDTO
.
getParagraphType
();
if
(
ParagraphType
.
table
.
equals
(
paragraphType
))
{
addTable
(
paragraphDTO
,
document
);
}
else
if
(
ParagraphType
.
image
.
equals
(
paragraphType
))
{
addImage
(
wordDTO
,
paragraphDTO
,
document
);
}
else
if
(
ParagraphType
.
text
.
equals
(
paragraphType
))
{
addText
(
wordDTO
,
paragraphDTO
,
document
);
}
}
}
/**
* 获取段落
*
* @param paragraphDTO
* @param document
* @return
*/
private
static
XWPFParagraph
getParagraph
(
ParagraphDTO
paragraphDTO
,
CustomXWPFDocument
document
)
{
if
(
paragraphDTO
.
isHeader
())
{
XWPFHeader
xwpfHeader
=
document
.
createHeader
(
HeaderFooterType
.
DEFAULT
);
return
xwpfHeader
.
createParagraph
();
}
else
if
(
paragraphDTO
.
isFooter
())
{
XWPFFooter
xwpfFooter
=
document
.
createFooter
(
HeaderFooterType
.
DEFAULT
);
return
xwpfFooter
.
createParagraph
();
}
else
{
return
document
.
createParagraph
();
}
}
/**
* 添加文本块
*
* @param wordDTO
* @param paragraphDTO
* @throws BizException
*/
private
static
void
addText
(
WordDTO
wordDTO
,
ParagraphDTO
paragraphDTO
,
CustomXWPFDocument
document
)
throws
BizException
{
XWPFParagraph
paragraph
=
getParagraph
(
paragraphDTO
,
document
);
// 设置段落样式
setParagraphStyle
(
paragraphDTO
,
paragraph
);
// 设置段落块样式
if
(
paragraphDTO
.
getRun
()
!=
null
)
{
setTextStyle
(
wordDTO
,
(
RunTextDTO
)
paragraphDTO
.
getRun
(),
paragraph
);
}
else
if
(!
ListUtils
.
isEmpty
(
paragraphDTO
.
getRuns
()))
{
for
(
RunDTO
runDTO
:
paragraphDTO
.
getRuns
())
{
setTextStyle
(
wordDTO
,
(
RunTextDTO
)
runDTO
,
paragraph
);
}
}
// 添加空行
addEmptyText
(
paragraphDTO
.
getAfterEmpty
(),
document
);
}
/**
* 添加空行
*
* @param afterEmpty
* @param document
* @throws BizException
*/
private
static
void
addEmptyText
(
int
afterEmpty
,
CustomXWPFDocument
document
)
throws
BizException
{
for
(
int
i
=
0
;
i
<
afterEmpty
;
i
++)
{
setTextStyle
(
null
,
RunTextDTO
.
newEmpty
(),
document
.
createParagraph
());
}
}
/**
* 设置段落样式
*
* @param paragraphDTO
* @param paragraph
*/
private
static
void
setParagraphStyle
(
ParagraphDTO
paragraphDTO
,
XWPFParagraph
paragraph
)
{
// 与前一行的间距
if
(
paragraphDTO
.
getSpacingBefore
()
>
0
)
{
paragraph
.
setSpacingBeforeLines
(
paragraphDTO
.
getSpacingBefore
());
}
// 与下一行的间距
if
(
paragraphDTO
.
getSpacingAfter
()
>
0
)
{
paragraph
.
setSpacingAfterLines
(
paragraphDTO
.
getSpacingAfter
());
}
// 对齐
if
(
paragraphDTO
.
getParagraphAlignment
()
!=
null
)
{
paragraph
.
setFontAlignment
(
paragraphDTO
.
getParagraphAlignment
().
getValue
());
}
// 水平居中
if
(
paragraphDTO
.
getTextAlignment
()
!=
null
)
{
paragraph
.
setVerticalAlignment
(
paragraphDTO
.
getTextAlignment
());
}
}
/**
* 设置文本样式
*
* @param wordDTO
* @param runTextDTO
* @param paragraph
*/
private
static
void
setTextStyle
(
WordDTO
wordDTO
,
RunTextDTO
runTextDTO
,
XWPFParagraph
paragraph
)
{
XWPFRun
xwpfRun
=
paragraph
.
createRun
();
xwpfRun
.
setText
(
runTextDTO
.
getText
());
// 是否加粗
xwpfRun
.
setBold
(
runTextDTO
.
isBold
());
// 字体大小
if
(
runTextDTO
.
getFontSize
()
>
0
)
{
xwpfRun
.
setFontSize
(
runTextDTO
.
getFontSize
());
}
else
if
(
wordDTO
!=
null
&&
wordDTO
.
getFontSize
()
>
0
)
{
xwpfRun
.
setFontSize
(
wordDTO
.
getFontSize
());
}
// 字体
if
(
runTextDTO
.
getFontFamily
()
!=
null
)
{
xwpfRun
.
setFontFamily
(
runTextDTO
.
getFontFamily
());
}
else
if
(
wordDTO
!=
null
&&
wordDTO
.
getFontFamily
()
!=
null
)
{
xwpfRun
.
setFontFamily
(
wordDTO
.
getFontFamily
());
}
// 下划线
if
(
runTextDTO
.
getUnderlinePatterns
()
!=
null
)
{
xwpfRun
.
setUnderline
(
runTextDTO
.
getUnderlinePatterns
());
}
}
/**
* 添加表格
*
* @param paragraphDTO
* @throws BizException
*/
private
static
void
addTable
(
ParagraphDTO
paragraphDTO
,
CustomXWPFDocument
document
)
throws
BizException
{
XWPFParagraph
paragraph
=
document
.
createParagraph
();
// 设置段落样式
setParagraphStyle
(
paragraphDTO
,
paragraph
);
// 创建表格
if
(
paragraphDTO
.
getRun
()
!=
null
)
{
createTable
((
RunTableDTO
)
paragraphDTO
.
getRun
(),
document
);
}
else
if
(!
ListUtils
.
isEmpty
(
paragraphDTO
.
getRuns
()))
{
for
(
RunDTO
runDTO
:
paragraphDTO
.
getRuns
())
{
createTable
((
RunTableDTO
)
runDTO
,
document
);
}
}
// 添加空行
addEmptyText
(
paragraphDTO
.
getAfterEmpty
(),
document
);
}
/**
* 创建表格
*
* @param runTableDTO
* @param document
*/
private
static
void
createTable
(
RunTableDTO
runTableDTO
,
CustomXWPFDocument
document
)
{
String
[][]
contents
=
runTableDTO
.
getContents
();
if
(
contents
==
null
||
contents
.
length
<
1
)
{
return
;
}
int
rowNum
=
contents
.
length
;
// 总行数
int
colNum
=
runTableDTO
.
getColumnWidths
().
length
;
// 总列数
if
(
colNum
<
1
)
{
throw
new
FileException
(
FileException
.
FILE_CONTENT_ERROR
,
"表格列数与内容列数不一致"
);
}
// 创建表格
XWPFTable
ComTable
=
document
.
createTable
();
// 列宽自动分割
CTTblWidth
comTableWidth
=
ComTable
.
getCTTbl
().
addNewTblPr
().
addNewTblW
();
comTableWidth
.
setType
(
STTblWidth
.
DXA
);
comTableWidth
.
setW
(
BigInteger
.
valueOf
(
9072
));
// 设置行和列
for
(
int
i
=
0
;
i
<
rowNum
;
i
++)
{
String
[]
cols
=
contents
[
i
];
// 创建行
XWPFTableRow
comTableRow
=
i
==
0
?
ComTable
.
getRow
(
0
)
:
ComTable
.
createRow
();
for
(
int
j
=
0
;
j
<
colNum
;
j
++)
{
String
text
=
(
j
>=
cols
.
length
||
StringUtil
.
isEmpty
(
cols
[
j
]))
?
""
:
cols
[
j
];
// 填充单元格内容
XWPFTableCell
cell
=
null
;
if
(
i
==
0
)
{
cell
=
j
==
0
?
comTableRow
.
getCell
(
0
)
:
comTableRow
.
addNewTableCell
();
}
else
{
cell
=
comTableRow
.
getCell
(
j
);
}
cell
.
setText
(
text
);
cell
.
setVerticalAlignment
(
runTableDTO
.
getVertAlign
());
}
// 行高
if
(
runTableDTO
.
getHeight
()
>
0
)
{
comTableRow
.
setHeight
(
runTableDTO
.
getHeight
());
}
}
}
/**
* 添加图片和文本
*
* @param paragraphDTO
* @param document
*/
private
static
void
addImage
(
WordDTO
wordDTO
,
ParagraphDTO
paragraphDTO
,
CustomXWPFDocument
document
)
{
XWPFParagraph
paragraph
=
null
;
if
(
paragraphDTO
.
isHeader
())
{
XWPFHeader
header
=
document
.
createHeader
(
HeaderFooterType
.
DEFAULT
);
paragraph
=
header
.
createParagraph
();
addImageHeader
(
wordDTO
,
paragraphDTO
,
paragraph
,
header
);
}
else
{
paragraph
=
document
.
createParagraph
();
addImageContent
(
wordDTO
,
paragraphDTO
,
paragraph
,
document
);
}
// 设置段落样式
setParagraphStyle
(
paragraphDTO
,
paragraph
);
// 添加空行
addEmptyText
(
paragraphDTO
.
getAfterEmpty
(),
document
);
}
/**
* 页眉中插入图片
*
* @param wordDTO
* @param paragraphDTO
* @param paragraph
* @param header
*/
private
static
void
addImageHeader
(
WordDTO
wordDTO
,
ParagraphDTO
paragraphDTO
,
XWPFParagraph
paragraph
,
XWPFHeader
header
)
{
// 创建图片
if
(
paragraphDTO
.
getRun
()
!=
null
)
{
createImageHeader
(
wordDTO
,
(
RunImageDTO
)
paragraphDTO
.
getRun
(),
paragraph
,
header
);
}
else
if
(!
ListUtils
.
isEmpty
(
paragraphDTO
.
getRuns
()))
{
for
(
RunDTO
runDTO
:
paragraphDTO
.
getRuns
())
{
createImageHeader
(
wordDTO
,
(
RunImageDTO
)
runDTO
,
paragraph
,
header
);
}
}
}
/**
* 内容中插入图片
*
* @param wordDTO
* @param paragraphDTO
* @param paragraph
* @param document
*/
private
static
void
addImageContent
(
WordDTO
wordDTO
,
ParagraphDTO
paragraphDTO
,
XWPFParagraph
paragraph
,
CustomXWPFDocument
document
)
{
// 创建图片
if
(
paragraphDTO
.
getRun
()
!=
null
)
{
createImageContent
(
wordDTO
,
(
RunImageDTO
)
paragraphDTO
.
getRun
(),
paragraph
,
document
);
}
else
if
(!
ListUtils
.
isEmpty
(
paragraphDTO
.
getRuns
()))
{
for
(
RunDTO
runDTO
:
paragraphDTO
.
getRuns
())
{
createImageContent
(
wordDTO
,
(
RunImageDTO
)
runDTO
,
paragraph
,
document
);
}
}
}
/**
* 创建图片和文本
*
* @param wordDTO
* @param runImageDTO
* @param paragraph
* @param document
*/
private
static
void
createImageContent
(
WordDTO
wordDTO
,
RunImageDTO
runImageDTO
,
XWPFParagraph
paragraph
,
CustomXWPFDocument
document
)
{
// 前置文本
addImageBefore
(
wordDTO
,
runImageDTO
,
paragraph
);
try
{
// 图片
String
relationId
=
addPictureContent
(
runImageDTO
,
document
);
if
(!
StringUtil
.
isEmpty
(
relationId
))
{
int
id
=
document
.
getAllPictures
().
size
()
-
1
;
document
.
createPicture
(
paragraph
,
relationId
,
id
,
runImageDTO
.
getWidth
(),
runImageDTO
.
getHeight
());
}
}
catch
(
Exception
e
)
{
LOGGER
.
error
(
"【WORD】创建WORD文档失败:"
+
e
.
getMessage
(),
e
);
}
// 后置文本
addImageAfter
(
wordDTO
,
runImageDTO
,
paragraph
);
}
/**
* 创建图片
*
* @param wordDTO
* @param runImageDTO
* @param paragraph
* @param header
*/
private
static
void
createImageHeader
(
WordDTO
wordDTO
,
RunImageDTO
runImageDTO
,
XWPFParagraph
paragraph
,
XWPFHeader
header
)
{
// 前置文本
addImageBefore
(
wordDTO
,
runImageDTO
,
paragraph
);
// 图片
addPictureHeader
(
runImageDTO
,
paragraph
,
header
);
// 后置文本
addImageAfter
(
wordDTO
,
runImageDTO
,
paragraph
);
}
/**
* 图片前置文本
*
* @param wordDTO
* @param runImageDTO
* @param paragraph
*/
private
static
void
addImageBefore
(
WordDTO
wordDTO
,
RunImageDTO
runImageDTO
,
XWPFParagraph
paragraph
)
{
List
<
RunTextDTO
>
beforeTexts
=
runImageDTO
.
getBeforeTexts
();
if
(!
ListUtils
.
isEmpty
(
beforeTexts
))
{
for
(
RunTextDTO
runTextDTO
:
beforeTexts
)
{
setTextStyle
(
wordDTO
,
runTextDTO
,
paragraph
);
}
}
}
/**
* 图片后置文本
*
* @param wordDTO
* @param runImageDTO
* @param paragraph
*/
private
static
void
addImageAfter
(
WordDTO
wordDTO
,
RunImageDTO
runImageDTO
,
XWPFParagraph
paragraph
)
{
List
<
RunTextDTO
>
afterTexts
=
runImageDTO
.
getAfterTexts
();
if
(!
ListUtils
.
isEmpty
(
afterTexts
))
{
for
(
RunTextDTO
runTextDTO
:
afterTexts
)
{
setTextStyle
(
wordDTO
,
runTextDTO
,
paragraph
);
}
}
}
/**
* 添加页眉图片
*
* @param runImageDTO
* @param paragraph
* @param header
*/
private
static
void
addPictureHeader
(
RunImageDTO
runImageDTO
,
XWPFParagraph
paragraph
,
XWPFHeader
header
)
{
InputStream
is
=
null
;
String
imageUrl
=
runImageDTO
.
getImageUrl
();
if
(!
StringUtil
.
isEmpty
(
imageUrl
))
{
if
(
imageUrl
.
startsWith
(
"http"
))
{
is
=
new
ByteArrayInputStream
(
FileUtils
.
downloadByteFromUrl
(
imageUrl
));
}
else
{
is
=
new
ByteArrayInputStream
(
FileUtils
.
file2byte
(
imageUrl
));
}
}
else
if
(
runImageDTO
.
getImageByte
()
!=
null
)
{
is
=
new
ByteArrayInputStream
(
runImageDTO
.
getImageByte
());
}
XWPFRun
run
=
paragraph
.
createRun
();
try
{
XWPFPicture
picture
=
run
.
addPicture
(
is
,
XWPFDocument
.
PICTURE_TYPE_JPEG
,
"123"
,
Units
.
toEMU
(
runImageDTO
.
getWidth
()),
Units
.
toEMU
(
runImageDTO
.
getHeight
()));
//这段必须有,不然打开的logo图片不显示
String
blipID
=
""
;
for
(
XWPFPictureData
picturedata
:
header
.
getAllPackagePictures
())
{
blipID
=
header
.
getRelationId
(
picturedata
);
}
picture
.
getCTPicture
().
getBlipFill
().
getBlip
().
setEmbed
(
blipID
);
run
.
addTab
();
}
catch
(
Exception
e
)
{
LOGGER
.
error
(
"【WORD】WORD页眉图片生成失败:"
+
e
.
getMessage
(),
e
);
}
finally
{
try
{
if
(
is
!=
null
)
{
is
.
close
();
is
=
null
;
}
}
catch
(
Exception
e
)
{
}
}
}
/**
* 添加图片数据
*
* @param runImageDTO
* @param document
* @return
* @throws InvalidFormatException
*/
private
static
String
addPictureContent
(
RunImageDTO
runImageDTO
,
CustomXWPFDocument
document
)
throws
InvalidFormatException
{
String
relationId
=
null
;
String
imageUrl
=
runImageDTO
.
getImageUrl
();
if
(!
StringUtil
.
isEmpty
(
imageUrl
))
{
if
(
imageUrl
.
startsWith
(
"http"
))
{
relationId
=
document
.
addPictureData
(
FileUtils
.
downloadByteFromUrl
(
imageUrl
),
XWPFDocument
.
PICTURE_TYPE_JPEG
);
}
else
{
relationId
=
document
.
addPictureData
(
FileUtils
.
file2byte
(
imageUrl
),
XWPFDocument
.
PICTURE_TYPE_JPEG
);
}
}
else
if
(
runImageDTO
.
getImageByte
()
!=
null
)
{
relationId
=
document
.
addPictureData
(
runImageDTO
.
getImageByte
(),
XWPFDocument
.
PICTURE_TYPE_JPEG
);
}
return
relationId
;
}
/**
* 根据图片类型获取对应的图片类型代码
*
* @param picType
* @return
*/
public
static
int
getPictureType
(
String
picType
)
{
int
res
=
CustomXWPFDocument
.
PICTURE_TYPE_PICT
;
if
(
picType
!=
null
)
{
if
(
picType
.
equalsIgnoreCase
(
"png"
))
{
res
=
CustomXWPFDocument
.
PICTURE_TYPE_PNG
;
}
else
if
(
picType
.
equalsIgnoreCase
(
"dib"
))
{
res
=
CustomXWPFDocument
.
PICTURE_TYPE_DIB
;
}
else
if
(
picType
.
equalsIgnoreCase
(
"emf"
))
{
res
=
CustomXWPFDocument
.
PICTURE_TYPE_EMF
;
}
else
if
(
picType
.
equalsIgnoreCase
(
"jpg"
)
||
picType
.
equalsIgnoreCase
(
"jpeg"
))
{
res
=
CustomXWPFDocument
.
PICTURE_TYPE_JPEG
;
}
else
if
(
picType
.
equalsIgnoreCase
(
"wmf"
))
{
res
=
CustomXWPFDocument
.
PICTURE_TYPE_WMF
;
}
}
return
res
;
}
/**
* 结束关闭文件流
*
* @param document
* @param os
*/
public
static
void
close
(
CustomXWPFDocument
document
,
OutputStream
os
)
{
try
{
if
(
document
!=
null
)
{
document
.
close
();
document
=
null
;
}
if
(
os
!=
null
)
{
os
.
close
();
os
=
null
;
}
}
catch
(
Exception
e
)
{
LOGGER
.
error
(
"【WORD】WORD文件流关闭失败:"
+
e
.
getMessage
(),
e
);
}
}
}
pcloud-common/src/main/java/com/pcloud/common/utils/word/WordUtils.java
View file @
d5f7ebc4
...
...
@@ -41,7 +41,7 @@ import com.lowagie.text.Paragraph;
import
com.lowagie.text.Phrase
;
import
com.lowagie.text.Table
;
import
com.lowagie.text.rtf.RtfWriter2
;
import
com.pcloud.common.constant.FilePathConst
;
import
com.pcloud.common.constant.FilePathConst
ant
;
import
com.pcloud.common.constant.WordConstant
;
import
com.pcloud.common.exceptions.BizException
;
import
com.pcloud.common.exceptions.FileException
;
...
...
@@ -84,7 +84,7 @@ public class WordUtils {
RtfWriter2
rtfWriter2
=
null
;
try
{
// 输出路径
outPath
=
FilePathConst
.
WORD_PATH
+
UUIDUitl
.
taskName
()
+
".doc"
;
outPath
=
FilePathConst
ant
.
WORD
+
UUIDUitl
.
taskName
()
+
".doc"
;
FileUtils
.
creatFiles
(
outPath
);
// 创建输出流
os
=
new
FileOutputStream
(
new
File
(
outPath
));
...
...
@@ -302,14 +302,14 @@ public class WordUtils {
CustomXWPFDocument
document
=
null
;
FileOutputStream
fos
=
null
;
try
{
wordTemplate
=
FilePathConst
.
WORD_PATH
+
UUIDUitl
.
taskName
()
+
".docx"
;
wordTemplate
=
FilePathConst
ant
.
WORD
+
UUIDUitl
.
taskName
()
+
".docx"
;
FileUtils
.
downloadFileFromUrl
(
WordConstant
.
TEMPLATE_URL
,
wordTemplate
);
OPCPackage
pack
=
POIXMLDocument
.
openPackage
(
wordTemplate
);
document
=
new
CustomXWPFDocument
(
pack
);
// 添加内容到文档中
addChunks
(
wordPOs
,
document
);
// 生成目标word
outPath
=
FilePathConst
.
WORD_PATH
+
UUIDUitl
.
taskName
()
+
".docx"
;
outPath
=
FilePathConst
ant
.
WORD
+
UUIDUitl
.
taskName
()
+
".docx"
;
fos
=
new
FileOutputStream
(
outPath
);
document
.
write
(
fos
);
fos
.
flush
();
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment