总体逻辑
-
先设计一个pdf生成器 PdfGenerator
-
为生成器提供实现 DefaultPdfGenerator以及各种数据处理的实现,这里只有通用的几个实现
详细代码参见 https://download.csdn.net/download/shui878412/85931662
代码片段
DefaultPdfGenerator 默认生成器
@Slf4j
public class DefaultPdfGenerator<T> implements PdfGenerator {
// pdf上下文,用于存放配置和数据等
private PdfGeneratorContext<T> context;
// 处理器集合
private List<PdfResolver> resolvers;
@Override
public void generate() throws Exception {
try {
// 遍历处理器,并支持的处理器.
getResolvers().forEach(pdfResolver -> {
if (pdfResolver.supportsPdf(getContext())) {
OpResult opResult = pdfResolver.resolve(getContext());
if (!opResult.isSuccess()) {
setResult(opResult);
return;
}
}
});
if (getResult() == null) {
setResult(OpResult.createSuccessOpResult(getContext().getPdfData().getTargetPdfFileName()));
}
} finally {
//最后清理上下文数据
getContext().close();
}
}
}
PdfDocumentInitResolver:初始化处理器 用于构造PdfDocument
@Slf4j
public class PdfDocumentInitResolver<T> implements PdfResolver<T, String> {
@Override
public OpResult<String> resolve(PdfGeneratorContext<T> context) {
String errorMsg = "";
try {
//从上下文中获取要生成的pdf的文件全路径名,并构造出PdfDocument对象,放回到上下文中,以供后续处理器使用.
PdfDocument targetPdfDocument = new PdfDocument(new PdfWriter(context.getPdfData().getTargetPdfFileName(),
new WriterProperties()
.setCompressionLevel(CompressionConstants.BEST_COMPRESSION)
.setFullCompressionMode(true)));
context.setPdfDocument(targetPdfDocument);
return OpResult.createSuccessOpResult("OK");
} catch (Exception e) {
errorMsg = "PdfDocument初始化失败:" + e.getLocalizedMessage();
log.error(e.getMessage(), e);
}
return OpResult.createFailerOpResult(errorMsg);
}
}
PdfContentCleanResolver:页面页脚内容清除处理器
public class PdfContentCleanResolver<T> implements PdfResolver<T, String> {
private OpResult<String> cleanContent(PdfGeneratorContext<T> context){
String errorMsg = "";
PdfDocument pdfDocument = context.getPdfDocument();
PdfConfig pdfConfig = context.getPdfConfig();
List<PdfContentCleanConfig> pdfContentCleanConfigs = pdfConfig.getPdfContentCleanConfigs();
if (pdfContentCleanConfigs == null) {
pdfContentCleanConfigs = new ArrayList<>();
}
if (pdfContentCleanConfigs.isEmpty()) {
pdfContentCleanConfigs.add(new PdfContentCleanConfig());
}
// 依据上下文中的配置构造出需要清除的区域
List<PdfCleanUpLocation> cleanUpLocations = new ArrayList<PdfCleanUpLocation>();
for (PdfContentCleanConfig pdfContentCleanConfig : pdfContentCleanConfigs) {
float headerHeight = defaultHeaderHeight;
float footerHeight = defaultFooterHeight;
if (pdfContentCleanConfig != null) {
headerHeight = getPositiveFloatValue(pdfContentCleanConfig.getHeaderHeight(), pdfContentCleanConfig.getHeight(),defaultHeaderHeight);
footerHeight = getPositiveFloatValue(pdfContentCleanConfig.getFooterHeight(), pdfContentCleanConfig.getHeight(),defaultFooterHeight);
}
int pageCount = pdfDocument.getNumberOfPages();
for (int i = 0; i < pageCount; i++) {
int pageIndex = i+1;
if(ArrayUtil.contains(pdfContentCleanConfig.getExcludePages(),pageIndex)){
continue;
}
Rectangle pageSize = pdfDocument.getPage(pageIndex).getPageSize();
if (pdfContentCleanConfig.isCleanHeader()) {
// 清除页眉.
cleanUpLocations.add(new PdfCleanUpLocation(pageIndex, new Rectangle(pageSize.getLeft()
, pageSize.getTop()-headerHeight, pageSize.getWidth(), headerHeight),
ColorConstants.WHITE));
}
if (pdfContentCleanConfig.isCleanFooter()) {
// 清除页脚.
cleanUpLocations.add(new PdfCleanUpLocation(pageIndex, new Rectangle(pageSize.getLeft()
, pageSize.getBottom(), pageSize.getWidth(), footerHeight),
ColorConstants.WHITE));
}
if (pdfContentCleanConfig.isCleanRange() && pdfContentCleanConfig.getLeft() > -1
&& pdfContentCleanConfig.getTop() > -1 && pdfContentCleanConfig.getHeight() > 0) {
// 清除指定区域.
cleanUpLocations.add(new PdfCleanUpLocation(pageIndex, new Rectangle(pdfContentCleanConfig.getLeft()
, pdfContentCleanConfig.getTop(), pdfContentCleanConfig.getWidth(), pdfContentCleanConfig.getHeight()),
ColorConstants.WHITE));
}
}
}
try {
// 清除pdfDocument中的所有页的指定区域的内容
PdfCleaner.cleanUp(context.getPdfDocument(), cleanUpLocations);
return OpResult.createSuccessOpResult("OK");
} catch (IOException e) {
log.error(e.getMessage(), e);
errorMsg = "清除内容出错:"+e.getLocalizedMessage();
}
return OpResult.createFailerOpResult(errorMsg);
}
}