1

Ruby で非常に単純なマークダウンのようなコンバーターを作成し、その出力をPrinceXMLに渡そうとしています(これは素晴らしいことです)。Prince は基本的に html を pdf に変換します。

これが私のコードです:

#!/usr/bin/ruby
# USAGE: command source-file.txt target-file.pdf

# read argument 1 as input
text = File.read(ARGV[0])

# wrap paragraphs in paragraph tags
text = text.gsub(/^(.+)/, '<p>\1</p>')

# create a new temp file for processing
htmlFile = File.new('/tmp/sample.html', "w+")

# place the transformed text in the new file
htmlFile.puts text

# run prince
system 'prince /tmp/sample.html #{ARGV[1]}'

しかし、これは空のファイルをにダンプします/tmp/sample.html。王子の呼び出しを除外すると、変換は問題なく行われます。

私は何を間違っていますか?

4

2 に答える 2

1

出力ファイルの作成方法が原因で、ファイル出力がバッファリングされ、ディスクに書き込まれない可能性があります。代わりにこれを試してください:

# create a new temp file for processing
File.open('/tmp/sample.html', "w+") do |htmlFile|

  # place the transformed text in the new file
  htmlFile.puts text

end

# run prince
system 'prince /tmp/sample.html #{ARGV[1]}'

これは慣用的な Ruby です。にブロックを渡すと、ブロックFile.newが終了すると自動的に閉じられます。ファイルを閉じることの副産物として、バッファリングされた出力はディスクにフラッシュされ、system呼び出しのコードがそれを見つけることができます。

于 2011-06-04T04:10:33.007 に答える
0

細かいマニュアルから:

prince doc.html -o out.pdf
doc.html を out.pdf に変換します。

あなたのsystem呼び出しは次のようになるはずです:

system "prince /tmp/sample.html -o #{ARGV[1]}"

#{}また、補間が機能するように二重引用符に切り替えることにも注意してください。二重引用符がない場合、シェルは次のコマンドを認識します。

prince /tmp/sample.html #{ARGV[1]}

その後#、コメントとして後のすべてを無視します。なぜあなたが空/tmp/sample.html/tmp/sample.pdf.

于 2011-06-04T03:06:29.737 に答える