【问题标题】:Problem generating pdfs with acts_as_flying_saucer使用acts_as_flying_saucer 生成pdf 的问题
【发布时间】:2011-03-24 06:41:09
【问题描述】:

我正在使用 rails 插件acts_as_flying_saucer 来生成pdf,但是pdf 不起作用:我可以保存它,但是当我尝试打开它时,我收到以下错误消息:

Unable to open document
File type SOR File (text/plain) is not supported

这是我的设置。我正在使用 rails 2.3.4 和最新版本的acts_as_flying_saucer 插件。我有这条路线:

  map.all_help '/help/all.:format', :controller => "help", :action => "all"

进入这个控制器动作:

class HelpController < ApplicationController
  acts_as_flying_saucer    

  def all
    respond_to do |format|
      format.html {
        render :action => "all", :layout => "help_pdf"
      }
      format.js
      format.pdf {
        render_pdf :template => 'help/all.html.erb', 
                   :layout => "help_pdf",
               :send_file => { :filename => "my-filename.pdf",  :type => "application/pdf"}      
      }
    end    
  end

end

我也定义了这个 mime 类型:

 Mime::Type.register "application/pdf", :pdf

当我转到页面 /help/all.pdf 时,它会生成一个 0 字节的 pdf(我可以保存好),当我尝试打开它时,我会从这篇文章的顶部收到错误消息。

转到页面的标准网页版本 (/help/all) 可以正常工作。我想也许我的 java vm 没有设置,但它似乎很好:

max-laptop:millionaire[subjects]$ java -version
java version "1.6.0_20"
Java(TM) SE Runtime Environment (build 1.6.0_20-b02)
Java HotSpot(TM) Client VM (build 16.3-b01, mixed mode, sharing)

我现在没有想法......感谢任何建议!最大值

编辑:刚刚注意到我的杂种运行选项卡中有一堆错误输出:

ERROR:  'Premature end of file.'
Exception in thread "main" org.xhtmlrenderer.util.XRRuntimeException: Can't load the XML resource (using TRaX transformer). org.xml.sax.SAXParseException: Premature end of file.
    at org.xhtmlrenderer.resource.XMLResource$XMLResourceBuilder.createXMLResource(XMLResource.java:191)
    at org.xhtmlrenderer.resource.XMLResource.load(XMLResource.java:71)
    at org.xhtmlrenderer.swing.NaiveUserAgent.getXMLResource(NaiveUserAgent.java:205)
    at org.xhtmlrenderer.pdf.ITextRenderer.loadDocument(ITextRenderer.java:102)
    at org.xhtmlrenderer.pdf.ITextRenderer.setDocument(ITextRenderer.java:106)
    at Xhtml2Pdf.main(Xhtml2Pdf.java:19)
Caused by: javax.xml.transform.TransformerException: org.xml.sax.SAXParseException: Premature end of file.
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:719)
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:313)
    at org.xhtmlrenderer.resource.XMLResource$XMLResourceBuilder.createXMLResource(XMLResource.java:189)
    ... 5 more
Caused by: org.xml.sax.SAXParseException: Premature end of file.
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1231)
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transformIdentity(TransformerImpl.java:636)
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:707)
    ... 7 more

我现在想知道我尝试转换为 pdf 的页面是否有问题。我通过 w3c 验证器运行了页面的 html 版本,并且页面验证正常。所以现在我又被难住了……

编辑 2:我想我现在越来越近了:查看我的日志,我明白了

Rendering help/all.html.erb
html file: /tmp/ff4c8ff01d544500ea4bfea43e6108c1.html
Sending X-Sendfile header /tmp/ff4c8ff01d544500ea4bfea43e6108c1.pdf

所以,我希望 /tmp/ff4c8ff01d544500ea4bfea43e6108c1.html 包含我的页面的 html 版本,但它只是一个四行空文本文件。难怪飞碟不能转换它。我不知道为什么它会保存一个空的 html 文件。

编辑 3:这是我目前正在尝试转换的 html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
      <title>Help for Millionaire For Schools</title>
  </head>

  <body class="pdf">
        <div id="bgeffect"></div>        

    <div id="pageWrapper" class="mainHelpPages">

      <div id="helpContent">
        <div id="helpPane">
          <div class="inner">
            <p>Welcome to my pdf</p>
          </div>
        </div>
      </div>      
    </div> 

  </body>

</html>

【问题讨论】:

  • 您可以发布您尝试转换为 PDF 的页面的生成 XHTML 吗?
  • 在编辑 3 中添加。干杯

标签: ruby-on-rails pdf-generation flying-saucer


【解决方案1】:

我解决了这个问题,结果证明它非常简单(而且很愚蠢)。问题是这样的:我指向的是我想以正常的 Railsy 方式使用的布局,

:layout => "help_pdf",

但是,看起来你必须拼出完整的文件名:当我把它改成这个时,它起作用了:

:layout => "help_pdf.html.erb",

啊啊啊啊!!!!!!嗯,至少它现在可以工作了。非常感谢 John 看一看。

最大

【讨论】:

    【解决方案2】:

    你不是 solve this problem a year agox_sendfile 设置为 false 吗?

    【讨论】:

    • 很好地用谷歌搜索了约翰 :) 是的,当时有效,但现在无效。那是使用不同的应用程序和不同的系统,无论我将 x_sendfile 设置为什么,我似乎都无法让它工作。
    • 我能看到的唯一其他区别是你的工作版本有:disposition =&gt; 'inline' - 你试过了吗?
    • 是的,试过了。我已经尝试了所有我能想到的让它与我之前做的完全一样的方法(相同的布局,相同的文档类型),但无济于事。
    • 哦,我对我的原始帖子进行了编辑,顺便说一句,飞碟出现了一些错误。干杯
    猜你喜欢
    • 1970-01-01
    • 2014-05-01
    • 1970-01-01
    • 2021-08-22
    • 1970-01-01
    • 2016-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多