From 004e7ad0d0202c037e3d449e1f33c4b33c0d54ed Mon Sep 17 00:00:00 2001 From: Erik Timmers Date: Sun, 3 Aug 2014 09:22:24 +0200 Subject: [PATCH] Add PDF example --- config/examples-all.json | 1 + examples/export-pdf.css | 3 ++ examples/export-pdf.html | 33 ++++++++++++ examples/export-pdf.js | 109 +++++++++++++++++++++++++++++++++++++++ externs/jspdf.js | 46 +++++++++++++++++ 5 files changed, 192 insertions(+) create mode 100644 examples/export-pdf.css create mode 100644 examples/export-pdf.html create mode 100644 examples/export-pdf.js create mode 100644 externs/jspdf.js diff --git a/config/examples-all.json b/config/examples-all.json index 3994572934..1b5d45e16f 100644 --- a/config/examples-all.json +++ b/config/examples-all.json @@ -18,6 +18,7 @@ "externs/example.js", "externs/fastclick.js", "externs/geojson.js", + "externs/jspdf.js", "externs/jquery-1.9.js", "externs/proj4js.js", "externs/tilejson.js", diff --git a/examples/export-pdf.css b/examples/export-pdf.css new file mode 100644 index 0000000000..84aab47ac6 --- /dev/null +++ b/examples/export-pdf.css @@ -0,0 +1,3 @@ +.map { + max-width: 566px; +} diff --git a/examples/export-pdf.html b/examples/export-pdf.html new file mode 100644 index 0000000000..18f061461d --- /dev/null +++ b/examples/export-pdf.html @@ -0,0 +1,33 @@ +--- +layout: example.html +title: Export PDF example +shortdesc: Example of exporting a map as a PDF. +docs: > + Example of exporting a map as a PDF using the jsPDF library. +tags: "export, pdf, openstreetmap" +resources: + - http://mrrio.github.io/jsPDF/dist/jspdf.min.js +--- +
+
+
+
+
+
+ + + + +
+ diff --git a/examples/export-pdf.js b/examples/export-pdf.js new file mode 100644 index 0000000000..44c5c2d323 --- /dev/null +++ b/examples/export-pdf.js @@ -0,0 +1,109 @@ +goog.require('ol.Map'); +goog.require('ol.View'); +goog.require('ol.control'); +goog.require('ol.format.WKT'); +goog.require('ol.layer.Tile'); +goog.require('ol.layer.Vector'); +goog.require('ol.source.OSM'); +goog.require('ol.source.Vector'); + +var raster = new ol.layer.Tile({ + source: new ol.source.OSM() +}); + +var format = new ol.format.WKT(); +var feature = format.readFeature( + 'POLYGON((10.689697265625 -25.0927734375, 34.595947265625 ' + + '-20.1708984375, 38.814697265625 -35.6396484375, 13.502197265625 ' + + '-39.1552734375, 10.689697265625 -25.0927734375))'); +feature.getGeometry().transform('EPSG:4326', 'EPSG:3857'); + +var vector = new ol.layer.Vector({ + source: new ol.source.Vector({ + features: [feature] + }) +}); + + +var map = new ol.Map({ + layers: [raster, vector], + target: 'map', + controls: ol.control.defaults({ + attributionOptions: /** @type {olx.control.AttributionOptions} */ ({ + collapsible: false + }) + }), + view: new ol.View({ + center: [0, 0], + zoom: 2 + }) +}); + + +var dims = { + a0: [1189, 841], + a1: [841, 594], + a2: [594, 420], + a3: [420, 297], + a4: [297, 210], + a5: [210, 148] +}; + +var loading = 0; +var loaded = 0; + +var exportButton = document.getElementById('export-pdf'); + +exportButton.addEventListener('click', function(e) { + + exportButton.disabled = true; + document.body.style.cursor = 'progress'; + + var format = document.getElementById('format').value; + var resolution = document.getElementById('resolution').value; + var dim = dims[format]; + var width = Math.round(dim[0] * resolution / 25.4); + var height = Math.round(dim[1] * resolution / 25.4); + var size = /** @type {ol.Size} */ (map.getSize()); + var extent = map.getView().calculateExtent(size); + + var source = raster.getSource(); + + var tileLoadStart = function() { + ++loading; + }; + + var tileLoadEnd = function(callback) { + ++loaded; + if (loading === loaded) { + var canvas = this; + window.setTimeout(function() { + loading = 0; + loaded = 0; + var data = canvas.toDataURL('image/png'); + var pdf = new jsPDF('landscape', undefined, format); + pdf.addImage(data, 'JPEG', 0, 0, dim[0], dim[1]); + pdf.save('map.pdf'); + source.un('tileloadstart', tileLoadStart); + source.un('tileloadend', tileLoadEnd, canvas); + source.un('tileloaderror', tileLoadEnd, canvas); + map.setSize(size); + map.getView().fit(extent, size); + map.renderSync(); + exportButton.disabled = false; + document.body.style.cursor = 'auto'; + }, 100); + } + }; + + map.once('postcompose', function(event) { + source.on('tileloadstart', tileLoadStart); + source.on('tileloadend', tileLoadEnd, event.context.canvas); + source.on('tileloaderror', tileLoadEnd, event.context.canvas); + }); + + map.setSize([width, height]); + map.getView().fit(extent, /** @type {ol.Size} */ (map.getSize())); + map.renderSync(); + +}, false); diff --git a/externs/jspdf.js b/externs/jspdf.js new file mode 100644 index 0000000000..3c1652c92e --- /dev/null +++ b/externs/jspdf.js @@ -0,0 +1,46 @@ +/** + * @fileoverview jsPDF PDF generator. + * @see https://github.com/MrRio/jsPDF + */ + +/** + * @constructor + * @param {string=} orientation One of `portrait` or `landscape` + * (or shortcuts `p` (default), `l`). + * @param {string=} unit Measurement unit to be used when coordinates are specified. + * One of `pt`, `mm` (default), `cm`, `in`. + * @param {string=} format Default: `a4`. + * @param {boolean=} compressPdf + */ +var jsPDF = function(orientation, unit, format, compressPdf) {}; + +/** + * @param {string} imageData + * @param {string} format + * @param {number} x + * @param {number} y + * @param {number} w + * @param {number} h + * @param {string=} alias + * @param {number=} compression + * @return {jsPDF} + */ +jsPDF.prototype.addImage = function(imageData, format, x, y, w, h, alias, compression) {}; + +/** + * @return {jsPDF} + */ +jsPDF.prototype.autoPrint = function() {}; + +/** + * @param {string} type + * @param {Object=} options + * @return {jsPDF} + */ +jsPDF.prototype.output = function(type, options) {}; + +/** + * @param {string} filename + * @return {jsPDF} + */ +jsPDF.prototype.save = function(filename) {};