Java/iText/Flying Saucer:将包含 svg 标签的 HTML 转换为 pdf

2023-12-20

我正在尝试从 HTML 生成 Java 中的 pdf 文件。 HTML 代码包含由 Google Charts API 生成的 svg 标签,用于显示柱形图。

我尝试用 Flying Saucer R8 来做到这一点,如下所示:

  StringBuffer sb = new StringBuffer();
    sb.append("<div id='chartArea'><svg width='830' height='400'><defs id='defs'><clipPath id='_ABSTRACT_RENDERER_ID_0'><rect x='45' y='77' width='560' height='247'/></clipPath></defs><rect x='0' y='0' width='830' height='400' stroke='none' stroke-width='0' fill='#ffffff'/><g><rect x='45' y='77' width='560' height='247' stroke='none' stroke-width='0' fill-opacity='0' fill='#ffffff'/><g clip-path='url(#_ABSTRACT_RENDERER_ID_0)'><g><rect x='45' y='323' width='560' height='1' stroke='none' stroke-width='0' fill='#cccccc'/><rect x='45' y='262' width='560' height='1' stroke='none' stroke-width='0' fill='#cccccc'/><rect x='45' y='200' width='560' height='1' stroke='none' stroke-width='0' fill='#cccccc'/><rect x='45' y='139' width='560' height='1' stroke='none' stroke-width='0' fill='#cccccc'/><rect x='45' y='77' width='560' height='1' stroke='none' stroke-width='0' fill='#cccccc'/></g><g><rect x='60' y='323.5' width='49' height='0' stroke='none' stroke-width='0' fill='#757575'/><rect x='140' y='323.5' width='49' height='0' stroke='none' stroke-width='0' fill='#757575'/><rect x='220' y='323.5' width='49' height='0' stroke='none' stroke-width='0' fill='#757575'/><rect x='300' y='323.5' width='49' height='0' stroke='none' stroke-width='0' fill='#757575'/><rect x='380' y='323.5' width='49' height='0' stroke='none' stroke-width='0' fill='#757575'/><rect x='460' y='323.5' width='49' height='0' stroke='none' stroke-width='0' fill='#757575'/><rect x='540' y='111' width='49' height='212' stroke='none' stroke-width='0' fill='#757575'/></g><g><rect x='45' y='323' width='560' height='1' stroke='none' stroke-width='0' fill='#333333'/></g></g><g/><g><g><text text-anchor='middle' x='85.42857142857143' y='343.05' font-family='Arial' font-size='13' stroke='none' stroke-width='0' fill='#222222'>2012-04-26</text></g><g><text text-anchor='middle' x='165.28571428571428' y='360.05' font-family='Arial' font-size='13' stroke='none' stroke-width='0' fill='#222222'>2012-04-27</text></g><g><text text-anchor='middle' x='245.14285714285717' y='343.05' font-family='Arial' font-size='13' stroke='none' stroke-width='0' fill='#222222'>2012-04-28</text></g><g><text text-anchor='middle' x='325' y='360.05' font-family='Arial' font-size='13' stroke='none' stroke-width='0' fill='#222222'>2012-04-29</text></g><g><text text-anchor='middle' x='404.8571428571429' y='343.05' font-family='Arial' font-size='13' stroke='none' stroke-width='0' fill='#222222'>2012-04-30</text></g><g><text text-anchor='middle' x='484.7142857142857' y='360.05' font-family='Arial' font-size='13' stroke='none' stroke-width='0' fill='#222222'>2012-05-01</text></g><g><text text-anchor='middle' x='564.5714285714286' y='343.05' font-family='Arial' font-size='13' stroke='none' stroke-width='0' fill='#222222'>2012-05-02</text></g><g><text text-anchor='end' x='39' y='328.05' font-family='Arial' font-size='13' stroke='none' stroke-width='0' fill='#444444'>0</text></g><g><text text-anchor='end' x='39' y='266.55' font-family='Arial' font-size='13' stroke='none' stroke-width='0' fill='#444444'>6</text></g><g><text text-anchor='end' x='39' y='205.05' font-family='Arial' font-size='13' stroke='none' stroke-width='0' fill='#444444'>12</text></g><g><text text-anchor='end' x='39' y='143.55' font-family='Arial' font-size='13' stroke='none' stroke-width='0' fill='#444444'>18</text></g><g><text text-anchor='end' x='39' y='82.05' font-family='Arial' font-size='13' stroke='none' stroke-width='0' fill='#444444'>24</text></g></g></g><g><g><text text-anchor='middle' x='17.05' y='200.5' font-family='Arial' font-size='13' font-style='italic' transform='rotate(-90 17.05 200.5)' stroke='none' stroke-width='0' fill='#222222'>Amount (USD)</text></g></g><g/></svg></div>");

    Document document = XMLResource.load(new ByteArrayInputStream(sb.toString().getBytes())).getDocument();
    ITextRenderer renderer = new ITextRenderer();
    renderer.setDocument(document,"test");
    String outputFile = "test.pdf";
    OutputStream os = new FileOutputStream(outputFile);
    renderer.layout();
    renderer.createPDF(os);
    os.close();

结果是生成的 PDF,其中包含图表的轴值,但不包含图表本身;即不包括图表图像。

任何想法或建议都会非常有帮助。

谢谢, 肖恩


希望您已经找到问题的解决方案 - 已经一个月了。

但是,如果您仍在寻找,并且您对要渲染为 PDF 的页面有足够的控制,您可以尝试使用蜡染(http://xmlgraphics.apache.org/batik/ http://xmlgraphics.apache.org/batik/)。我继承了一个较旧的 grails 应用程序,该应用程序从报表创建 PDF,当以网页形式查看时,该报表中确实包含 SVG。该代码首先从 SVG 元素创建一个 PNG,然后使用 iText 渲染器创建 PDF。

从蜡染项目页面,有对 PDF 生成的引用,但我找不到一个示例,该示例将采用包含一些 SVG 和一些“正常”标记的 DOM 并渲染为 PDF。

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

Java/iText/Flying Saucer:将包含 svg 标签的 HTML 转换为 pdf 的相关文章

  • 如何处理java.util.concurrent.ExecutionException异常?

    我的代码的某些部分抛出 java util concurrent ExecutionException 异常 我该如何处理这个问题 我可以使用 throws 子句吗 我对java有点陌生 这取决于您的任务关键程度Future是为了如何处理它
  • 有没有一种独立的JAVA可以在PC上运行而无需任何操作系统

    据我所知 java 程序可以在任何操作系统上运行 任何类型的机器都有 JVM 我需要一个在我的 PC 上独立运行的 JVM 而不是在我的操作系统 Windows 或任何其他操作系统 上运行 我的意思是 JVM 的作用类似于启动 而不是操作系
  • 具有“繁忙”线程的 threadPoolExecutor 如何被终止?

    我的问题有点复杂 让我尝试彻底解释一下 但如果您需要更多详细信息 请随时询问我 我会添加它们 我最近 通过实验 了解到 如果线程连续工作 例如 while true 循环中的整数运算 则中断线程对其没有影响 话题继续进行 就像什么都没发生一
  • 将 4 个字节转换为无符号 32 位整数并将其存储在 long 中

    我正在尝试用 Java 读取二进制文件 我需要读取无符号 8 位值 无符号 16 位值和无符号 32 位值的方法 执行此操作的最佳 最快 最美观的代码 是什么 我在 C 中做到了这一点 并做了类似的事情 uint8 t buffer uin
  • 为什么从 Eclipse 导出的可运行 JAR 不起作用?

    我有一个在 Eclipse 中运行良好的项目 但是 当我将其导出到可运行的 JAR 其中包含依赖项 时 它不会运行 从控制台运行 JAR 时出现的错误是 编辑 之前没有使用 jar 运行它 INFO Loading XML bean def
  • 使用 IntentService 使用 Camera2 拍照

    我正在尝试创建一个可以拍照但不显示预览的应用程序 使用本教程 https www youtube com watch v oPu42I0HSi4 https www youtube com watch v oPu42I0HSi4如果我使用和
  • 从 java.util.TimeZone 转换为 org.joda.DateTimeZone

    在Java中如何将一个实例转换为java util TimeZone to org joda DateTimeZone并保持夏令时 Joda Time 处于维护模式 The 乔达时间 http www joda org joda time
  • Android Studio 中没有参考文档

    昨天刚刚出现了一个新问题 当我将鼠标悬停在方法上或按 Ctrl Q 时 我通常会获取该特定方法的文档信息 但现在我只是得到 按 Ctrl QSharedPreferences getLong Following external urls
  • Java 内存错误:无法创建新的本机线程

    运行 java 服务器时 我在 UNIX 服务器上收到此错误 Exception in thread Thread 0 java lang OutOfMemoryError unable to create new native threa
  • 在 Java 中停止线程? [复制]

    这个问题在这里已经有答案了 我正在编写一段代码 该代码连接到服务器 使用该连接生成一堆线程并执行一堆 东西 在某些情况下 连接会失败 我需要停止一切并从头开始使用新对象 我想在对象之后进行清理 但在线程上调用 thread stop 但此方
  • 如何将选定的项目移动到列表顶部

    List
  • Hazelcast Jet 变更数据捕获

    我在我的应用程序中使用 Hazelcast 更改数据捕获 CDC 我使用 CDC 的原因是 如果使用 jdbc 或其他替代功能将数据加载到缓存中 会花费大量时间 所以CDC将在数据库和 Hazelcast Jet 之间进行数据同步 Stre
  • 如何跨工作区保存 E​​clipse 启动配置文件?

    当我复制 Eclipse 项目目录时 它包含 classpath 和 project 文件 这样当我将同一目录带到另一个 Eclipse 实例时 我不必设置我的构建路径等 假设所有资源都包含在在项目中 而不是外部 但是 此过程不会导致启动配
  • 使用java将文件从GCS存储桶传输到SFTP服务器

    我能够从 GCS 存储桶读取文件 但所有库都喜欢jsch将文件传输到 SFTP 服务器时会查找文件路径 而不是内存中的文件 我不想将从GCS读取的文件写入磁盘 如何将内存中的文件传输到SFTP 我假设您想上传内存中的数据 JSch 实际上有
  • java代码的等效vb代码

    谁能告诉我这段Java代码到底做了什么 SecureRandom random SecureRandom getInstance SHA1PRNG byte bytes new byte 20 synchronized random ran
  • 为什么我用Java计算的结果是错误的?

    我使用这段代码来计算一些东西 但几乎在所有情况下结果都是 0 0 为什么 编译器中没有警告或错误 private void jButton1ActionPerformed java awt event ActionEvent evt try
  • Maven 依赖冲突:org.w3c.dom.ElementTraversal

    我有一个 Java 代码库 它使用 Maven 进行依赖项解析并在 CI 上运行测试 经过最近的一批开发 大到足以很难识别重大更改 我的一些测试现在在通过 Maven 运行时失败了NoClassDefFoundError for org w
  • 如何在 iOS 上反转使用 CoreGraphics 渲染的 pdf 上的文本颜色?

    我正在使用开源 PDF 查看库 VFR PDF Readerhttps github com vfr Reader https github com vfr Reader 我正在尝试实现 夜间模式 或黑色背景与白色文本 我可以将背景设置为我
  • 使用用户名和密码登录 LinkedIn 失败

    LinkedIn使用oauth登录其api 服务器中无法登录api 我尝试使用http请求登录linkedin并获取oauth verifier 但我得到了这样的回应 很抱歉 出现了问题 你的申请 请确保您 启用cookie并重试 或点击此
  • java有类似C#的属性吗? [复制]

    这个问题在这里已经有答案了 C 属性 我的意思是 get 和 set 方法 是一个非常有用的功能 java 也有类似 C 的属性吗 我的意思是我们如何在 java 中实现类似以下 C 代码的内容 public string Name get

随机推荐

  • 访问类中的类属性的 Pythonic 方法

    我想知道您认为如何从类内的函数访问类属性 我还没有在 PEP8 中找到参考资料 也没有找到关于它的常见问题 例如 class MyClass object BAR 1 def foo self Way A print self BAR Wa
  • 边界椭圆

    我被分配了一个图形模块的作业 其中一部分是计算一组任意形状的最小外接椭圆 椭圆不必与轴对齐 这是使用 AWT 形状在 java euch 中工作的 因此我可以使用形状提供的所有工具来检查对象的包含 相交 您正在寻找椭圆体最小包围体积 htt
  • 在 AngularJS 字符串中使用 HTML 实体

    给定 scope 模型中包含 HTML 实体的字符串 如何确保该实体正确显示为 HTML 字符而不是文字字符串 HTML 实体 MDN 术语表 https developer mozilla org en US docs Glossary
  • 计算选项集合中出现次数的惯用方法

    我想计算选项集合中某个值出现的次数 let v vec Some 1 Some 1 Some 3 None v iter filter Some x x 1 count 这样做会给出refutable pattern not covered
  • 如何管理企业分发证书过期?

    我们的客户刚刚加入 iOS 开发者企业计划 他们已使用其企业发行版签署了该应用程序 由我们开发 并通过 MDM 在某些设备中成功安装了该应用程序 据我所知 当我的非企业分发证书到期时 我必须更新它 一旦设备根据 Apple 的 OCSP 服
  • 如何通过javascript检测浏览器中是否按下停止加载按钮?

    如何通过 javascript 检测浏览器中是否按下停止加载按钮或页面是否仍在加载 假设脚本到达浏览器并且在按下 停止加载按钮 时不会停止执行 这可能是一个可行的选择 使用它仍然可以有未加载的资源 但会给你一个良好的开端
  • 在小写和大写之间添加空格?

    当字符串中包含大写字符或下划线时 我想添加一个空格 我该怎么做呢 实施例1 您可以使用匹配小写字符后跟大写字符的正则表达式 并在以下字符之间添加可选的下划线 string output Regex Replace input a z A Z
  • 车把动态部分块

    我有一个像这样的文件夹结构 components foo index js foo handlebars foo scss bar index js bar handlebars bar handlebars 为了方便地解析组件部分 我提供
  • UIImagePickerController 第一次打开速度很慢,双击时除外

    我在 iOS 9 上遇到了这种非常奇怪的行为 我有一个tableViewCell这会打开一个imagePicker当点击拍摄某物的照片时 当您第一次点击单元格时 需要大约 10 秒才能打开选择器 但是当您点击它两次时 它会立即打开 选择器的
  • 将数据写入assets目录下的.properties文件

    我的资产文件夹中有 config properties 我尝试获取数据并将其写入该文件 当我尝试获取数据 getProperty 时 一切正常 但是何时写入 setProperty 我在日志和数据中收到 java io IOExceptio
  • Meteor:将 Mongo Selector 从客户端传递到服务器的最佳方法

    我有一个如下所示的 mongo 集合 Foo X 键 Bars 值 编辑 我来自关系数据库背景 显然我的收藏不像下面这样 但你明白了 Foo1 Foo2 Foo3 Barbar Barbar Bar bar Bar BarBar Bar b
  • 添加新项目时更新列表

    使用 Angular 7 我有以下服务 StackBlitz 示例 https stackblitz com edit mk angular sync list Injectable providedIn root export class
  • Plon:如何对文件夹项目进行排序

    我有一个名为myfolder 里面有一些项目 例如 item1 item2 item3 等等 当我添加 portlet 时Navigation到页面左栏 并输入到文件夹中myfolder 它向我展示了 portlet 上的链接 如下所示 i
  • 如何将变量和数据从 PHP 传递到 JavaScript?

    想要改进这篇文章吗 提供此问题的详细答案 包括引用和解释为什么你的答案是正确的 不够详细的答案可能会被编辑或删除 我在 PHP 中有一个变量 我在 JavaScript 代码中需要它的值 如何将我的变量从 PHP 转换为 JavaScrip
  • 使用 JPA 和 Hibernate 在 Persistence.xml 中配置 C3P0

    好吧 我第一次尝试使用 JPA Hibernate Spring 配置 C3P0 在 persistence xml 我有
  • pickerInput 默认选择所有选项

    我有大约十几个 pickerInputs 每次我运行我的闪亮应用程序时 所有内容都设置为没有选择 在输出工作之前我必须手动选择所有内容 这有点烦人 有没有办法让 pickerInput 在每次应用程序运行时默认 全选 您可以使用select
  • JavaScript 在 IE8 中不起作用

    我试图在页面加载时动态创建这个 html 元素 但是 当我运行它时 代码在 IE8 上不起作用 但在 Firefox safari 和其他浏览器中可以 function getmovie var container document get
  • React Hook - 只监听窗口 *宽度* 大小的变化

    我有一个可以听的钩子window resize事件 我只想听并更新window innerWidth变化 我希望忽略更改window innerHeight因为打开软键盘时会触发此操作 问题是 mediaSize 存储在我的 Redux S
  • 如何使用asp.net core razor Pages在CKEditor 5中上传图像

    ClassicEditor create document querySelector News Body language fa ckfinder uploadUrl URL catch error gt console error er
  • Java/iText/Flying Saucer:将包含 svg 标签的 HTML 转换为 pdf

    我正在尝试从 HTML 生成 Java 中的 pdf 文件 HTML 代码包含由 Google Charts API 生成的 svg 标签 用于显示柱形图 我尝试用 Flying Saucer R8 来做到这一点 如下所示 StringBu