【问题标题】:wicked-pdf not rendering pdf correctly. show_html looks fine, pdf downloaded looks awfulwicked-pdf 无法正确呈现 pdf。 show_html 看起来不错,下载的 pdf 看起来很糟糕
【发布时间】:2019-03-21 23:03:28
【问题描述】:

我正在使用 wickedpdf 尝试生成漂亮的 pdf 报告。使用 show_as_html: true 来确保一切正常,页面看起来很棒,它使用正确的模板,并且所有内容都按应有的方式加载。没有参考错误或资产错误,这些已通过创建 wickedpdf 特定的 scss 和 js 得到纠正(见下文):

但是,当我将其设置为 disposition: 'attachment' 以使其实际生成 pdf 时,它看起来与上面的页面完全不同,结果是 pdf 缺少格式并且跨多个页面的组件不连贯。图表也没有渲染,也没有显示数据。似乎它没有应用正确的引导程序/自定义 css,也没有运行创建布局所需的 javascript 文件,如 html 视图所示。任何想法为什么会发生这种情况?我的理解是使用 show_as_html: true 将呈现与在 pdf 中看起来完全相同的页面,然后创建 pdf 将使用这些确切的内容来创建 pdf 文档。我查看了所有其他 wicked-pdf 问题,但没有找到任何帮助。

以下是控制器中的当前设置:

format.pdf do
            render pdf: "#{@interest.name}",
            template: "interests/pdf_export.html.erb",
            layout: 'pdf.html', disposition: 'attachment',
            title: "#{@interest.name}",
            #default_header: true,
            #default_footer: true,
            header: {   spacing: 10,
                        html: {            
                        content: "interests/report_header",
                        layout:   'pdf.html',             # optional, use 'pdf_plain' for a pdf_plain.html.pdf.erb file, defaults to main layout
                        }
                    },
        viewport_size: '1280x1024',
        #show_as_html: true,
        javascript_delay: 10000,
        enable_plugins: true,
        page_size: 'A4'
      end

这是 pdf 布局:

    <!DOCTYPE html>
<html>
<head>
<title>PDF</title>
  <%= wicked_pdf_stylesheet_link_tag 'wickedpdf' %>
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/simple-line-icons/2.4.1/css/simple-line-icons.css">
  <link rel="stylesheet" href="http://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">




  <!-- JAVASCRIPT DEPENDENCIES ---->
  <!-- jquery -->
  <script src="http://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
  <!-- popper -->
  <script src="http://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
  <!-- bootstrap -->
  <script src="http://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>

  <script src= "https://cdnjs.cloudflare.com/ajax/libs/feather-icons/4.19.0/feather.js"></script>

  <%= wicked_pdf_javascript_include_tag 'wickedpdf'%>

</head>
<body>
  <div class='container'>
    <%= yield %>
  </div>
</body>
</html>

wickedpdf.scss:

@import 'stack/bootstrap';

@import 'stack/fonts/flag-icon-css/css/flag-icon';
@import 'stack/vendors/extensions/pace';

@import 'stack/vendors/extensions/unslider';
@import 'stack/plugins/extensions/noui-slider';

@import "stack/bootstrap-extended";
@import "stack/colors";
@import "wickedpdf/components";

@import 'stack/core/menu/menu-types/vertical-menu';
@import 'stack/core/colors/palette-gradient';
@import 'style';

wickedpdf.js:

//= require stack/vendors/vendors.min
//= require stack/vendors/charts/raphael-min
//= require stack/vendors/charts/chart.min
//= require stack/vendors/charts/jquery.sparkline.min
//= require stack/vendors/extensions/unslider-min
//= require stack/vendors/extensions/wNumb
//= require stack/vendors/extensions/nouislider.min
//= require stack/vendors/extensions/jquery.steps.min
//= require stack/vendors/timeline/horizontal-timeline
//= require stack/vendors/tables/datatable/datatables.min
//= require stack/core/app-menu
//= require stack/core/app
//= require stack/scripts/pages/dashboard-ecommerce
//= require_tree ./common
//= stub ./common/subscriptions

【问题讨论】:

    标签: ruby-on-rails pdf wicked-pdf


    【解决方案1】:

    我的理解是使用 show_as_html: true 将呈现与 pdf 中完全相同的页面

    这是一个误解。很抱歉,从您阅读的任何文档来看,它可能看起来都是这样,但是show_as_html: true 将显示将发送到wkhtmltopdf 的 HTML,但是wkhtmltopdf 就像一个非常旧的 Chrome 版本(大约 13 版,我认为)。它不支持 flexbox 和很多类似的好东西,我认为新版本的 Bootstrap 需要这些东西。可能你的一些 JS 库也是如此。

    该选项可帮助您更快地进行开发和调试。在 PDF 上查看源代码要困难得多。

    我的建议是首先剥离所有 CSS 和 JS,并尝试让最重要的部分(图表)正常工作,然后使用表格或浮动或固定宽度的容器实现布局,然后复制页面上显示的样式需要的 CSS,而不是 Bootstrap 的全部。

    如果这是一个具有双重功能的页面(format.htmlformat.pdf 版本都提供),我建议将 PDF 拆分为它自己的单独模板,这样 HTML 访问者仍然可以获得漂亮的交互式网页。

    【讨论】:

    • 谢谢。我最终走了那条路。我确实尝试将所有内容都剥离出来,只为图表本身留下 js,但即使这样也没有用。我最终不得不将页面呈现为 html,在完成绘图后创建图形图像,然后导出具有图形图像且不依赖 javascript 的不同 pdf 模板。它添加了许多额外的步骤和检查,但我无法找到解决此问题的不同方法。我测试了多个不同版本的 chart.js 以及多个不同的参数,但没有成功。
    • @Andrea 当然,这是一个聪明的方法。我收到了有人需要降级 chart.js 的报告:github.com/mileszs/wicked_pdf/issues/713
    • @Andrea 另外,如果您通过 AJAX 提取数据,则 content-security-policy 或相关路由可能会受到阻碍,因为它是从磁盘上的文件呈现的。
    • 谢谢。我尝试降级,但没有帮助。我并没有通过 Ajax 为图表本身提取内容,但我不得不将数据作为数据变量从后端传递到 js 中,所以很可能就是这样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-03
    • 1970-01-01
    • 2019-07-29
    • 2014-04-09
    • 2017-08-29
    相关资源
    最近更新 更多