From 1fa06cf815605f0e0356661c674f006b363c9b63 Mon Sep 17 00:00:00 2001 From: Mickael Daniel Date: Sun, 10 Apr 2011 16:36:08 +0200 Subject: [PATCH] add the ability to switch fonts while creating pdf documents, setFont() --- index.html | 11 +++++++-- lib/pdf.js | 67 +++++++++++++++++++++++++++++++++++++++++------------- 2 files changed, 60 insertions(+), 18 deletions(-) diff --git a/index.html b/index.html index 938a5e4..cf1f5df 100644 --- a/index.html +++ b/index.html @@ -69,12 +69,13 @@

demo -
diff --git a/lib/pdf.js b/lib/pdf.js index 5b3204c..00922e9 100644 --- a/lib/pdf.js +++ b/lib/pdf.js @@ -41,10 +41,14 @@ var pdf = exports.pdf = function(){ var pageHeight; var k; // Scale factor var unit = 'mm'; // Default to mm for units - var fontNumber; // TODO: This is temp, replace with real font handling var documentProperties = {}; var fontSize = 16; // Default font size var pageFontSize = 16; + var font = 'Courier'; // Default font + var pageFont = font; + var fonts = {}; // fonts holder, namely use in putRessource + var fontIndex = 0; // F1, F2, etc. using setFont + var fontsNumber = {}; // object number holder for fonts // Initilisation if (unit == 'pt') { @@ -112,7 +116,19 @@ var pdf = exports.pdf = function(){ } var putResources = function() { - putFonts(); + var f; + // Deal with fonts, defined in fonts by user (using setFont). + if(fontIndex) { + for( f in fonts ) { + putFonts(f); + } + } else { + // if fontIndex still 0, means that setFont was not used, fallback to default + fonts[font] = 1; + putFonts(font); + } + + putImages(); //Resource dictionary @@ -124,13 +140,12 @@ var pdf = exports.pdf = function(){ out('endobj'); } - var putFonts = function() { - // TODO: Only supports core font hardcoded to Helvetica + var putFonts = function(font) { newObject(); - fontNumber = objectNumber; - name = 'Helvetica'; + fontsNumber[font] = objectNumber; + out('<>'); @@ -163,11 +178,17 @@ var pdf = exports.pdf = function(){ }; var putResourceDictionary = function() { + var i = 0, index, fx; + out('/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]'); out('/Font <<'); + // Do this for each font, the '1' bit is the index of the font - // fontNumber is currently the object number related to 'putFonts' - out('/F1 ' + fontNumber + ' 0 R'); + // fontNumber is currently the object number related to 'putFonts' + for( index in fontsNumber ) { + out(fonts[index] + ' ' + fontsNumber[index] + ' 0 R'); + } + out('>>'); out('/XObject <<'); putXobjectDict(); @@ -284,10 +305,10 @@ var pdf = exports.pdf = function(){ // Set line width out(sprintf('%.2f w', (lineWidth * k))); - // Set font - TODO // 16 is the font size pageFontSize = fontSize; - out('BT /F1 ' + parseInt(fontSize) + '.00 Tf ET'); + pageFont = font; + out('BT ' + fonts[font] + ' ' + parseInt(fontSize) + '.00 Tf ET'); } // Add the first page automatically @@ -302,13 +323,19 @@ var pdf = exports.pdf = function(){ addPage: function() { _addPage(); }, - text: function(x, y, text) { - // need page height - if(pageFontSize != fontSize) { - out('BT /F1 ' + parseInt(fontSize) + '.00 Tf ET'); + text: function(x, y, text, f) { + if(f) { + this.setFont(f); + } + + // need either page height or page font + if(pageFontSize !== fontSize || pageFont !== font) { pageFontSize = fontSize; + pageFont = font; } - var str = sprintf('BT %.2f %.2f Td (%s) Tj ET', x * k, (pageHeight - y) * k, pdfEscape(text)); + + var str = sprintf('BT %.2f %.2f Td (%s) Tj ET', x * k, (pageHeight - y) * k, pdfEscape(text)) + out('BT ' + fonts[font] + ' ' + parseInt(fontSize, 10) + '.00 Tf ET'); out(str); }, drawRect: function(x, y, w, h, style) { @@ -339,6 +366,14 @@ var pdf = exports.pdf = function(){ }, setFontSize: function(size) { fontSize = size; + }, + setFont: function(f){ + if( !(f in fonts) ) { + // if not known font yet, add in fonts array, then used in endDocument + // while putting ressource + fonts[f] = '/F' + (fontIndex++); + } + font = f; } }