Java 将 XML 文档渲染为 PDF

2023-12-23

我有一个 XML 文档,当前存储为内存字符串,并且希望将其呈现为 PDF。换句话说,PDF 内容将是 XML 文档。该方法呈现的 XML 是通用的——可能会发送多种类型的 XML 文档。

我在弄清楚如何使用各种基于 Java 的框架来完成任务时遇到了一些困难。

阿帕奇FOP

该框架似乎需要将文档中的 XML 元素特定转换为 FOP 实体。由于问题中的方法必须接受通用 XML,因此我认为这个框架不符合我的要求。

iText

我尝试使用 iText/Flying Saucer (org.xhtmlrenderer) 的组合来渲染文档,虽然它确实渲染了 PDF,但内容仅包含空格分隔的数据值,没有 xml 元素或属性。使用下面的代码和测试数据:

File

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <elem1>value1</elem1>
  <elem2>value2</elem2>
</root>

Code

File inputFile = new File(PdfGenerator.class.getResource("test.xml").getFile());
OutputStream os = new FileOutputStream("c:\\temp\\Sample.pdf");
ITextRenderer renderer = new ITextRenderer();
renderer.setDocument(inputFile);
renderer.layout();
renderer.createPDF(os);
os.close();  

生成包含内容值的 PDFvalue1 value2,但没有标签。

我的问题是有人可以提供一个代码片段,用于使用上述框架之一呈现包含 XML 内容的 PDF,或者是否有其他框架更适合我的需求?

Edit:我意识到有人问了同样的问题here https://stackoverflow.com/questions/7634950/print-xml-in-pdf-using-itext?rq=1,但似乎提出的解决方案需要深入了解 css 文件中传入的 XML 文档的结构。


只是为了给出一个使用 fop 的例子 - 这里你已经有了。为了让每个人都能遵循这一点,我使用了 fop 命令行工具。

可以在 Java 代码中轻松执行相同的操作,然后您无需随时将 xml 作为文件。

生成 PDF 的 XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">

<xsl:template match="/">
<fo:root>
  <fo:layout-master-set>
    <fo:simple-page-master master-name="content"
        page-width="210mm" page-height="297mm" margin="20mm 20mm 20mm 20mm">
      <fo:region-body/>
    </fo:simple-page-master>
  </fo:layout-master-set>
  <fo:page-sequence master-reference="content">
    <fo:flow flow-name="xsl-region-body">
      <fo:block>
        <xsl:apply-templates />
    </fo:block>
    </fo:flow>
  </fo:page-sequence>
</fo:root>
</xsl:template>

<xsl:template match="@*">
  <xsl:text> </xsl:text>
  <xsl:value-of select="name()" />
  <xsl:text>="</xsl:text>
    <xsl:value-of select="." />
  <xsl:text>"</xsl:text>
</xsl:template>

<xsl:template match="*">
  <xsl:param name="indent">0</xsl:param>
  <fo:block margin-left="{$indent}">
    <xsl:text>&lt;</xsl:text>
    <xsl:value-of select="name()" />
    <xsl:apply-templates select="@*" />
    <xsl:text>&gt;</xsl:text>
    <xsl:apply-templates>
      <xsl:with-param name="indent" select="$indent+10" />
    </xsl:apply-templates>
    <xsl:text>&lt;/</xsl:text>
    <xsl:value-of select="name()" />
    <xsl:text>&gt;</xsl:text>
  </fo:block>
</xsl:template>

</xsl:stylesheet>

我们将此文件称为 xml2pdf.xsl

代码的简短解释

  • 模板 match="/" 主要构建 pdf,除了调用其他模板匹配方法或更精确的模板 match="*" 的行之外。

  • 模板匹配=“" 写入元素开始和结束并调用,进而调用模板 match="@“对于元素中的每个属性(如果有)。最后它调用

  • 通过 with-param 语句中的 select="$indent+10" 属性,模板每达到一个级别,缩进参数就会增加 10。

使用代码

# fop -xsl xml2pdf.xsl -xml sample.xml -pdf result.pdf
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 将 XML 文档渲染为 PDF 的相关文章

随机推荐

  • gcc 中的 -ffreestand 选项是什么?

    What is ffreestanding在海湾合作委员会 它是干什么用的 我遇到了以下情况 gcc ffreestanding m32 c kernel c o kernel o 并且不明白 这到底是什么意思 A freestanding
  • 如何找出 SQL Server 中哪些表访问最多或使用最频繁

    我目前的情况是 我需要找出哪些表被频繁使用 或者在给定的一段时间内我们的应用程序中使用的次数 假设从某个开始日期到结束日期 我想在这里获得的详细信息是表名及其被访问的次数 例如 tableName No Of Access Table5 1
  • 如何在 MVVM WPF 应用程序中取消窗口关闭

    单击 取消 按钮 或右上角的 X 或 Esc 后如何取消从特定表单退出 WPF
  • FlashDevelop Haxe (Flash) 调试器

    FlashDevelop中有Haxe的调试器吗 FlashDevelop 现在附带一个运行良好的 Haxe 调试器 仅限 Flash 目标
  • 是否可以在 Web 浏览器上运行与 SDL+OpenGL 代码绑定的 C++?

    我的客户希望她的网站有一个渲染 3D 的应用程序 浅 3D 的东西 我们在 3D 世界中只绘制平面正方形 但网络编程不是我的专长 所以我正在寻找可以从网络浏览器运行 C 程序的东西 但我想 如果是这样的话 那么客户端必须先下载程序 而这不是
  • 根据用户选择禁用单选按钮

    我有 2 组单选按钮 每组有 4 个选项 这 4 个选项在两个类别中都是相同的 我不想允许在两个类别中进行相同的选择 例如 如果在第一类别中选择选项 1 则用户现在只能从第二类别中的选项 2 3 4 中进行选择 这个问题之前已经被问过 但似
  • 从设置禁用权限并返回到我们的应用程序后崩溃

    当当前 Activity 跳转到系统设置页面禁用权限然后再次切换当前 Activity 时 应用程序崩溃 第 1 步 打开应用程序并授予所有必要的权限 第 2 步 单击 主页 按钮 因此应用程序处于后台 第 3 步 在 设置 中手动更改权限
  • “电子邮件不能为空”使用用户名或电子邮件设计

    我正在关注这个操作方法如何 允许用户使用用户名或电子邮件地址登录 https github com plataformatec devise wiki How To Allow users to sign in using their us
  • 如何使用 ASP.NET MVC + SignalR 强制服务器不断发送事件数据?

    ExportClient班级有OnTickRecieved事件 这可以帮助我接收一些数据 来自市场的出价 我想要的只是在浏览器中的图表上实时接收这些数据 当我按下GoUI 端的按钮 它调用Go 控制器中的方法 然后什么也没有发生 这是合乎逻
  • 棘手的指针问题

    我在过去的关于 c 中指针的考试问题上遇到了麻烦 这是我从这个链接找到的 http www cl cam ac uk teaching exams pastpapers y2007p3q4 pdf http www cl cam ac uk
  • Task.ContinueWith() 父任务不等待子任务完成[重复]

    这个问题在这里已经有答案了 自从我了解Task在嵌套任务的上下文中 我真的不明白 为什么在第二次打印之前进行第三次打印 尽管我已经用过Task WaitAll t 它打印3rd之前一行2nd line Code public static
  • 修改 LESS 变量的 alpha 不透明度

    使用 LESS 我知道我可以更改颜色变量的饱和度或色调 看起来像这样 background lighten blue 20 不过 我想改变颜色的 alpha 不透明度 最好是这样的 background alpha blue 20 有没有一
  • SQL:如何将视图与表连接?

    UPDATED 我正在使用 MySQL 语句创建视图 如果编辑寄出的图书超过 50 本书 我需要显示他们的名字 姓氏和城市 我的三张表是 create table editors ed id char 11 ed lname varchar
  • 禁用 VS Code 中的特定编译器警告

    我想知道如何抑制 VS Code 中的特定编译器警告对于整个项目 我见过这个问题 是否可以禁用特定的编译器警告 https stackoverflow com questions 22536518 is it possible to dis
  • 如何使用 CultureInfo 格式化已弃用的货币?

    在 dotnet 中 以特定于文化的方式格式化货币的推荐方法是 据我所知 using System Globalization var info CultureInfo GetCultureInfo en GB return string
  • 节点组的位置在 SCNNode.runAction 开始时重置

    我有一些代码 当点击屏幕时 它会围绕 x 轴旋转多个 SCNNode 如下所示 func handleTap gestureRecognize UIGestureRecognizer let sceneView self view as S
  • 光栅图像似乎使用 R 的传单进行了移动

    我想使用 R 中的 leaflet 包绘制一些空间数据 但是生成的光栅图像与参考网格相比似乎发生了偏移 我怀疑地图投影问题 但我不是该主题的专家 因此任何帮助将不胜感激 这是绘制地图的最小代码 library leaflet library
  • 如何删除临时消息

    我正在尝试找出一种机制 将临时消息发布给用户 然后将其删除并替换为所有人都可见的消息 与 giphy 类似的行为 其中 Slash 命令显示交互式临时消息 并在用户决定发送哪个 gif 后创建频道消息 我也对更新临时消息感到好奇 我认为如果
  • Bootstrap 5 带有 html 内容的弹出窗口

    我试图将 bootstrap5 弹出窗口内容与 HTML 属性分开 就像对其他组件所做的那样 但我无法让它工作 var popoverTriggerList slice call document querySelectorAll data
  • Java 将 XML 文档渲染为 PDF

    我有一个 XML 文档 当前存储为内存字符串 并且希望将其呈现为 PDF 换句话说 PDF 内容将是 XML 文档 该方法呈现的 XML 是通用的 可能会发送多种类型的 XML 文档 我在弄清楚如何使用各种基于 Java 的框架来完成任务时