ruby-on-rails wicked_pdf错误:无法生成PDF

kmynzznz  于 2023-06-25  发布在  Ruby
关注(0)|答案(8)|浏览(143)

Gemfile

gem "wicked_pdf"
gem "wkhtmltopdf-binary"

错误:

RuntimeError in CarsController#show

Failed to execute:
/usr/bin/wkhtmltopdf     --print-media-type    -q - - 
Error: PDF could not be generated!
Rails.root: /u/apps/zeepauto/autozeep_update

汽车_controller

def show
    @class_showcar = true
    @class_admin = true
    @car = Car.find(params[:id])
    @search = Car.search(params[:search])
    @cars_see_special = Car.where(:special => "1").order('rand()').limit(3)

    respond_to do |format|
      format.html # show.html.erb
      format.xml  { render :xml => @car }
      format.pdf do
        render :pdf => "#{@car.carname.name}",
               :print_media_type => true
      end
    end
  end

show.html.erb

<p class="show_links"><%= link_to  url_for(request.params.merge(:format => :pdf)) do %>
  <%= image_tag('/images/printversion.png', :alt => 'Download') %>
</p>

wicked_pdf.erb

# config/initializers/wicked_pdf.rb
WickedPdf.config = {
#  :exe_path => '/var/lib/gems/1.8/bin/wkhtmltopdf'
  :exe_path => '/usr/bin/wkhtmltopdf'
}
im9ewurl

im9ewurl1#

我也有同样的问题。解决方案是将wkhtmltopdf-binary添加到gem文件并运行bundle install

gem "wicked_pdf"
gem "wkhtmltopdf-binary"
eeq64g8w

eeq64g8w2#

我有wkhtmltopdf-binary已经在gemfile,但由于这是工作在我的本地计算机上,而不是在服务器上,我留下这个错误给服务器支持团队照顾。他们已经检查了wkhtmltopdf的路径,他们试图将一个简单的html转换为pdf,它工作了。因此,他们试图运行一个bundle update命令,在此之后,PDF转换在服务器上也工作得很好。我有一个宝石路径改变,我想这是问题。我发布了我的解决方案,以防其他人也会有这个问题。

wvt8vs2t

wvt8vs2t3#

对于Alpine 3.9+,wkhtmltopdf二进制文件是可用的,但是我得到了一个空白的PDF或“加载文档失败”错误-尽管在MacOSX上本地工作正常。事实证明,对于Alpine构建(至少),您需要显式地包含字体

控制器动作

def show
    respond_to do |format|
      format.html do
        render 'pdfs/templates/my_template.html.erb'
      end

      format.pdf do
        render(
          pdf: "file_name",
          template: 'pdfs/templates/my_template.html.erb',
          disposition: 'inline'
        )
      end
    end
end

上面的操作在MacOSX机器上运行,但在基于ruby alpine映像的服务器上运行,如下所示,它失败了,无法加载文档

Dockerfile

FROM ruby:2.6.3-alpine3.10
....
# add wkhtmltopdf for use with wicked_pdf gem
RUN apk --no-cache add wkhtmltopdf
...

即使是一个更基本的例子也失败了,一个空白的pdf

respond_to do |format|
  format.pdf do
    pdf = WickedPdf.new.pdf_from_string('TESTING 123')
    send_data(
      pdf,
      filename: "file_name.pdf",
      type: 'application/pdf',
      disposition: 'inline'
    )
  end
end

解决方案

Dockerfile

FROM ruby:2.6.3-alpine3.10
....
# add wkhtmltopdf for use with wicked_pdf gem
RUN apk --no-cache add \
                  ttf-ubuntu-font-family \
                  wkhtmltopdf
...

理想情况下,Alpine会在wkhtmltopdf包中包含一个基本字体,但在此之前,我发现这是一个有用的信息源和/或添加多阶段Docker文件的好方法。
https://github.com/madnight/docker-alpine-wkhtmltopdf/blob/master/Dockerfile

注意:

alpine中缺少明确的字体包也可能导致使用libreoffice进行PDF转换失败。特别是从docx文件转换时,我们发现损坏的PDF文件。

8qgya5xd

8qgya5xd4#

我也有同样的问题。我安装了wkhtmltopdf-binary,但bundle update也没有帮助。以下是帮助我的:
重要的是,我在Alpine Linux上运行它,它似乎不受gem wkhtmltopdf_binary_gem https://github.com/zakird/wkhtmltopdf_binary_gem/issues/53的支持
我在系统中单独安装了wkhtmltopdf:apk add wkhtmltopdf
然后编辑初始化器以包含二进制路径:

# config/initializers/wicked_pdf.rb
require "wicked_pdf"

WickedPdf.config = {
  exe_path: ENV["WKHTMLTOPDF_BIN"]
}
tyky79it

tyky79it5#

我也遇到了同样的问题,它在本地机器上工作正常,但在服务器上部署时会引发错误:

  • 错误:无法生成PDF!*.

在我的例子中,服务器上缺少一些依赖项。在服务器上使用以下命令安装依赖项。
sudo apt-get install libfontconfig1 libxrender1

rn0zuynd

rn0zuynd6#

我在使用 Ubuntu 20.04 时遇到了同样的问题。
我使用wkhtmltopdf-binary版本0.12.6.1解决了这个问题。

pxyaymoc

pxyaymoc7#

如果你在docker容器中遇到这个问题,很可能你正在使用Alpine Linux。在这种情况下,wkhtmltopdf-binary与Alpine Linux不兼容。所以,添加这些gem:

gem 'wicked_pdf', github: 'mileszs/wicked_pdf'
gem 'wkhtmltopdf-binary-edge-alpine', '~> 0.12.5.0'

wkhtmltopdf-binary-edge-alpine用于Alpine Linux。希望一切正常😂

dgiusagp

dgiusagp8#

对我来说,以上都不起作用,因为我在arm64 macOS架构上使用Docker,我不想使用模拟容器。取而代之的是,获得我的架构的包并将其安装在容器上,然后使用它而不是gem。以下是我在安装所有gem后在Dockerfile中所做的:

RUN if [ $(arch | sed s/aarch64/arm64/ | sed s/x86_64/amd64/) = "arm64" ]; then \
    wget https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6.1-2/wkhtmltox_0.12.6.1-2.bullseye_arm64.deb; \
    dpkg -i wkhtmltox_0.12.6.1-2.bullseye_arm64.deb; \
    mv /usr/local/bin/wkhtmltopdf /usr/local/bundle/bin/wkhtmltopdf; \
    rm wkhtmltox_0.12.6.1-2.bullseye_arm64.deb; \
fi

希望这个能帮上忙

相关问题