【问题标题】:wkhtmltopdf javascript delay for output of google mapswkhtmltopdf javascript 延迟输出谷歌地图
【发布时间】:2014-03-01 22:55:39
【问题描述】:

我正在使用 WKTHMTOPDF,并且非常喜欢它。但是,正在转换的页面有谷歌地图,生成的 PDF 会在地图加载一半的情况下出现。我知道在以前的版本中有一个添加--javascript--delay 的选项,但它似乎已被弃用。我使用的是 0.99 版。有其他选择吗?

【问题讨论】:

  • 您可能还想尝试--no-stop-slow-scripts 选项,它可以防止长时间运行的 JS 脚本提前中止。可能无法解决您的具体问题,但确实解决了我们的问题。

标签: wkhtmltopdf


【解决方案1】:

another 一种更好的方法来做到这一点,不需要使用 --javascript--delay (并且具有不需要您在知道需要什么之前设置延迟时间的优点实际上会延迟)。

为 'tileloaded' 事件添加回调:

google.maps.event.addListenerOnce(map, 'tilesloaded', function(){
   window.status = 'ready_to_print';
});

然后调用 wkhtmltopdf 并将 --window.status 选项设置为“ready_to_print”,例如

wkhtmltopdf --window-status ready_to_print map.html map.pdf

显然,您可以将字符串 'ready_to_print' 更改为您想要的任何值,只要 window.status 在调用 wkhtmltopdf 时和上述代码触发之前不等于该值。

谷歌图表可以使用类似的方法,但相应的事件使用不同的名称。

【讨论】:

  • 这对我不起作用。脚本 wkhtmltopdf 刚刚停止。
【解决方案2】:

可以使用wkhtmltopdf 0.12.0版

我还在网站中使用了一些高度 javascript 的内容。以前,使用 0.99 版无法正确渲染但是当我使用 0.12 版并使用选项 --javascript-delay 时,一切看起来都很好。

您也可以添加其他选项来完美加载您的 javascript,例如 --enable-javascript--no-stop-slow-scripts

请确保您在使用 --javascript-delay 时必须使用适当的时间延迟,这取决于您的网站需要多少时间来呈现。如果您将使用更多时间延迟,则执行将需要更多时间,如果您将使用较少时间延迟,则 javascript 将无法正确加载。
The link to latest version of wkhtmltopdf

【讨论】:

  • 只是附带说明,当您使用 --javascript-delay 时,您需要以毫秒为单位指定延迟。 shell_exec("/usr/local/bin/wkhtmltopdf --javascript-delay {$delayInMilliseconds} {$url} {$fileName}");
【解决方案3】:

--javascript-delay 选项根本不被弃用。此外,建议升级到最新版本 -- 0.9.9 是一个非常旧的版本。

【讨论】:

    【解决方案4】:

    --javascript-delay 函数有效,但对我的使用来说不是最理想的——也许你的使用也是可变的? PDF 有时可以包含只有 十几个项目 及其地图视图的列表,或地图上的 数百个项目。没有人对我来说msec延迟...

    我在控制器方法中成功使用了@rohit-singhal 技巧(Rails 应用程序使用 GMaps4Rails gem 和 haml 视图):

    def index
      ...
      respond_to do |format|
        format.pdf do
          @map_data = { markers: @map_hash, zoom: 10, cluster_zoom: 10, center: center_coordinates,
                        fit_to_bounds: true, show_center_marker: false, map_type: 'roadmap'}
          render pdf:             'Water Supplies',
                 disposition:     'inline',
                 layout:          'layouts/pdf.html.haml',
                 show_as_html:     params.key?('debug'),
                 no_stop_slow_scripts: ''
        end
      end
    end
    

    我也使用了@mwag 的tilesloaded 回调。 (逐字逐句在谷歌地图生成 javascript 中。) 切换出 no_stop_slow_scripts 的控制器感兴趣的行:

                 ...
                 window_status:   'ready_to_print'
                 ...
    

    两者都有效。不确定其中一个是否有任何优势。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-14
      相关资源
      最近更新 更多