java – 具有嵌入式HTML的PDF报告

我们有一个基于 Java的系统,可以从数据库中读取数据,将各个数据字段与预设的XSL-FO标签合并,并将结果转换为PDF格式的PDF 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的编辑器(与CLEditor,CKEditor等相似的内容)生成,或从外部粘贴.

我的计划是遵循食谱from this JavaWorld article

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

我有一个裸骨版本的这样的代码,并得到以下错误

(Location of error unkNown)org.apache.fop1.fo.ValidationException:
“{07002}table-body” is not a valid child
of “fo:block”! (No context info available)

我的问题:

>解决这个问题的方法是什么?
> Can< fo:block>用作嵌套在其中的其他对象(包括表)的通用容器?
这是解决任务的总体合理方法吗?

如果有人已经“在那里做了”,请分享你的经验.

解决方法

解决问题的最佳方法是使用验证的查看器/编辑器来检查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部分.这样,您可以在XSL编辑器(如oXygen)中实际进行该转换,并查看发生错误的原因以及为什么.像其他任何人一样.

注意:您也可以查看其他XSL,特别是如果您的HTML可能有任何style =“”CSS属性.如果是这种情况,它不是简单的HTML,那么您将需要一个更好的方法来处理HTML到CSS.

http://www.cloudformatter.com/css2pdf是基于这个完整的转换.一般样式表可在这里http://xep.cloudformatter.com/doc/XSL/xeponline-fo-translate-2.xsl

我是那个样式表的作者.它比你所要求的要多得多,但是将一个相当复杂的解析递归用于将CSS样式转换为XSL FO属性.

相关文章

最近看了一下学习资料,感觉进制转换其实还是挺有意思的,尤...
/*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不...
/*list 基本操作 * * List a=new List(); * 增 * a.add(inde...
/* * 内部类 * */ 1 class OutClass{ 2 //定义外部类的成员变...
集合的操作Iterator、Collection、Set和HashSet关系Iterator...
接口中常量的修饰关键字:public,static,final(常量)函数...