日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

PDF生成器

發布時間:2023/12/10 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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);} }

    總結

    以上是生活随笔為你收集整理的PDF生成器的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。