Apache FOP实践——pdf模板引擎

文章目录

    • 基本概念
    • 设计思想
    • 具体实践
    • 完整应用

基本概念

Apache FOP(Formatting Objects Processor)是一个基于Java的开源工具,用于将 XSL-FO(XSL Formatting Objects) 文档转换为PDF、图像等格式。

设计思想

将内容(XML数据)与样式(XSL-FO布局描述)分离,通过模板引擎(XSLT)将两者结合,最终由FOP引擎渲染为PDF。这种设计借鉴了Web开发中"数据-视图分离"的模式,但针对打印/PDF场景进行了深度优化。体现了 “内容与样式分离” 和 “声明式布局” 的核心哲学。

具体实践

结合 XSLT 和 XML 数据源,实现强大的PDF模板引擎功能。

pdf模板引擎——产品手册

pdf模板引擎——采购单

pdf模板引擎——销售收据

pdf模板引擎——自定义模板

完整应用

antrcp-Assistant(蚂蚁离线助手)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/91152.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/91152.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WebRTC核心组件技术解析:架构、作用与协同机制

引言:WebRTC的技术定位与价值 WebRTC(Web Real-Time Communication)作为一项开源实时通信标准,已成为浏览器原生音视频交互、P2P数据传输的技术基石。自2011年开源以来,其标准化进程由W3C(API层&#xff0…

OmniParser:提升工作效率的视觉界面解析工具

OmniParser:基于视觉的用户界面解析工具在现代软件开发中,用户界面的自动化处理变得愈发重要。OmniParser 是一个强大的工具,旨在将用户界面的截图解析为结构化的、易于理解的元素,从而显著提升了大型语言模型(如GPT-4…

C#程序员计算器

使用C#语言编写程序员计算器,使其能够进行加减乘除和与或非等逻辑运算。 calculator.cs 代码如下 using System; using System.Numerics; using System.Globalization;namespace Calculator1 {public enum CalcBase { Bin 2, Oct 8, Dec 10, Hex 16 }public en…

国产音频DA转换芯片DP7361支持192K六通道24位DA转换器

产品概述 DP7361 是一款立体声六通道线性输出的数模转换器,内含插值滤波器、Multi-Bit 数模转换 器、模拟输出滤波器,支持主流的音频数据格式。 DP7361 片上集成线性低通模拟滤波器和四阶 Multi-Bit Δ-∑调制器,能自动检测信号频率和主时钟频…

【C51单片机四个按键控制流水灯】2022-9-30

缘由C51,四个按键控制流水灯-嵌入式-CSDN问答 #include "REG52.h" sbit k1P3^0; sbit k2P3^1; sbit k3P3^2; sbit k4P3^3; unsigned char code lsd[]{127,191,223,239,247,251,253,254};//跑马灯 void jsys(unsigned char y,unsigned char s){unsigned c…

Python 脚本:获取公网 IPv4 和 IPv6 地址

本方案适合拨号宽带网络环境,当检测到公网IP地址变更时,可联动自动触发MQTT消息推送或邮件通知,实现动态IP的实时监控与告警。 0x01 代码import re import time import requestsdef extract_ip(html):"""用正则提取 IP&…

数字化转型-制造业未来蓝图:“超自动化”工厂

超自动化:2040年未来工厂的颠覆性蓝图工业革命250年后的新一轮范式革命 (埃森哲:未来的制造:超自动化工厂蓝图有感)🔄 从机械化到超自动化:制造业的第五次进化 自18世纪工业革命始,…

Java 15 新特性解析与代码示例

Java 15 新特性解析与代码示例 文章目录Java 15 新特性解析与代码示例引言1. 密封类(Sealed Classes)1.1. 什么是密封类?1.2. 为什么使用密封类?1.3. 语法1.4. 与传统方法的对比1.5. 使用场景1.6. 示例:结合模式匹配2.…

Vue 3 入门教程 - 1、基础概念与环境搭建

一、Vue 3 简介 Vue.js 是一款流行的 JavaScript 前端框架,用于构建用户界面。Vue 3 作为其最新版本,带来了诸多令人瞩目的新特性与性能优化,为开发者打造了更为高效、灵活的开发体验。 1.1 Vue 3 的优势 性能提升:对虚拟 DOM …

SpringBoot之多环境配置全解析

SpringBoot之多环境配置全解析一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1. 基础配置文件(application.properties)2. 环境专属配置文件2.2 yaml/yml格式(推荐)1. 单文…

uvm-tlm-nonblocking-get-port

前文展示了使用本质为阻塞性质的uvm_blocking_get_port TLM端口的示例,其中接收方会停滞等待发送方完成get任务。类似地,UVM TLM还提供非阻塞类型的uvm_nonblocking_get_port,发送方需通过try_get来检测get是否成功,或通过can_get…

【NCS随笔】如何在hello_world添加蓝牙功能(一)

如何在hello_world添加蓝牙功能(一)环境准备 硬件:nRF54L15DK 软件版本:NCS3.0.2 例程:hello_world 宏的配置 # Config loggerCONFIG_LOGyCONFIG_USE_SEGGER_RTTyCONFIG_LOG_BACKEND_RTTyCONFIG_LOG_BACKEND_UARTnONFI…

机器学习——KNN实现手写数字识别:基于 OpenCV 和 scikit-learn 的实战教学 (超级超级超级简单)

用KNN实现手写数字识别:基于 OpenCV 和 scikit-learn 的实战教学在这篇文章中,我们将使用 KNN(K-Nearest Neighbors)算法对手写数字进行分类识别。我们会用 OpenCV 读取图像并预处理数据,用 scikit-learn 构建并训练模…

【Git】分支

文章目录理解分支创建分支切换分支合并分支删除分支合并冲突分支管理策略分支策略bug 分支删除临时分支小结理解分支 本章开始介绍 Git 的杀手级功能之一(注意是之一,也就是后面还有之二,之三……):分支。分支就是科幻…

【32】C# WinForm入门到精通 ——打开文件OpenFileDialog 【属性、方法、事件、实例、源码】

WinForm 是 Windows Form 的简称,是基于 .NET Framework 平台的客户端(PC软件)开发技术,是 C# 语言中的一个重要应用。 .NET 提供了大量 Windows 风格的控件和事件,可以直接拿来使用。 本专栏内容是按照标题序号逐渐…

Wan2.2开源第1天:动态灯光功能开启创意氛围新境界

在开源软件蓬勃发展的今天,每一次新版本的发布都如同在创意的星空中点亮了一颗璀璨的新星。今天,(通义万相国际版wan)Wan2.2正式开源,它带着令人眼前一亮的动态灯光功能惊艳登场,为所有追求创意与氛围营造的…

Excel制作滑珠图、哑铃图

Excel制作滑珠图、哑铃图效果展示在较长时间周期内,很多参数都是在一定范围内浮动的,并不是一成不变的,为了直观表达各类别的浮动范围,使用“滑珠图”就是一个不错的选择,当滑珠图两侧均有珠子的时候,又称为…

Day07 JDBC+MyBatis

1.JDBC入门程序2.JDBC执行DQL语句3.JDBC预编译SQL 防止SQL注入随便输入用户名,密码为or1 1,sql注入4.Mybatis入门 Mapper 持久层XxxMapper替代Dao4.1调用接口的findAll()方法时自动执行上方的SQL语句,并将SQL查询的语句自动封装到返回值中5.Mybatis辅助…

OSS-服务端签名Web端直传+STS获取临时凭证+POST签名v4版本开发过程中的细节

这里写自定义目录标题配置OSS服务端代码初始化STS Client获取STS临时凭证创建policy计算SigningKeyOSSUtil.javaSTSPolicyDTO.java提供接口Apifox模拟Web端文件直传本文主要结合服务端STS获取临时凭证(签名)直传官方文档对开发中比较容易出错的地方加以提醒;建议主要…

uniapp实现微信小程序导航功能

1.导航按钮<button click"navigation()">导航到仓库</button>2.导航功能const navigation (item) > {let address item.province item.city item.district item.address //地址let latitude Number(item.latitude) …