在我的Rails控制器中运行系统命令(pdflatex)

时间:2012-03-07 04:04:36

标签: ruby-on-rails ruby ruby-on-rails-3 io pdflatex

所以我有一个Rails应用程序,在用户提交时应该根据用户输入生成某种.tex文件,将其编译成pdf,并提供pdf。通过消除过程,我非常肯定一切都在工作,除了一行; pdflatex被称为的那个。

以下是重要的代码片段: (如果重要的话,它位于问题控制器下的generate动作,在表单发送相关信息后调用。虽然这可能不是最好的方法,但我很确定它不是错误的原因)< / p>

texHeader = 'app\assets\tex\QuestionsFront.txt' 
texOut = 'app\assets\tex\Questions.tex'

#copy latex header to new file
FileUtils.cp(texHeader, texOut)

File.open(texOut, 'a+') do |fout|
      fout.write("\n")
         # a loop writes some more code to fout (its quite lengthy)
      fout.write("\\end{enumerate}\n")
      fout.write("\\end{document}")
      #The problem line:
      puts `pdflatex app/assets/tex/Questions.tex --output-directory=app/assets/tex`
    end

    filename = 'Questions.pdf'
    filelocation = "app\\assets\\tex\\" + filename

    File.open(filelocation, 'r') do |file|
      send_file file, :filename => filename, :type => "application/pdf", :disposition => "attachment"
    end
end

这是我的推理:它正确生成.tex文件,并给出一个预先创建的Questions.pdf文件,它发送它就好了。当puts中的命令被复制到终端时,它会顺利运行(文件以\ nonstopmode开头,所以不用担心小错误)。但由于某种原因,当我运行上面的脚本时,甚至没有创建带有错误的日志文件。

我在俯瞰什么?有任何想法吗?有什么方法可以看出puts线的输出是什么?

提前非常感谢!

2 个答案:

答案 0 :(得分:1)

弄清楚我自己的问题。错误非常有趣。你会看到我正在打电话

 puts `pdflatex app/assets/tex/Questions.tex --output-directory=app/assets/tex`
块内的

File.open(texOut, 'a+') do |fout|

之前只有几行

texOut = 'app\assets\tex\Questions.tex'

基本上,我正在尝试使用latex来编译文档,而文件仍处于打开状态只要我在File.open块中,文件已打开,并在块结束时自动关闭。 在块的末尾下方切割和粘贴代码行使其工作就像我想要的那样。但是,为了清楚起见以及其他人遇到此问题的罕见情况,最好打开一个单独的系统shell,导航到latex文档所在的目录并在那里进行编译。所以,我更新的代码如下:

  fout.write("\\end{document}")
end

system 'runlatex.bat'

该批处理文件的位置如下:

cd app/assets/tex
pdflatex Questions.tex

这样就可以找到tex目录中的任何其他文件,在那里创建日志文件等等。

我从未收到过日志文件的原因? pdflatex从未执行过 - 操作系统在运行之前以权限错误停止了它。

希望这有帮助!

答案 1 :(得分:0)

反引号(和%x{})提供与双引号字符串相同的解析上下文。这意味着通常的反向逃避序列在反引号中被解释;特别是,\t是一个标签,所以:

puts `pdflatex app\assets\tex\Questions.tex --output-directory=app\assets\tex`

最终会有两个标签,会破坏一切。你可以开始转义你的反斜杠(我认为你需要两个或三个反斜杠来一个到shell)或切换到正常斜线(Windows通常在路径中接受):

puts `pdflatex app/assets/tex/Questions.tex --output-directory=app/assets/tex`

或者,您可以切换到open3以避免转义和引用问题,并获得更好的错误处理功能。