wkhtmltopdf(wicked_pdf) + 绘制地图(最好是Mapbox)

Wkhtmltopdf (wicked_pdf) + drawing maps (preferably Mapbox)

有人可以帮我选择合适的工具来绘制 PDF 地图吗?

我在 Rails 应用程序中使用 wicked_pdf on wkhtmltopdf 生成 PDF。作为地图工具,我更喜欢使用 Mapbox。

到目前为止,我仅通过使用 Mapbox Static API 设法将地图放入 PDF 格式 - 所以我在后端获取原始 PNG,将其转换为 base64 并传递给视图并进行渲染并很好地转换为 pdf。

但是问题是我想从一个大的 GeoJSON 在地图上绘制一个图层,我使用的端点是一个 GET 端点 - 它支持在 URL 中传递 GeoJSON 但使用我的数据超出 URL 的长度。

所以我考虑过使用 MapboxGL JS - 使用 npm 将其加载到应用程序,然后使用 wicked_pdf_javascript_include_tag。但是我无法访问 mapboxgl 变量 - 我得到 ReferenceError: Can't find variable: mapboxgl(其他库,如 lodash 及其 _ var 可以通过这种方式访问​​)。我也尝试过使用 CDN,情况是一样的 - ReferenceError(虽然它只在我为测试创建的 html 文件中工作)。

所以,总结一下。我应该如何在视图中加载mapboxgl js?

如果不可能,您会建议使用哪些其他工具在 PDF 中包含带有 GeoJSON 图层的地图?

请查找附加的代码片段。

布局:

<!doctype html>
<html>
  <head>
    <meta charset='utf-8' />
    <%= yield :head %>
    <%= yield :styles %>
  </head>

  <body>
    <div id="content">
      <%= yield %>
    </div>
  </body>
</html>

查看:

<% content_for :head do %>
  <%= wicked_pdf_stylesheet_link_tag "mapbox-gl/dist/mapbox-gl" %>
  <%= wicked_pdf_javascript_include_tag "mapbox-gl/dist/mapbox-gl" %>
<% end %>

...

<div id="map" style="width: 100%;height: 300px;"></div>

<script>
  try {
    mapboxgl.accessToken = 'xxx';
    var map = new mapboxgl.Map({
      container: 'map',
      style: 'mapbox://styles/mapbox/streets-v11',
      center: [-74.50, 40],
      zoom: 9
    });
  } catch(e) {
    var map = document.getElementById('map');
    map.innerHTML = e;
  }
</script>

这导致 ReferenceError: Can't find variable: mapboxgl 在我的 PDF 中呈现。

我在 Mapbox (https://github.com/mapbox/mapbox-gl-js/issues/8719) 中打开了一个问题,但是他们不支持这个。

因为我有使用 wkhtmltopdf 构建的功能,所以我只使用 Puppeteer 来渲染地图(带有 Mapbox tiles 的 Leaflet)并且我将转换为 Base64 的屏幕截图传递给 wicked_pdf 的视图。

Puppeteer/Leaflet/Mapbox set 效果很好,我得到了一张用 GeoJSON 图层渲染的地图。

另请参阅附件中关于在 Rails 和 Heroku 上设置 Puppeteer 的精彩文章:https://www.forsbergplustwo.com/blogs/news/pdf-generation-with-chrome-headless-in-ruby-using-puppeteer-on-heroku