【问题标题】:Google Maps API V3 Printing MapsGoogle Maps API V3 打印地图
【发布时间】:2012-10-14 13:15:04
【问题描述】:

我正在寻找一种方法来有效打印已在使用 google maps api v3 的网站上实施的 Google 地图。

我见过一些人只使用 window.print js,然后

@media print
{
    body * { visibility: hidden; }
    #map * { visibility: visible; }
    #map {visibility: visible;position:absolute; top: 5px; left: 5px;}
}

目前使用 fancybox 的用户会看到一个更大的地图,我为此添加了一个打印按钮。理想情况下,我只想添加一些 jquery 或类似的东西来打印地图。

但是这似乎并没有真正起作用。有没有人对最好的方法有任何建议

【问题讨论】:

标签: jquery google-maps google-maps-api-3 fancybox


【解决方案1】:

如果您想为每个浏览器打印完整大小的地图,请尝试以下操作:

function printMap() {
$('<style media="print">')
    .text(`
   body {
    width: ${screen.width}px;
    height: ${screen.height}px;
  }
  body { zoom: 50% !important;}
`)
    .appendTo('head');

window.print();
return false;

}

【讨论】:

  • 他们在评论中得到了答案,现在回答这个问题为时已晚
  • 但是一个有用的答案。以前的答案对我不起作用(有时以前的答案无法正确打印)。
【解决方案2】:

我想通过简单而微妙的 DOM 操作,您可以获得 Google 地图(理论上 - 任何地图 :))查看器的“快照”,并在任何浏览器中完美打印。假设$mapContainer是你的地图的主要容器,相关代码是:

// printAnyMaps ::
function printAnyMaps() {
  const $body = $('body');
  const $mapContainer = $('.map-container');
  const $mapContainerParent = $mapContainer.parent();
  const $printContainer = $('<div style="position:relative;">');

  $printContainer
    .height($mapContainer.height())
    .append($mapContainer)
    .prependTo($body);

  const $content = $body
    .children()
    .not($printContainer)
    .not('script')
    .detach();

  /**
   * Needed for those who use Bootstrap 3.x, because some of
   * its `@media print` styles ain't play nicely when printing.
   */
  const $patchedStyle = $('<style media="print">')
    .text(`
      img { max-width: none !important; }
      a[href]:after { content: ""; }
    `)
    .appendTo('head');

  window.print();

  $body.prepend($content);
  $mapContainerParent.prepend($mapContainer);

  $printContainer.remove();
  $patchedStyle.remove();
}

请注意,您可以灵活地将$printContainer 替换为任何打印模板。这里我只是使用一个简单的&lt;div&gt; 作为快照的占位符。

这里的工作代码:http://jsfiddle.net/glenn/6mx21ted

【讨论】:

  • 此功能打印正常,但有一点小问题。即使地图只能放在一页中,它也会打印 3 页。
  • 我试过了,但它显示空白地图,只显示标记
  • @RonakP 介意在 JSFiddle 或 GitHub 之类的地方分享您的代码,以便我更好地了解原因并改进解决方案吗?
  • 是的,和你的一样,没什么不同。有什么影响?
  • 感谢您的解决方法,在我的网站中,您只使用了您的 css 部分:' @media print { img { max-width: none !important; } a[href]:after { content: ""; } } '
【解决方案3】:

您可以使用html2canvas.js将地图div转换为画布元素,然后您可以将其打印为图像。下面的代码非常适合我:

HTML

<div id="map" style="width:500px;height:500px;"></div>
<input type="button" value="Print Map" class="printBtn" />

JavaScript

var map = new google.maps.Map(document.getElementById('map'), {
            zoom: 13,
            center: defLocation,
            mapTypeId: 'satellite',
            streetViewControl: false
        });      
$(document).on('click', '.printBtn', function () {
            map.setOptions({
                mapTypeControl: false,
                zoomControl: false,
                streetViewControl: false,
                panControl: false
            });
            var printWin = window.open('', '', 'width=1000,height=700');
            var windowContent = '<!DOCTYPE html>';

            html2canvas($("#map"), {
                useCORS: true,
                onrendered: function (canvas) {
                    windowContent += '<html>'
                    windowContent += '<head><title>Print canvas</title></head>';
                    windowContent += '<body>'
                    windowContent += '<img src="' + canvas.toDataURL() + '">';
                    windowContent += '</body>';
                    windowContent += '</html>';
                    printWin.document.open();
                    printWin.document.write(windowContent);
                    printWin.document.close();
                    printWin.focus();
                    setTimeout(function () { printWin.print(); printWin.close(); }, 500);

                    map.setOptions({
                        mapTypeControl: true,
                        zoomControl: true,
                        streetViewControl: true,
                        panControl: true
                    });
                }
            });
        });

【讨论】:

    【解决方案4】:

    请注意,如果您还使用 Bootstrap,它会为您中断地图打印。添加此代码:

    @media print {
      img {
        max-width: auto !important;
      }
    }
    

    Twitter Bootstrap CSS affecting Google Maps

    【讨论】:

      【解决方案5】:

      在 HTML 中,#Gmap 是显示谷歌地图的 div,打印按钮一旦被点击就会调用函数 gmapPrint()。

      <!-- HTML -->
      <div id="Gmap"></div> 
      <div onclick="gmapPrint();">Print Button</div>
      

      在 JavaScript 中,gmapPrint() 函数读取地图详细信息并将其写入新窗口。然后打印新窗口。

      <!-- JS Script -->
      function gmapPrint() {
          var content = window.document.getElementById("Gmap"); // get you map details
          var newWindow = window.open(); // open a new window
          newWindow.document.write(content.innerHTML); // write the map into the new window
          newWindow.print(); // print the new window
      }
      

      【讨论】:

      • 嗨@Jingwen 我也想打印带有页面内容的地图吗?当我使用 window.Print() 它打印 div 中的所有文本但无法打印谷歌地图时,我有收据布局要打印其中的地图位置?任何想法?建议?
      猜你喜欢
      • 2013-10-03
      • 2011-12-25
      • 2012-07-17
      • 1970-01-01
      • 1970-01-01
      • 2012-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多