2012-03-07 102 views
1

因此,我有一个Rails应用程序,用户提交时应根据用户输入生成某种.tex文件,将其编译为pdf并提供pdf。通过消除的过程,我相当积极地认为除了一条线以外,一切正在发挥作用;调用pdflatex的那个。在我的Rails控制器中运行系统命令(pdflatex)

这里是代码的重要部分: (如果它很重要,它位于生成操作下的问题控制器中,在表单发送相关信息之后调用它)虽然这可能不是最好的方法,敢一定它不是错误的原因)

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开头,所以不用担心小错误)。但出于某种原因,当我运行上述脚本时,甚至没有创建一个包含错误的日志文件。

我在忽略什么?有任何想法吗?任何方式看看投入线正在创建什么输出?

感谢这么多提前!

回答

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' 

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

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

system 'runlatex.bat' 

其中该批处理文件如下:

cd app/assets/tex 
pdflatex Questions.tex 

这样的TEX目录中的任何其他文件被发现,日志文件被创建在那里,等。

为什么我从来没有得到日志文件的原因? pdflatex从未执行 - 操作系统在运行之前用权限错误将其停止。

希望这会有所帮助!

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以避免转义和引用问题,并获得更好的错误处理能力。

+0

感谢您的反馈意见。我总是混淆我的斜线。我改变了代码行,但我仍然没有得到任何东西。没有日志文件,没有输出。我相应地更新了我的问题。 – 2012-03-07 04:26:14

+0

@ngmiceli:'pdflatex'打印标准输出中的任何有用内容,还是将它全部写入'--output-directory'? – 2012-03-07 04:30:29

+0

它将大量东西打印到标准输出,但通常相同的_exact_内容通常也会打印到日志文件中。我承认,我不知道是否有计划的情况下可以打印标准输出但不创建日志文件的脚本。我只是不明白当将命令复制到终端时如何发生这种情况可能会像梦一样发生。 – 2012-03-07 04:33:11