当前位置: 首页 > 知识库问答 >
问题:

Apache Fop异常

禹正阳
2023-03-14

我正在使用fop将fo文件转换为pdf。请参阅例外:

org.apache.fop.fo.ValidationException: Invalid property encountered on "fo:block-container": display (See position 44:73)

我使用jTidy转换xhtml和xalan从antennahouse将xhtml转换为xsl样式的fo文件。

它是fo文件的第44行:

<fo:block-container role="html:div" display="inline-block" width="30px"><fo:block start-indent="0pt" end-indent="0pt">Prov:</fo:block></fo:block-container>

如何解决这个问题。谢谢

更新:XHTML 代码

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
   <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
   <title>Untitled Document</title>
   <style type="text/css">
      * {
         margin: 0;
         padding: 0;
         font-family: Arial, Helvetica, sans-serif;
         font-size: 12px;
         color: #333;
      }

      table.iss-account-aging-page {
         border-collapse: collapse;
         margin: 0 auto;
         width: 100%;
         font-size: 12px;
         padding: 0;
         color: #000;
         border: 1px solid #666;
      }

      table.iss-account-aging-page tr {
         page-break-inside: avoid;
      }

      table.iss-account-aging-page tr th {
         text-align: center;
         padding: 3px;
         font-weight: bold;
         color: #165ba8;
         font-size: 12px;
         border-bottom: 1px solid #666;
      }

      table.iss-account-aging-page tr th span {
         color: #165ba8;
      }

      table.iss-account-aging-page tr td {
         padding: 3px;
         font-size: 12px;
         color: #000;
         border-bottom: 1px solid #666;
      }

      .iss-page-print-report-patient-left-info {
         margin: 0 0 6px 0;
      }

      label.iss-page-print-report-patient-left-info {
         width: 60px;
         float: left;
         text-align: right;
         margin: 0 4px 0 0;
         display: block;
         clear: both;
         font-weight: bold;
         color: #444;
         font-size: 11px;
      }

      .iss-account-aging-page-practice-name {
         color: #2288FD;
         font-family: Georgia, "Times New Roman", Times, serif;
         font-size: 18px;
         font-weight: bold;
         text-align: center;
         width: 100%;
      }

      table.iss-account-aging-page-footer-tbl {
         float: right;
         border-collapse: collapse;
         margin-top: 10px;
         width: 60%;
         font-size: 12px;
      }

      table.iss-account-aging-page-footer-tbl tr td {
         border: 1px solid #666;
         padding: 3px 0;
         color: #045e98;
         text-align: center;
      }

      table.iss-account-aging-page-footer-tbl tr th {
         text-align: center;
         text-transform: uppercase;
         font-weight: bold;
         color: #03628b;
         border: 1px solid #666;
         padding: 3px 0;
      }

   </style>
</head>

<body>
<div style="width:795px; margin:5px auto; overflow:hidden; padding:0;">
   <div class="iss-account-aging-page-practice-name">
      Sonas DDS             
   </div>
   <div style="float:left; margin-left:10px; padding-bottom:5px;">
      <p>ADdress </p>

      <p>Montclair, CA 91763</p>

      <p>Phone:&nbsp;<span>111-111-1111</span></p>

      <p>Fax:&nbsp;<span></span></p>
   </div>
   <div style="clear:both; margin: 5px 0 5px 0; border-top: 1px solid #ccc;"></div>
   <div style="padding-left: 10px;"><span style="font-weight:bold;">Date:&nbsp;</span>11/07/2014</div>
   <div style="clear:both; text-align:center; margin-bottom: 10px;">
      <p style="font-family: Georgia, Times New Roman,Times,serif; font-size: 16px; font-weight: bold; text-transform: uppercase">
         Reports
      </p>
   </div>
   <table class="iss-account-aging-page-footer-tbl">
      <tr>
         <th>0 - 30 DAYS</th>
         <th>31 - 60 DAYS</th>
         <th>61 - 90 DAYS</th>
         <th>91+ DAYS</th>
      </tr>
      <tr>
         <td>$0.00</td>
         <td>$0.00</td>
         <td>$0.00</td>
         <td>$3,748,199.10</td>
      </tr>
   </table>
   <div style="clear:both;">&nbsp;</div>

   <table class="iss-account-aging-page">
      <tr>
         <th colspan="2">PATIENT INFORMATION</th>
         <th style="text-align:right;">0-30</th>
         <th style="text-align:right;">31-60</th>
         <th style="text-align:right;">61-90</th>
         <th style="text-align:right;">91+</th>
      </tr>
                     <tr>
            <td style="width:174px; vertical-align:top; padding-left:4px; padding-right:26px;">
               <p style="font-family: Georgia, Times New Roman,Times,serif; font-size: 13px; font-weight: bold;">A Patient</p>

                                 <p>ADdress2</p>

                                 <p style="padding-bottom: 6px;">LA</p>

               <p style="padding-bottom: 6px;">E-Mail: &nbsp;</p>

               <div style="float:left; padding-bottom: 6px;">
                  <div style="display: inline-block; width: 30px;">Item:</div>
                  <div style="display: inline-block;">item info</div>
               </div>
               <div style="clear: both;"></div>
               <p style="padding-bottom: 6px;">item 2: item info</p>

               <p style="padding-bottom: 6px;">item 3: item info</p>
            </td>
            <td style="width:166px; vertical-align:top;">
               <p class="iss-page-print-report-patient-left-info">
                  <label class="iss-page-print-report-patient-left-info">Phone:</label>(H) 111-111-1111
               </p>
               <p class="iss-page-print-report-patient-left-info">
                  <label class="iss-page-print-report-patient-left-info">&nbsp;</label>(M) &nbsp;
               </p>

               <p class="iss-page-print-report-patient-left-info">
                  <label class="iss-page-print-report-patient-left-info">&nbsp;</label>(O) &nbsp;
               </p>

               <p class="iss-page-print-report-patient-left-info" style="text-transform: capitalize">
                  <label class="iss-page-print-report-patient-left-info">Status:</label>Single
               </p>

               <p class="iss-page-print-report-patient-left-info">
                  <label class="iss-page-print-report-patient-left-info">ID:</label>123456
               </p>

               <p class="iss-page-print-report-patient-left-info" style="text-transform: capitalize">
                  <label class="iss-page-print-report-patient-left-info">Gender:</label>Male
               </p>

               <p class="iss-page-print-report-patient-left-info">
                  <label class="iss-page-print-report-patient-left-info">Birth Date:</label>&nbsp;
               </p>
            </td>
            <td style="vertical-align:top; width:70px;">
               <div style="text-align:right;">$0.00</div>
            </td>
            <td style="vertical-align:top; width:70px;">
               <div style="text-align:right;">$0.00</div>
            </td>
            <td style="vertical-align:top; width:70px;">
               <div style="text-align:right;">$0.00</div>
            </td>
            <td style="vertical-align:top; width:70px;">
               <div style="text-align:right;">$2,950.00</div>
            </td>
         </tr>
    </table>
</div>
</body>
</html>

这是我的java代码

FileInputStream FIS= null;
      try {
         //tidy
         FIS = new FileInputStream("D:\\Test.xhtml");
         FileOutputStream FOS = new FileOutputStream("D:\\testXHTML.xHtml");
         Tidy T=new Tidy();
         T.setXHTML(true);
         Document D = T.parseDOM(FIS,FOS);

         //xalan
         DOMSource xmlDomSource = new DOMSource(D);
         DOMResult domResult = new DOMResult();
         Transformer transformerXalan = getTransformer("D:\\Test\\xhtml2fo-xsl-read-only\\xhtml2fo.xsl");
         transformerXalan.transform(xmlDomSource, new StreamResult(new FileOutputStream("D:\\result.fo")));

         //fop
         FopFactory fopFactory = FopFactory.newInstance();
         OutputStream out = new BufferedOutputStream(new FileOutputStream(new File("D:/myfile.pdf")));
         org.apache.fop.apps.Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, out);
         TransformerFactory factory = TransformerFactory.newInstance();
         Transformer transformer = factory.newTransformer(); // identity transformer
         Source src = new StreamSource(new File("D:\\result.fo"));
         Result res = new SAXResult(fop.getDefaultHandler());
         transformer.transform(src, res);
         out.close();
      } catch (Exception e) {
         e.printStackTrace();
      }

共有1个答案

汪德明
2023-03-14

因此,您使用AntennaHouse的XSLT样式表将xhtml转换为fo,然后使用Apache FOP生成pdf输出。

这些样式表开头的注释指出(添加了强调):

由于此样式表最初是由Antenna House开发用于XSL格式,因此它可能与其他XSL-FO处理器不兼容。

因此,其他格式化程序的输出出现问题并不奇怪;特别是,XSL格式化程序支持CSS属性(其中显示),而FOP不支持。

但是,可以通过使用标准的fo元素和属性来实现所需的输出(具有固定宽度的内联堆叠区域),特别是inline-容器s:

<fo:block>
    <!-- first "inline block" -->
    <fo:inline-container role="html:div" width="40px">
        <fo:block start-indent="0pt" end-indent="0pt" background-color="#AAFFFF">Alpha</fo:block>
    </fo:inline-container>
    <!-- second "inline block" -->
    <fo:inline-container role="html:div" width="40px">
        <fo:block start-indent="0pt" end-indent="0pt" background-color="#FFAAFF">Beta</fo:block>
    </fo:inline-container>
    <!-- third "inline block" -->
    <fo:inline-container role="html:div" width="40px">
        <fo:block start-indent="0pt" end-indent="0pt" background-color="#FFFFAA">A a a a a a a</fo:block>
    </fo:inline-container>
    ...
</fo:block>

编辑:我忘记提到建议的解决方案适用于FOP的主干版本,因为fo: inline-的容器的实现是在FOP 1.1发布之后完成的。

 类似资料:
  • 我试图使用Apache Fop和Java生成PDF,但生成的Pdf总是一个空白页。它都嵌套在一个网络应用程序中,割断器是玻璃鱼。 有人有什么建议吗? 以下是我的xsl: 示例XML文件如下所示: 编辑:应该生成pdf的Java代码。。。 第二次编辑: 我发现我的outputStream有问题。我想显示另存为对话框,以便从web应用程序下载生成的文件。我不明白,我的输出有什么问题。。。

  • 我曾尝试使用ApacheFop将HTML转换为PDF。(HTML-- 它适用于简单的html文件。 它不适用于带有样式(通过嵌入的css或样式属性)的html文件。PDF已创建,但完全未格式化。我试图转换超文本标记语言文件,我没有太多的样式/内容控制。 在我的用例中,为每个html创建xslt并不实用。 目前,我确实有一个与flyingsaucer一起工作的实现。但是,该要求要求在没有AGPL许可

  • 我有以下fop.conf,在Windows下工作正常: 但是因为应用程序还需要在没有提供Arial的操作系统上运行,所以我决定在Java应用程序的< code > src/main/resources/fonts/Arial . TTF 中添加一个字体。 所以我试着这样引用字体: 但它不使用字体。 调试时,我看到fopFactoryBuilder有一个名为< code>baseUri的字段,是否可

  • 应用程序通常会通过抛出另一个异常来响应异常。 实际上,第一个异常引起第二个异常。 它可以是非常有助于用户知道什么时候一个异常导致另一个异常。 “异常链(Chained Exceptions)”帮助程序员做到这一点。 以下是Throwable中支持异常链的方法和构造函数。 Throwable getCause() Throwable initCause(Throwable) Throwable(St

  • 你可以使用raise语句 引发 异常。你还得指明错误/异常的名称和伴随异常 触发的 异常对象。你可以引发的错误或异常应该分别是一个Error或Exception类的直接或间接导出类。 如何引发异常 例13.2 如何引发异常 #!/usr/bin/python # Filename: raising.py classShortInputException(Exception):     '''A u

  • 问题内容: 异常存储在哪里?堆,堆。如何为异常分配和释放内存?现在,如果您有多个需要处理的异常,是否创建了所有这些异常的对象? 问题答案: 我假设为异常分配的内存分配方式与所有其他对象(在堆上)分配方式相同。 这曾经是个问题,因为您不能为OutOfMemoryError分配内存,这就是直到Java 1.6之前 才没有堆栈跟踪的原因。现在,它们也为stacktrace预分配了空间。 如果您想知道在抛

  • 异常Exception 以传统的try,catch抓取异常 如果在业务层不catch,框架层会捕捉,并返回一个500的server error响应。 如果在开发环境会返回一个500的具体错误的trace响应。 try { throw new \Exception("Error Processing Request", 1); //yield throwExc

  • 因为Java编程语言不需要捕获方法或声明未检查异常(包括 RuntimeException、Error及其子类),程序员可能会试图编写只抛出未检查异常的代码,或使所有异常子类继承自RuntimeException。这两个快捷方式都允许程序员编写代码,而不必担心编译器错误,也不用担心声明或捕获任何异常。虽然这对于程序员似乎很方便,但它避开了捕获或者声明异常的需求,并且可能会导致其他人在使用您的类而产