开发者

Printing a file to a printer in Ruby

I need help with sending a formatted text to a printer using Ruby on Ruby on Rails OR sending a pdf file to a printer from Ruby program. I can write the code to create a pdf file from Rails app but don't know how to print that pdf file to a default printer. I am trying to write a small ticke开发者_运维技巧ting application with Ruby on Rails.


On Linux and Mac OS X you can use the "lpr" command line program, passing it the name of the PDF file (not sure about Windows though). For example:

def print_to_paper
  your_code_to_write_a_pdf_file("file.pdf")
  system("lpr", "file.pdf") or raise "lpr failed"
end


Here is a solution in Windows environement : Foxit ! http://www.foxitsoftware.com/pdf/reader/

You can call foxit.exe (standalone executable) to silently print a PDF in background.

Syntax : foxit.exe /t "your file.pdf" "The Printer Name"

shell = WIN32OLE.new('Shell.Application')

shell.ShellExecute("foxit.exe","/t \"#{filename}\" \"#{printer}\"")


I'm not sure if there is a way to print something on default printer from web. In my bank when I want to get payment confirmation they give me pdf and I have to print it manualy. I think it is good solution. Just add some information about it.


I have an internal app for creating computer labels. I import computers from a file I get from Dell or enter them manually, I export them to a CSV that I can import into MS SCCM. I can print labels to put on computers. The labels have a company logo, the computer name, MAC address and servicedesk contact info.

I print it with gLabels. You design a label in gLabels, enter dynamic fields and feed a CSV to it and it spits out a PDF which I then use lpr to print to my Dymo Labelwriter.

I put it in my Computers model because I didn't know where else to put it.

# Print all computers with printed = false
def self.print
  printed_labels = 0 
  csv_file = Tempfile.new(["computers", ".csv"])
  logger.debug("Writing #{csv_file.path}")
  begin
    Computer.transaction do
      Computer.unprinted.each do |computer|
        csv_file.puts "\"#{computer.mac(' ')}\",\"#{computer.hostname}\""
        computer.printed = true
        computer.save
        printed_labels += 1
      end
    end 
  ensure
    csv_file.close
    if csv_file.length > 0 
      pdf_file = Tempfile.new(["computers", ".pdf"])
      begin
        pdf_file.close
        system '/usr/bin/glabels-batch', "--input=#{csv_file.path}", "--output=#{pdf_file.path}", AssetBase::Application.config.computer_label
        system '/usr/bin/lpr', '-P', 'LabelWriter-450', pdf_file.path
      ensure
        pdf_file.unlink
      end
    end
    csv_file.unlink
  end   
  printed_labels
end

This runs on Fedora Linux so the printer backend is CUPS and what part of it that handles PDF I don't know. It could be CUPS or the printer driver or the printer driver itself.

There are other methods of creating structured text to PDF but for labels gLabels is great.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜