当前位置: 首页 > 面试题库 >

带有嵌入式HTML的PDF报告

太叔涵亮
2023-03-14
问题内容

我们有一个基于Java的系统,该系统从数据库中读取数据,将各个数据字段与预设XSL-FO标签合并,然后将结果转换为PDFwith Apache FOP

XSL-FO格式,它看起来是这样的:

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE Html [
<!ENTITY nbsp  "&#160;"> 
    <!-- all other entities -->
]>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <xsl:output method="xml" indent="yes" />
    <xsl:template match="/">

        <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:svg="http://www.w3.org/2000/svg" font-family="..." font-size="...">
            <fo:layout-master-set>          
                <fo:simple-page-master master-name="Letter Page" page-width="8.500in" page-height="11.000in">

                    <!-- appropriate settings -->

                </fo:simple-page-master>
            </fo:layout-master-set>
            <fo:page-sequence master-reference="Letter Page">

                <!-- some static content -->

            <fo:flow flow-name="xsl-region-body">
                    <fo:block>
                        <fo:table ...>
                            <fo:table-column ... />
                            <fo:table-body>
                                <fo:table-row>
                                    <fo:table-cell ...>
                                        <fo:block text-align="...">
                                            <fo:inline font-size="..." font-weight="...">
                                                <!-- Header / Title -->
                                            </fo:inline>
                                        </fo:block>
                                    </fo:table-cell>
                                </fo:table-row>
                            </fo:table-body>
                        </fo:table>
                    </fo:block>

                    <fo:block>

                        <fo:table ...>
                            <fo:table-column ... />
                            <fo:table-body> 
                                <fo:table-row>
                                    <fo:table-cell>
                                        <fo:block ...>
                                            <!-- Field A -->                                
                                        </fo:block>
                                    </fo:table-cell>
                                </fo:table-row>
                            </fo:table-body>
                        </fo:table>

                        <!-- Other fields in a very similar fashion as the above "Field A" -->

                    </fo:block>

                </fo:flow>

            </fo:page-sequence>

        </fo:root>

    </xsl:template>

</xsl:stylesheet>

现在,我正在寻找一种允许某些字段包含静态 HTML格式
内容的方法。此内容将通过我们的支持HTML编辑器生成(沿着线的东西CLEditorCKEditor等),或者从外部粘贴。

我的计划是遵循此JavaWorld文章的配方:

  • 用于JTidy将HTML格式的字符串转换为正确的XHTML
  • 从Antenna House 进一步修改xhtml2fo.xsl以删除所有文档范围和页面范围的转换
  • 将此修改后的XSLT应用于我的XHTML字符串(javax.xml.transform)
  • 使用XPath(javax.xml.xpath)提取根目录下的所有节点
  • 将结果直接输入到现有的XSL-FO文档中

我有这样的代码的准系统版本,并收到以下错误:

(错误的位置未知)org.apache.fop1.fo.ValidationException:“ {
http://www.w3.org/1999/XSL/Format }
table-body”不是“ fo:block”的有效子代!(没有可用的上下文信息)

我的问题:

  1. 解决此问题的方法是什么?
  2. 可以<fo:block>用作嵌套了其他对象(包括表)的通用容器吗?
  3. 这是解决任务的整体合理方法吗?

如果有人已经“ 在那里做过 ”,请分享您的经验。


问题答案:

解决问题的最佳方法是使用验证查看器/编辑器检查XSL FO。当您打开它们时,许多(例如oXygen)将向您显示XSL
FO结构中的错误,并且它们将描述问题(与报告的错误一样)。

在您的情况下,您显然有一个fo:table-body作为fo:block的子级。它不可能是。一个fo:table-
body只有一个有效的父对象fo:table。您可能缺少fo:table标记,或者在该位置错误地插入了fo:block。

我认为我做的事情可能略有不同。我会将XHTML内容内联到XSL
FO中,就在您需要的位置。然后,我将创建一个标识转换,复制所有基于fo的内容,但使用XSL转换XHTML部分。这样,您实际上可以在像oXygen这样的XSL编辑器中逐步进行转换,并查看错误发生的位置以及原因。像任何其他骗子一样。

注意:您可能还希望查看其他XSL,尤其是在HTML可能具有任何style =“”
CSS属性的情况下。如果不是纯HTML的情况,那么您将需要一种更好的方法,使用CSS到FO处理HTML。

http://www.cloudformatter.com/css2pdf基于此完整的转换。该常规样式表可在此处获得:http : //xep.cloudformatter.com/doc/XSL/xeponline-fo-
translate-2.xsl

我是该样式表的作者。它的功能远远超出您的要求,但是具有相当复杂的解析递归,可以将CSS样式转换为XSL FO属性。



 类似资料:
  • 问题内容: 我想在Python / Django中编写包含以下部分的HTML邮件: HTML链接到logo.png logo.png应该在邮件用户代理中内联显示(不作为附件显示) info.pdf,应显示为附件 如果邮件用户代理无法显示HTML,则应显示的文本。 我关注了这篇博客文章。 结果: HTML和内嵌图片有效 但info.pdf文件的处理方式类似于内联logo.png,并且某些邮件用户代理

  • 我需要将所有html报告转换为PDF。 这是一个nodejs应用程序,所以我找不到任何将html转换为pdf的核心模块。 所以我使用JAVA飞碟罐将html转换为PDF。除了html中嵌入的svg之外,其他一切都可以完美地工作。我在谷歌上搜索到了这个教程和Stackoverflow链接。我是一名nodejs开发人员,对java有基本的了解。我不知道如何将此代码与飞碟集成。 请指导我做什么 . 下面

  • 虽然它按预期工作,并嵌入了使用的字体子集,但我想知道是否有一种方法可以使生成的PDF文档完全不嵌入字体。当创建实例并将属性设置为并使用它们来生成各种PDF构建块时,就可以使用这种方法。在使用时,我正在寻找同样的行为。

  • null ServerEndpoint: 谢谢你。

  • 我在我的liferay自定义portlet中使用jasper报告,我用ireport 4.7.1设计了我的报告,但我的问题是为什么用html和pdf生成的报告有很大的差异。html格式和pdf格式的报告行有很大的差异。我如何使从同一个jasper文件生成的html和pdf报告完全相同。?我的意思是用相同的外观和感觉。下面是我的html和pdf报表片段 下面是我的jrxml文件,我从该文件生成。ja

  • 问题内容: 将PDF嵌入HTML的推荐方法是什么? iFrame? Object? Embed? Adobe对此有何评价? 就我而言,PDF是即时生成的,因此在刷新之前无法将其上传到第三方解决方案。 问题答案: 最好的方法可能是使用PDF.JS库。它是用于PDF文档的纯HTML5 / JavaScript渲染器,没有任何第三方插件。