1

我正在使用一个 Java 类(http://pastebin.com/KhSGPmCV),它接收一个 HTML 文档并尝试通过以下步骤将其转换为 PDF 文档:

  1. 使用 Tidy 将其解析为 XML 文档。
  2. 使用 XSLT 样式表 ( http://pastebin.com/s45gRTKy ) 将 xml 转换为 FO 文档
  3. 使用 Apache FoP 将 FO 转换为 PDF 文档。

我面临的问题只是我的 HTML 文档的第一页被转换为 PDF。我看到的警告信息是 -

Mar 2, 2013 2:53:06 PM org.apache.fop.events.LoggingEventListener processEvent WARNING: Content overflows the viewport of an fo:block-container in block-progression direction by 350 millipoints. Content will be clipped. (See position 51:261)

我很确定问题出在我正在使用的 XSL FO 样式表中。但是,即使在此样式表中添加/修改了很多变量之后,我也无法使第二页可见。有人可以帮我吗?

链接到我尝试转换为 PDF 的 HTML - pastebin.com/iBLw8Pbv

4

1 回答 1

1

您正在使用 Apache FOP 构建 PDF。在 xsl 中阅读这个非常重要的注释:

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

如果您期望一个不错的输出,您可能会被迫使用 Antenna。如果您可以获得二进制文件,下面的脚本可能会有所帮助(Ubuntu)。如果您仍然使用 xsl: <nobr>is not in that xsl... 在您的 HTML 中,您必须将其替换为<pre>. 另一个问题是 tidy 似乎没有修复结束引号,并且会生成很多关于错误@ids 的警告(一些@ids 将包含@class)。

我不知道如何解决这个问题。我的类路径上没有 fop,所以我需要这个:

javac -cp .:/usr/share/java/fop.jar:/usr/share/java/jtidy.jar Html2PDF.java 
java -cp .:/usr/share/java/fop.jar:/usr/share/java/jtidy.jar Html2PDF samplehtml.txt xhtml2fo.xsl

我编写了这个简单的脚本,它对您的调试有很大帮助:

# remove broken IDs
sed "s/id=\"[^\"]* //g" samplehtml.txt > samplehtml.txt.fixedID

# use tidy
tidy -utf8 -w 255 -indent -quiet -asxhtml < samplehtml.txt.fixedID > samplehtml.txt.tidy

# change 
#   -  &nbsp; to &$160;
#   -  remove xmlns declaration
#   -  <nobr to <pre ;; </nobr to </pre
sed -e "s/nbsp/#160/g;s/<html [^>]*/<html/;s/<nobr/<pre/g;s/<\/nobr/<\/pre/g" samplehtml.txt.tidy > samplehtml.txt.tidy2
xalan -xsl xhtml2fo.xsl -in samplehtml.txt.tidy2 -out res.fo
fop res.fo res.pdf

编辑:我找到了一个可以满足您需要的简洁项目,并且输出看起来很棒。https://code.google.com/p/wkhtmltopdf/

于 2013-03-04T00:45:12.220 回答