Ruby 手册 | 29 - PDF 和 ZIP 文件操作

446 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第29天,点击查看活动详情

一、PDF 操作

PDF 格式是使用最广泛的文档格式之一,Ruby 中提供了很多操作 PDF 文档的库,如果 PDF::HTMLDOC, PDF::Write 以及 PDF::FPDF 等。

Ruby FPDF 是 PDF 创建工具 FPDF 的 Ruby 接口,不仅提供了创建 PDF 的支持,同时也是对中文支持最好的 PDF 创建工具。

FPDF 不是 Ruby 自带的库,需要通过 gem 进行安装 gem install fpdf

图片.png

require 'fpdf'

pdf = FPDF.new
pdf.AddPage
pdf.SetFont("Arial", "B", 20)
pdf.Cell(40, 10, 'PDF Content Create By FPDF')
pdf.Output('pdf_by_fpdf.pdf')

执行上述代码,在代码同级目录下会多出一个 pdf_by_fpdf.pdf 文件,文件内容为

图片.png

二、ZIP 操作

ZIP 是压缩文件的格式,Ruby 中的 Rubyzip 库可以创建一个新的 ZIP 文件或者解压已有的 ZIP 文件。

Rubyzip 库不是 Ruby 自带的库,也是需要通过 gem install rubyzip 来安装。

查询 rubyzip 库

图片.png

安装 rubyzip 库

图片.png

使用 ZIP 库进行读写和创建 ZIP 文件。

require 'zip'

# 创建 test.zip 文件
Zip::File.open('test.zip', Zip::File::CREATE) do |zipfile|
  zipfile.get_output_stream('text.txt') do |f|
    f.puts "test text"
  end
  zipfile.mkdir('test_dir')
end

# 打开 test.zip 文件
Zip::File.open('test.zip', Zip::File::CREATE) do |zipfile|
  zipfile.each do |file|
    puts file
  end

  puts zipfile.read('text.txt')
  zipfile.remove('text.txt')
end

执行上述代码,输出结果如下:

text.txt
test_dir/
test text

该代码文件同级目录下多出一个 test.zip 文件。

使用 ZIP 库将文件压缩到 zip 文件中,需要创建一个 zip 文件夹,放入一些文本文件或者图片等,使用 ZIP 库将 zip 文件夹中的文件迭代压缩至 testzip.zip 文件中

require 'zip'

# 添加目录或者文件到 zip 文件
def add_to_zip_file(zip_file_name, file_path)
  def add_file(start_path, file_path, zip)
    # 如果 file_path 为一个目录,则迭代将目录中的文件添加到zip 文件中
    if File.directory?(file_path)
      Dir.foreach(file_path) do |filename|
        add_file(start_path, "#{file_path}/#{filename}", zip) unless filename == '.' or filename == '..'
      end
    else
      zip.add(file_path, file_path)
    end
  end


  # 创建 zip 文件
  Zip::File.open zip_file_name, Zip::File::CREATE do |zip|
    # 添加zip文件
    add_file(file_path, file_path,zip)
  end
end

add_to_zip_file "testzip.zip", 'zip/'

执行上述代码,可以看到代码文件同级目录下多出一个 testzip.zip 文件。

接着我们使用 ZIP 库将压缩的 zip 文件解压出来

# 解压 zip 文件
def extract_from_zip_file(zip_file_name, file_path)
  # 读取zip 文件
  Zip::File.open zip_file_name, Zip::File::CREATE do |zip|
    zip.each do |file|
      zip.extract(file, file_path + File.basename(file.to_s))
    end
  end
end

extract_from_zip_file "testzip.zip", ''

执行上述代码,即可在同级目录下看到解压出来的文件。