wiki.xsx.core.pdf.doc.XEasyPdfDocumentParam Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of x-easypdf Show documentation
Show all versions of x-easypdf Show documentation
A framework based on pdfbox
package wiki.xsx.core.pdf.doc;
import lombok.Data;
import lombok.SneakyThrows;
import lombok.experimental.Accessors;
import org.apache.pdfbox.io.MemoryUsageSetting;
import org.apache.pdfbox.pdmodel.*;
import org.apache.pdfbox.pdmodel.font.PDFont;
import wiki.xsx.core.pdf.component.XEasyPdfComponent;
import wiki.xsx.core.pdf.component.image.XEasyPdfImage;
import wiki.xsx.core.pdf.footer.XEasyPdfFooter;
import wiki.xsx.core.pdf.header.XEasyPdfHeader;
import wiki.xsx.core.pdf.mark.XEasyPdfWatermark;
import wiki.xsx.core.pdf.util.XEasyPdfFontUtil;
import java.awt.*;
import java.io.File;
import java.io.InputStream;
import java.io.Serializable;
import java.lang.reflect.Method;
import java.util.List;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
/**
* pdf文档参数
*
* @author xsx
* @date 2020/4/7
* @since 1.8
*
* Copyright (c) 2020-2022 xsx All Rights Reserved.
* x-easypdf is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*
*/
@Data
@Accessors(chain = true)
class XEasyPdfDocumentParam implements Serializable {
private static final long serialVersionUID = 2578484264342461916L;
/**
* 生产者
*/
private static final String PRODUCER = "x-easypdf/pdfbox";
/**
* 内容模式
*/
private XEasyPdfComponent.ContentMode contentMode = XEasyPdfComponent.ContentMode.APPEND;
/**
* 是否重置上下文
*/
private Boolean isResetContext = Boolean.FALSE;
/**
* 是否替换总页码占位符
*/
private Boolean isReplaceTotalPagePlaceholder = Boolean.FALSE;
/**
* 默认字体样式
*/
private XEasyPdfDefaultFontStyle defaultFontStyle = XEasyPdfDefaultFontStyle.NORMAL;
/**
* 字体路径
*/
private String fontPath;
/**
* 当前字体
*/
private PDFont font;
/**
* 字体缓存
*/
private final Map fontCache = new ConcurrentHashMap<>(8);
/**
* otf字体缓存
*/
private final Map otfFontCache = new ConcurrentHashMap<>(8);
/**
* pdfBox文档(源文档)
*/
private PDDocument source;
/**
* pdfBox文档(目标文档)
*/
private PDDocument target;
/**
* 临时任务列表
*/
private List tempTargetList = new ArrayList<>(16);
/**
* 临时目录
*/
private String tempDir;
/**
* 版本
*/
private Float version = 1.5F;
/**
* 总页数
*/
private Integer totalPage = 0;
/**
* 合并pdf源文档
*/
private List mergeSourceList = new ArrayList<>(10);
/**
* pdf页面列表
*/
private List pageList = new ArrayList<>(32);
/**
* 全局左边距
*/
private Float globalMarginLeft;
/**
* 全局右边距
*/
private Float globalMarginRight;
/**
* 全局上边距
*/
private Float globalMarginTop;
/**
* 全局下边距
*/
private Float globalMarginBottom;
/**
* 全局页面背景色
*/
private Color globalBackgroundColor = Color.WHITE;
/**
* 全局页面背景图片
*/
private XEasyPdfImage globalBackgroundImage;
/**
* 全局页面水印
*/
private XEasyPdfWatermark globalWatermark;
/**
* 全局页眉
*/
private XEasyPdfHeader globalHeader;
/**
* 全局页脚
*/
private XEasyPdfFooter globalFooter;
/**
* pdf文档权限
*/
private XEasyPdfDocumentPermission permission;
/**
* pdf文档信息
*/
private XEasyPdfDocumentInfo documentInfo;
/**
* pdf文档书签
*/
private XEasyPdfDocumentBookmark bookmark;
/**
* 是否重置
*/
private Boolean isReset = Boolean.FALSE;
/**
* 获取临时存放路径
*
* @return 返回临时存放路径
*/
String getTempUrl() {
return (this.tempDir != null ? this.tempDir : "") + File.separatorChar + this.tempTargetList.size();
}
/**
* 初始化
*
* @param inputStream 输入流
* @param document pdf文档
*/
@SneakyThrows
void init(InputStream inputStream, XEasyPdfDocument document) {
// 初始化pdfBox源文档
this.source = PDDocument.load(inputStream, MemoryUsageSetting.setupMainMemoryOnly());
// 获取pdfBox页面树
PDPageTree pages = this.source.getPages();
// 遍历pdfBox页面树
for (PDPage page : pages) {
// 添加pdfBox页面
this.pageList.add(new XEasyPdfPage(page));
}
// 设置总页数
this.initTotalPage(pages.getCount());
// 初始化文档信息
this.initInfo(document);
}
/**
* 初始化任务
*
* @param document pdf文档
*/
@SneakyThrows
void initTarget(XEasyPdfDocument document) {
// 如果任务文档不为空,则关闭
if (this.target != null) {
// 关闭文档
this.target.close();
}
// 新建任务文档
this.target = new PDDocument();
// 如果源文档不为空,则设置文档表单
if (this.source != null) {
// 获取文档大纲
PDDocumentCatalog documentCatalog = this.target.getDocumentCatalog();
// 设置文档表单
documentCatalog.setAcroForm(this.source.getDocumentCatalog().getAcroForm());
// 设置文档目录
documentCatalog.setDocumentOutline(this.source.getDocumentCatalog().getDocumentOutline());
}
// 设置重置为false
this.isReset = Boolean.FALSE;
// 初始化字体
this.initFont(document);
}
/**
* 初始化页面
*
* @param document pdf文档
*/
@SneakyThrows
void initPage(XEasyPdfDocument document) {
// 定义pdfBox页面列表
List pdfboxPageList;
// 遍历pdf页面列表
for (XEasyPdfPage pdfPage : this.pageList) {
// pdf页面构建
pdfPage.build(document);
// 初始化pdfBox页面列表
pdfboxPageList = pdfPage.getPageList();
// 遍历pdfBox页面列表
for (PDPage page : pdfboxPageList) {
// 任务文档添加页面
PDPage importPage = this.target.importPage(page);
// 设置页面资源缓存
importPage.setResources(page.getResources());
}
// 获取pdfbox页面树
PDPageTree pageTree = this.target.getPages();
// 初始化pdfBox新增页面列表
pdfboxPageList = pdfPage.getNewPageList();
// 遍历pdfBox页面列表
for (PDPage page : pdfboxPageList) {
// 任务文档添加页面
pageTree.add(page);
}
}
// 嵌入字体
this.embedFont(this.fontCache.values());
}
/**
* 嵌入字体
*
* @param font pdfbox字体
*/
@SuppressWarnings("all")
@SneakyThrows
void embedFont(Collection fonts) {
if (fonts != null && !fonts.isEmpty()) {
Method method = this.target.getClass().getDeclaredMethod("getFontsToSubset");
method.setAccessible(true);
((Set) method.invoke(this.target)).addAll(fonts);
}
}
/**
* 初始化总页数
*
* @param count 加减数量
*/
void initTotalPage(int count) {
this.totalPage += count;
}
/**
* 获取生产者
*
* @return 返回生产者
*/
String getProducer() {
return PRODUCER;
}
/**
* 初始化字体
*
* @param document pdf文档
*/
private void initFont(XEasyPdfDocument document) {
if (this.fontPath == null) {
this.fontPath = this.defaultFontStyle.getPath();
}
this.font = XEasyPdfFontUtil.loadFont(document, this.fontPath, true);
}
/**
* 初始化文档信息
*/
private void initInfo(XEasyPdfDocument document) {
PDDocumentInformation documentInformation = this.source.getDocumentInformation();
this.documentInfo = new XEasyPdfDocumentInfo(document)
.setTitle(documentInformation.getTitle())
.setAuthor(documentInformation.getAuthor())
.setSubject(documentInformation.getSubject())
.setKeywords(documentInformation.getKeywords())
.setCreator(documentInformation.getCreator())
.setCreateTime(documentInformation.getCreationDate())
.setUpdateTime(documentInformation.getModificationDate());
}
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy