PDF生成器
總體邏輯
先設計一個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;@Overridepublic 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> {@Overridepublic 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);} }總結
- 上一篇: java spark环境配置文件_JAV
- 下一篇: java web开发myeclipse_