Ruby on Rails 生成PDF

11 篇文章 0 订阅
1 篇文章 0 订阅

先说一下 所满足的需求是什么?

  1. 将一个网页html生成一个文件,通过浏览器发送到电脑端
  2. 将一个网页html生成一个文件,保存到数据库中

第一步:
引用Gem

# PDF所用
gem 'pdfkit'
gem 'render_anywhere'
gem 'wkhtmltopdf-binary'
# 存储文件用的
gem 'carrierwave'

第二:封装一个类方法

  require 'render_anywhere'

  class ManageMeetPdf
    include RenderAnywhere

    def initialize(manage_meet)
      @manage_meet = manage_meet
    end

    def to_pdf
      kit = PDFKit.new(as_html, page_size: 'A4')
      kit.to_file("#{Rails.root}/public/manage_meet#{manage_meet.id}.pdf")
    end

    def filename
      "会议_#{manage_meet.title}.pdf"
    end

    private

      attr_reader :manage_meet

      def as_html
        renderer = ::ActionController::Base.renderer.new
        # 这里manage_meets/pdf 是一个pdf 视图文件。 meet_pdf 是 layout 视图文件
        renderer.render(template: "manage_meets/pdf", layout: 'meet_pdf', locals: {manage_meet: @manage_meet })
      end
  end

第三:Controller.rb

# 这里ManageMeet 是一个表
@manage_meet = ManageMeet.find(params[:id])
pdf = ManageMeetPdf.new(@manage_meet)
file = pdf.to_pdf
@manage_meet.update!(pdf_file: file, status: 'place_file')
File.delete(file.path)

俩试图文件
pdf.html.erb

内容自定义

meet_pdf.html.erb

<!DOCTYPE html>
<html>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<head>
  <title></title>
  <style>
    .pro-title{
      font-size: 17px;
    }
    .layui-elem-quote{
      padding: 8px;
    }
    .card-height{
      min-height: 167px;
      display: flex;
    }
    .layui-col-md6 {
      width: 50%;
    }
    .layui-bg-gray {
      background-color: #fafafa!important;
      color: #5f5f5f!important;
    }
    layui-badge-rim, .layui-border, .layui-colla-content, .layui-colla-item, .layui-collapse, .layui-elem-field, .layui-form-pane .layui-form-item[pane], .layui-form-pane .layui-form-label, .layui-input, .layui-input-split, .layui-panel, .layui-quote-nm, .layui-select, .layui-tab-bar, .layui-tab-card, .layui-tab-title, .layui-tab-title .layui-this:after, .layui-textarea {
      border-color: #eee;
    }
    .layui-field-title {
      margin: 10px 0 20px;
      border-width: 0;
      border-top-width: 1px;
    }
    .layui-elem-field {
      margin-bottom: 10px;
      padding: 0;
      border-width: 1px;
      border-style: solid;
    }
    fieldset {
      border: 1px solid #e4e4e4;
      margin: 0;
      min-width: inherit;
    }
    .flex {
      display: flex;
    }
    .layui-col-space15 {
      margin: -7.5px;
    }
    hr {
      height: 0;
      line-height: 0;
      margin: 10px 0;
      padding: 0;
      border: none!important;
      border-bottom: 1px solid #eee!important;
      clear: both;
      overflow: hidden;
      background: 0 0;
    }
  </style>
</head>
<body>
  <%= yield %>
</body>

如果导出出现黑色方块或者乱码执行这个试试
centos:
yum install wqy-zenhei-fonts
ubuntu:
apt-get install fonts-wqy-microhei ttf-wqy-microhei fonts-wqy-zenhei ttf-wqy-zenhei

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值