所以我有一个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线的输出是什么?
提前非常感谢!
答案 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
以避免转义和引用问题,并获得更好的错误处理功能。