Skip to content

Commit b74fd31

Browse files
author
xsx
committed
1. 修复资源路径下读取不到字体问题
2. 生成pdf时,根据传入路径,自动创建不存在的目录
1 parent a7674f3 commit b74fd31

17 files changed

+191
-40
lines changed

.gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,5 @@
2121

2222
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
2323
hs_err_pid*
24+
/target/
25+
/src/main/java/wiki/xsx/core/pdf/Test.java

pom.xml

+14-14
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<modelVersion>4.0.0</modelVersion>
55
<groupId>wiki.xsx</groupId>
66
<artifactId>x-easypdf</artifactId>
7-
<version>2.3.2</version>
7+
<version>2.3.3</version>
88
<packaging>jar</packaging>
99
<name>x-easypdf</name>
1010
<url>http://www.xsx.wiki</url>
@@ -55,19 +55,6 @@
5555
<autoReleaseAfterClose>true</autoReleaseAfterClose>
5656
</configuration>
5757
</plugin>
58-
<plugin>
59-
<groupId>org.apache.maven.plugins</groupId>
60-
<artifactId>maven-source-plugin</artifactId>
61-
<version>3.1.0</version>
62-
<executions>
63-
<execution>
64-
<phase>package</phase>
65-
<goals>
66-
<goal>jar-no-fork</goal>
67-
</goals>
68-
</execution>
69-
</executions>
70-
</plugin>
7158
<plugin>
7259
<groupId>org.apache.maven.plugins</groupId>
7360
<artifactId>maven-javadoc-plugin</artifactId>
@@ -128,6 +115,19 @@
128115
<encoding>UTF-8</encoding>
129116
</configuration>
130117
</plugin>
118+
<plugin>
119+
<groupId>org.apache.maven.plugins</groupId>
120+
<artifactId>maven-source-plugin</artifactId>
121+
<version>3.1.0</version>
122+
<executions>
123+
<execution>
124+
<phase>package</phase>
125+
<goals>
126+
<goal>jar-no-fork</goal>
127+
</goals>
128+
</execution>
129+
</executions>
130+
</plugin>
131131
</plugins>
132132
</build>
133133

src/main/java/wiki/xsx/core/pdf/component/line/XEasyPdfBaseLine.java

+9
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,15 @@ public PDFont getFont() {
198198
return this.param.getFont();
199199
}
200200

201+
/**
202+
* 获取线条宽度
203+
* @return 返回线条宽度
204+
*/
205+
@Override
206+
public float getLineWidth() {
207+
return this.param.getLineWidth();
208+
}
209+
201210
/**
202211
* 绘制
203212
* @param document pdf文档

src/main/java/wiki/xsx/core/pdf/component/line/XEasyPdfDottedSplitLine.java

+9
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,15 @@ public PDFont getFont() {
224224
return this.param.getFont();
225225
}
226226

227+
/**
228+
* 获取线条宽度
229+
* @return 返回线条宽度
230+
*/
231+
@Override
232+
public float getLineWidth() {
233+
return this.param.getLineWidth();
234+
}
235+
227236
/**
228237
* 绘制
229238
* @param document pdf文档

src/main/java/wiki/xsx/core/pdf/component/line/XEasyPdfLine.java

+6
Original file line numberDiff line numberDiff line change
@@ -78,4 +78,10 @@ public interface XEasyPdfLine extends XEasyPdfComponent {
7878
* @return 返回pdfBox字体
7979
*/
8080
PDFont getFont();
81+
82+
/**
83+
* 获取线条宽度
84+
* @return 返回线条宽度
85+
*/
86+
float getLineWidth();
8187
}

src/main/java/wiki/xsx/core/pdf/component/line/XEasyPdfLineParam.java

+4
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@ class XEasyPdfLineParam {
3838
* 字体路径
3939
*/
4040
private String fontPath;
41+
/**
42+
* 字体路径(资源路径)
43+
*/
44+
private String fontPathForResource;
4145
/**
4246
* 字体
4347
*/

src/main/java/wiki/xsx/core/pdf/component/line/XEasyPdfSolidSplitLine.java

+9
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,15 @@ public PDFont getFont() {
197197
return this.param.getFont();
198198
}
199199

200+
/**
201+
* 获取线条宽度
202+
* @return 返回线条宽度
203+
*/
204+
@Override
205+
public float getLineWidth() {
206+
return this.param.getLineWidth();
207+
}
208+
200209
/**
201210
* 绘制
202211
* @param document pdf文档

src/main/java/wiki/xsx/core/pdf/component/table/XEasyPdfCell.java

+26-2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import org.apache.pdfbox.pdmodel.font.PDFont;
44
import wiki.xsx.core.pdf.component.XEasyPdfComponent;
55
import wiki.xsx.core.pdf.component.image.XEasyPdfImage;
6+
import wiki.xsx.core.pdf.component.line.XEasyPdfLine;
67
import wiki.xsx.core.pdf.component.text.XEasyPdfText;
78
import wiki.xsx.core.pdf.doc.XEasyPdfDocument;
89
import wiki.xsx.core.pdf.handler.XEasyPdfHandler;
@@ -271,11 +272,17 @@ void doDraw(XEasyPdfDocument document, XEasyPdfPage page, XEasyPdfRow row) throw
271272
if (component instanceof XEasyPdfText) {
272273
// 写入文本
273274
this.writeText(document, page, row, (XEasyPdfText) component);
274-
// 如果组件属于图片组件,则写入图片
275-
}else if (component instanceof XEasyPdfImage) {
275+
}
276+
// 如果组件属于图片组件,则写入图片
277+
else if (component instanceof XEasyPdfImage) {
276278
// 写入图片
277279
this.writeImage(document, page, row, (XEasyPdfImage) component);
278280
}
281+
// 如果组件属于线条组件,则写入线条
282+
else if (component instanceof XEasyPdfLine) {
283+
// 写入线条
284+
this.writeLine(document, page, row, (XEasyPdfLine) component);
285+
}
279286
// TODO 后续有需要,再加入其他组件
280287
}
281288
// 重置为当前行X轴原始坐标
@@ -358,4 +365,21 @@ private void writeImage(XEasyPdfDocument document, XEasyPdfPage page, XEasyPdfRo
358365
page.getParam().getPageY() - row.getParam().getMarginTop() - image.getMarginTop() - image.getHeight(document, page) - this.param.getBorderWidth() / 2
359366
).draw(document, page);
360367
}
368+
369+
/**
370+
* 写入分割线
371+
* @param document pdf文档
372+
* @param page pdf页面
373+
* @param row pdf表格行
374+
* @param line pdf线条
375+
* @throws IOException IO异常
376+
*/
377+
private void writeLine(XEasyPdfDocument document, XEasyPdfPage page, XEasyPdfRow row, XEasyPdfLine line) throws IOException {
378+
line.setContentMode(this.param.getContentMode())
379+
.setWidth(this.param.getWidth() - this.param.getBorderWidth() * 2)
380+
.setPosition(
381+
row.getParam().getBeginX() + this.param.getBorderWidth() / 2,
382+
page.getParam().getPageY() - row.getParam().getMarginTop() - line.getLineWidth() - this.param.getBorderWidth() / 2
383+
).draw(document, page);
384+
}
361385
}

src/main/java/wiki/xsx/core/pdf/component/text/XEasyPdfText.java

+5
Original file line numberDiff line numberDiff line change
@@ -525,6 +525,11 @@ private void doDraw(XEasyPdfDocument document, XEasyPdfPage page) throws IOExcep
525525
page.getParam().setPageY(this.param.getBeginY());
526526
}
527527
}
528+
// 如果不允许页面重置定位,则进行重置
529+
if (!page.getParam().isAllowResetPosition()) {
530+
// 开启页面自动重置定位
531+
page.enablePosition();
532+
}
528533
// 完成标记
529534
this.param.setDraw(true);
530535
}

src/main/java/wiki/xsx/core/pdf/doc/XEasyPdfDocument.java

+3-11
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
11
package wiki.xsx.core.pdf.doc;
22

3-
import org.apache.pdfbox.cos.COSName;
43
import org.apache.pdfbox.pdfwriter.COSWriter;
54
import org.apache.pdfbox.pdmodel.PDDocument;
65
import org.apache.pdfbox.pdmodel.PDPage;
76
import org.apache.pdfbox.pdmodel.PDPageTree;
8-
import org.apache.pdfbox.pdmodel.PDResources;
97
import org.apache.pdfbox.pdmodel.common.PDRectangle;
108
import org.apache.pdfbox.pdmodel.font.PDFont;
119
import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm;
@@ -18,6 +16,7 @@
1816
import wiki.xsx.core.pdf.mark.XEasyPdfWatermark;
1917
import wiki.xsx.core.pdf.page.XEasyPdfPage;
2018
import wiki.xsx.core.pdf.page.XEasyPdfPageParam;
19+
import wiki.xsx.core.pdf.util.XEasyPdfFileUtil;
2120
import wiki.xsx.core.pdf.util.XEasyPdfFontUtil;
2221

2322
import javax.print.PrintServiceLookup;
@@ -64,6 +63,7 @@ public class XEasyPdfDocument {
6463
* 无参构造
6564
*/
6665
public XEasyPdfDocument() {
66+
// 设置模板文档
6767
this.param.setSource(new PDDocument());
6868
}
6969

@@ -438,7 +438,7 @@ public XEasyPdfDocumentExtractor extractor() {
438438
* @throws IOException IO异常
439439
*/
440440
public XEasyPdfDocument save(String outputPath) throws IOException {
441-
try (OutputStream outputStream = Files.newOutputStream(Paths.get(outputPath))) {
441+
try (OutputStream outputStream = Files.newOutputStream(XEasyPdfFileUtil.createDirectories(Paths.get(outputPath)))) {
442442
return this.save(outputStream);
443443
}
444444
}
@@ -665,14 +665,6 @@ private void fillForm() throws IOException {
665665
PDAcroForm acroForm = this.getTarget().getDocumentCatalog().getAcroForm();
666666
// 如果pdfBox表单不为空,则进行填充
667667
if (acroForm!=null) {
668-
// 定义pdfBox数据源
669-
PDResources resources = new PDResources();
670-
// 内置默认字体名称
671-
final String defaultCosName = "AdobeSongStd-Light";
672-
// 设置字体
673-
resources.put(COSName.getPDFName(defaultCosName), this.getFont());
674-
// 设置pdfBox表单默认的数据源
675-
acroForm.setDefaultResources(resources);
676668
// 获取表单字典键值集合
677669
Set<Map.Entry<String, String>> entrySet = formMap.entrySet();
678670
// 遍历表单字典

src/main/java/wiki/xsx/core/pdf/doc/XEasyPdfDocumentImager.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import org.apache.pdfbox.pdmodel.PDDocument;
55
import org.apache.pdfbox.rendering.PDFRenderer;
66
import wiki.xsx.core.pdf.component.image.XEasyPdfImageType;
7+
import wiki.xsx.core.pdf.util.XEasyPdfFileUtil;
78

89
import javax.imageio.ImageIO;
910
import java.awt.image.BufferedImage;
@@ -89,7 +90,7 @@ public XEasyPdfDocumentImager image(String outputPath, XEasyPdfImageType imageTy
8990
// 构建文件名称
9091
fileNameBuilder.append(outputPath).append(File.separator).append(prefix).append(i + 1).append('.').append(imageTypeName);
9192
// 获取输出流
92-
try (OutputStream outputStream = Files.newOutputStream(Paths.get(fileNameBuilder.toString()))) {
93+
try (OutputStream outputStream = Files.newOutputStream(XEasyPdfFileUtil.createDirectories(Paths.get(fileNameBuilder.toString())))) {
9394
// 初始化pdfBox文档渲染器
9495
PDFRenderer renderer = new PDFRenderer(this.document);
9596
// 渲染图片

src/main/java/wiki/xsx/core/pdf/doc/XEasyPdfDocumentParam.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55
import org.apache.pdfbox.pdmodel.PDDocument;
66
import org.apache.pdfbox.pdmodel.PDDocumentInformation;
77
import org.apache.pdfbox.pdmodel.font.PDFont;
8+
import wiki.xsx.core.pdf.component.image.XEasyPdfImage;
89
import wiki.xsx.core.pdf.footer.XEasyPdfFooter;
910
import wiki.xsx.core.pdf.header.XEasyPdfHeader;
10-
import wiki.xsx.core.pdf.component.image.XEasyPdfImage;
1111
import wiki.xsx.core.pdf.mark.XEasyPdfWatermark;
1212
import wiki.xsx.core.pdf.page.XEasyPdfPage;
1313
import wiki.xsx.core.pdf.util.XEasyPdfFontUtil;

src/main/java/wiki/xsx/core/pdf/doc/XEasyPdfDocumentSplitter.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import org.apache.pdfbox.pdmodel.PDPage;
77
import org.apache.pdfbox.pdmodel.PDPageTree;
88
import wiki.xsx.core.pdf.util.XEasyPdfConvertUtil;
9+
import wiki.xsx.core.pdf.util.XEasyPdfFileUtil;
910

1011
import java.io.File;
1112
import java.io.IOException;
@@ -101,7 +102,7 @@ public XEasyPdfDocumentSplitter split(String outputPath, String prefix) throws I
101102
// 构建文件名称
102103
fileNameBuilder.append(outputPath).append(File.separator).append(prefix).append(i + 1).append(".pdf");
103104
// 获取输出流
104-
try(OutputStream outputStream = Files.newOutputStream(Paths.get(fileNameBuilder.toString()))) {
105+
try(OutputStream outputStream = Files.newOutputStream(XEasyPdfFileUtil.createDirectories(Paths.get(fileNameBuilder.toString())))) {
105106
// 拆分文档
106107
this.split(outputStream, XEasyPdfConvertUtil.toInt(this.documentList.get(i)));
107108
}
@@ -119,7 +120,7 @@ public XEasyPdfDocumentSplitter split(String outputPath, String prefix) throws I
119120
// 构建文件名称
120121
fileNameBuilder.append(outputPath).append(File.separator).append(prefix).append(index).append(".pdf");
121122
// 获取输出流
122-
try(OutputStream outputStream = Files.newOutputStream(Paths.get(fileNameBuilder.toString()))) {
123+
try(OutputStream outputStream = Files.newOutputStream(XEasyPdfFileUtil.createDirectories(Paths.get(fileNameBuilder.toString())))) {
123124
// 设置文档信息及保护策略
124125
this.pdfDocument.setInfoAndPolicy(target);
125126
// 保存文档
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package wiki.xsx.core.pdf.util;
2+
3+
import java.io.IOException;
4+
import java.nio.file.Files;
5+
import java.nio.file.Path;
6+
7+
/**
8+
* 文件工具
9+
* @author xsx
10+
* @date 2021/7/14
11+
* @since 1.8
12+
* <p>
13+
* Copyright (c) 2020 xsx All Rights Reserved.
14+
* x-easypdf is licensed under Mulan PSL v2.
15+
* You can use this software according to the terms and conditions of the Mulan PSL v2.
16+
* You may obtain a copy of Mulan PSL v2 at:
17+
* http://license.coscl.org.cn/MulanPSL2
18+
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
19+
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
20+
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
21+
* See the Mulan PSL v2 for more details.
22+
* </p>
23+
*/
24+
public class XEasyPdfFileUtil {
25+
26+
/**
27+
* 创建目录
28+
* @param path 路径
29+
* @return 返回路径
30+
*/
31+
public static Path createDirectories(Path path) {
32+
if (!Files.exists(path)) {
33+
try {
34+
Path directoryPath;
35+
if (!Files.isDirectory(path)) {
36+
directoryPath = path.getParent();
37+
}else {
38+
directoryPath = path;
39+
}
40+
Files.createDirectories(directoryPath);
41+
} catch (IOException e) {
42+
throw new RuntimeException("create directory fail");
43+
}
44+
}
45+
return path;
46+
}
47+
}

0 commit comments

Comments
 (0)