使用MathJax和wkhtmltopdf在Rails中生成PDF

时间:2012-07-21 22:14:59

标签: ruby-on-rails pdf wkhtmltopdf wicked-pdf

我正在使用Rails 3.2.6编写一个网站,它需要能够在网站上显示数学格式。为了完成这项工作,我正在使用mathjax-rails gem,它可以完美地渲染数学,例如,questions / 1。但是,我希望用户能够将包含数学内容的问题下载为PDF。我已经做了很多搜索和摆弄我的应用程序,最接近我的解决方案是wkhtmltopdf和wicked_pdf gem。这是有效的,因为创建了一个保存到用户计算机的PDF。但是,数学没有正确呈现,因为,我认为,mathjax实际上并没有处理它。

做了一些阅读后,我以为我在其他地方找到了答案,它说给控制器增加一个延迟,让mathjax有机会发挥它的魔力:

format.pdf do
    render :pdf => 'filename',
          :javascript_delay=>5000
  end

然而,这也不起作用,我最终得到的内容包括:

[itex] 3H_ {2~(g)} + 2N_ {2~(g)}⇌NH_{3~(g)} [/ itex]

而不是格式化数学。有没有人知道如何让这个工作起来?

提前致谢。

2 个答案:

答案 0 :(得分:2)

这甚至有点傻,但你有没有尝试过更长的延迟?

使用wkhtmltopdf可行:

wkhtmltopdf.exe --javascript-delay 15000 http://www.mathjax.org/demos/mathml-samples/ MML.pdf && MML.pdf

这不起作用

wkhtmltopdf.exe --javascript-delay 5000 http://www.mathjax.org/demos/mathml-samples/ MML.pdf && MML.pdf

对于TeX样本也是如此

答案 1 :(得分:1)

我终于解决了这个问题,唯一的问题是我使用的是cdn而不是gem:

这是我在控制器中的show动作:

import * as AWS from 'aws-sdk';
//constant
import DefaultValue from '../../Constants/DefaultValue';

AWS.config.update({
    region: DefaultValue.REGION,
    credentials: new AWS.Credentials(DefaultValue.ACCESS_KEY_ID, DefaultValue.SECRET_KEY)
});

class UploadFile extends React.Component<any,any> {
    s3: any;
    constructor() {
        super();

        this.s3 = new AWS.S3({apiVersion: '2016-11-07'});
    }

}

在app / views / layouts / application-pdf.html.erb:

def show
  @example = Exam.find(params[:id])
  respond_to do |format|
    format.html
    format.pdf do
      render pdf: @exam.name,
                  template: "exams/show.pdf.erb", // The template that you want to convert to pdf
                  :javascript_delay=>5000,
                  locals: {:exam => @exam},
                  layout: "application-pdf.html.erb"
    end
  end
end

关键是要包装你的pdf模板,在我的情况下&#34; exams / show.pdf.erb&#34;在为你的pdf设计的应用程序布局中,cdn被加载到布局中,你只需要为wickedpdf提供延迟javascript处理的选项,这样mathjax就有足够的时间来处理页面。

希望它有所帮助。

<强>更新

正如Peter Krautzberger所说,由于预算问题,cdn.mathjax.org正在关闭。解决方案将保持不变,您只需在内部从项目加载mathjax或使用另一个cdn。你可以在这里找到一些cdn替代品:https://www.mathjax.org/cdn-shutting-down/