1 2 3 function generatePdf(action, diagram, options) { 4 if (!(diagram instanceof go.Diagram)) throw new Error("no Diagram provided when calling generatePdf"); 5 if (!options) options = {}; 6 7 var pageSize = options.pageSize || "LETTER"; 8 pageSize = pageSize.toUpperCase(); 9 if (pageSize !== "LETTER" && pageSize !== "A4") throw new Error("unknown page size: " + pageSize); 10 // LETTER: 612x792 pt == 816x1056 CSS units 11 // A4: 595.28x841.89 pt == 793.71x1122.52 CSS units 12 var pageWidth = (pageSize === "LETTER" ? 612 : 595.28) * 96 / 72; // convert from pt to CSS units 13 var pageHeight = (pageSize === "LETTER" ? 792 : 841.89) * 96 / 72; 14 15 var layout = options.layout || "portrait"; 16 layout = layout.toLowerCase(); 17 if (layout !== "portrait" && layout !== "landscape") throw new Error("unknown layout: " + layout); 18 if (layout === "landscape") { 19 var temp = pageWidth; 20 pageWidth = pageHeight; 21 pageHeight = temp; 22 } 23 24 var margin = options.margin !== undefined ? options.margin : 36; // pt: 0.5 inch margin on each side 25 var padding = options.padding !== undefined ? options.padding : diagram.padding; // CSS units 26 27 var imgWidth = options.imgWidth !== undefined ? options.imgWidth : (pageWidth - margin / 72 * 96 * 2); // CSS units 28 var imgHeight = options.imgHeight !== undefined ? options.imgHeight : (pageHeight - margin / 72 * 96 * 2); // CSS units 29 var imgResolutionFactor = options.imgResolutionFactor !== undefined ? options.imgResolutionFactor : 3; 30 31 var pageOptions = { 32 size: pageSize, 33 margin: margin, // pt 34 layout: layout 35 }; 36 37 require(["blob-stream", "pdfkit"], function (blobStream, PDFDocument) { 38 var doc = new PDFDocument(pageOptions); 39 var stream = doc.pipe(blobStream()); 40 var bnds = diagram.documentBounds; 41 42 // add some descriptive text 43 //doc.text(diagram.nodes.count + " nodes, " + diagram.links.count + " links Diagram size: " + bnds.width.toFixed(2) + " x " + bnds.height.toFixed(2)); 44 45 var db = diagram.documentBounds.copy().subtractMargin(diagram.padding).addMargin(padding); 46 var p = db.position; 47 // iterate over page areas of document bounds 48 for (var j = 0; j < db.height; j += imgHeight) { 49 for (var i = 0; i < db.width; i += imgWidth) { 50 51 // if any page has no Parts partially or fully in it, skip rendering that page 52 var r = new go.Rect(p.x + i, p.y + j, imgWidth, imgHeight); 53 if (diagram.findPartsIn(r, true, false).count === 0) continue; 54 55 if (i > 0 || j > 0) doc.addPage(pageOptions); 56 57 var makeOptions = {}; 58 if (options.parts !== undefined) makeOptions.parts = options.parts; 59 if (options.background !== undefined) makeOptions.background = options.background; 60 if (options.showTemporary !== undefined) makeOptions.showTemporary = options.showTemporary; 61 if (options.showGrid !== undefined) makeOptions.showGrid = options.showGrid; 62 makeOptions.scale = imgResolutionFactor; 63 makeOptions.position = new go.Point(p.x + i, p.y + j); 64 makeOptions.size = new go.Size(imgWidth * imgResolutionFactor, imgHeight * imgResolutionFactor); 65 makeOptions.maxSize = new go.Size(Infinity, Infinity); 66 67 var imgdata = diagram.makeImageData(makeOptions); 68 doc.image(imgdata, { 69 scale: 1 / (imgResolutionFactor * 96 / 72) 70 }); 71 } 72 } 73 74 doc.end(); 75 stream.on('finish', function () { 76 action(stream.toBlob('application/pdf')); 77 }); 78 }); 79 }; 80 81 function showPdf() { 82 generatePdf(function (blob) { 83 var datauri = window.URL.createObjectURL(blob); 84 var frame = document.getElementById("myFrame"); 85 if (frame) { 86 frame.style.display = "block"; 87 frame.src = datauri; // doesn't work in IE 11, but works everywhere else 88 setTimeout(function () { 89 window.URL.revokeObjectURL(datauri); 90 }, 1); 91 } 92 }, myDiagram, pdfOptions); 93 };
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.