PDF生成器

4 篇文章 0 订阅

总体逻辑

在这里插入图片描述

  1. 先设计一个pdf生成器 PdfGenerator

  2. 为生成器提供实现 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);
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蜗牛_snail

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值