Linux ip-172-26-7-228 5.4.0-1103-aws #111~18.04.1-Ubuntu SMP Tue May 23 20:04:10 UTC 2023 x86_64
Your IP : 13.59.82.60
/**
* jsPDF
* (c) 2009 James Hall
*
* Some parts based on FPDF.
*/
var jsPDF = function(){
// Private properties
var version = '20090504';
var buffer = '';
var pdfVersion = '1.3'; // PDF Version
var defaultPageFormat = 'a4';
var pageFormats = { // Size in mm of various paper formats
'a3': [841.89, 1190.55],
'a4': [595.28, 841.89],
'a5': [420.94, 595.28],
'letter': [612, 792],
'legal': [612, 1008]
};
var textColor = '0 g';
var page = 0;
var objectNumber = 2; // 'n' Current object number
var state = 0; // Current document state
var pages = new Array();
var offsets = new Array(); // List of offsets
var lineWidth = 0.200025; // 2mm
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;
// Initilisation
if (unit == 'pt') {
k = 1;
} else if(unit == 'mm') {
k = 72/25.4;
} else if(unit == 'cm') {
k = 72/2.54;
} else if(unit == 'in') {
k = 72;
}
// Private functions
var newObject = function() {
//Begin a new object
objectNumber ++;
offsets[objectNumber] = buffer.length;
out(objectNumber + ' 0 obj');
}
var putHeader = function() {
out('%PDF-' + pdfVersion);
}
var putPages = function() {
// TODO: Fix, hardcoded to a4 portrait
var wPt = pageWidth * k;
var hPt = pageHeight * k;
for(n=1; n <= page; n++) {
newObject();
out('<</Type /Page');
out('/Parent 1 0 R');
out('/Resources 2 0 R');
out('/Contents ' + (objectNumber + 1) + ' 0 R>>');
out('endobj');
//Page content
p = pages[n];
newObject();
out('<</Length ' + p.length + '>>');
putStream(p);
out('endobj');
}
offsets[1] = buffer.length;
out('1 0 obj');
out('<</Type /Pages');
var kids='/Kids [';
for (i = 0; i < page; i++) {
kids += (3 + 2 * i) + ' 0 R ';
}
out(kids + ']');
out('/Count ' + page);
out(sprintf('/MediaBox [0 0 %.2f %.2f]', wPt, hPt));
out('>>');
out('endobj');
}
var putStream = function(str) {
out('stream');
out(str);
out('endstream');
}
var putResources = function() {
putFonts();
putImages();
//Resource dictionary
offsets[2] = buffer.length;
out('2 0 obj');
out('<<');
putResourceDictionary();
out('>>');
out('endobj');
}
var putFonts = function() {
// TODO: Only supports core font hardcoded to Helvetica
newObject();
fontNumber = objectNumber;
name = 'Helvetica';
out('<</Type /Font');
out('/BaseFont /' + name);
out('/Subtype /Type1');
out('/Encoding /WinAnsiEncoding');
out('>>');
out('endobj');
}
var putImages = function() {
// TODO
}
var putResourceDictionary = function() {
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');
out('>>');
out('/XObject <<');
putXobjectDict();
out('>>');
}
var putXobjectDict = function() {
// TODO
// Loop through images
}
var putInfo = function() {
out('/Producer (jsPDF ' + version + ')');
if(documentProperties.title != undefined) {
out('/Title (' + pdfEscape(documentProperties.title) + ')');
}
if(documentProperties.subject != undefined) {
out('/Subject (' + pdfEscape(documentProperties.subject) + ')');
}
if(documentProperties.author != undefined) {
out('/Author (' + pdfEscape(documentProperties.author) + ')');
}
if(documentProperties.keywords != undefined) {
out('/Keywords (' + pdfEscape(documentProperties.keywords) + ')');
}
if(documentProperties.creator != undefined) {
out('/Creator (' + pdfEscape(documentProperties.creator) + ')');
}
var created = new Date();
var year = created.getFullYear();
var month = (created.getMonth() + 1);
var day = created.getDate();
var hour = created.getHours();
var minute = created.getMinutes();
var second = created.getSeconds();
out('/CreationDate (D:' + sprintf('%02d%02d%02d%02d%02d%02d', year, month, day, hour, minute, second) + ')');
}
var putCatalog = function () {
out('/Type /Catalog');
out('/Pages 1 0 R');
// TODO: Add zoom and layout modes
out('/OpenAction [3 0 R /FitH null]');
out('/PageLayout /OneColumn');
}
function putTrailer() {
out('/Size ' + (objectNumber + 1));
out('/Root ' + objectNumber + ' 0 R');
out('/Info ' + (objectNumber - 1) + ' 0 R');
}
var endDocument = function() {
state = 1;
putHeader();
putPages();
putResources();
//Info
newObject();
out('<<');
putInfo();
out('>>');
out('endobj');
//Catalog
newObject();
out('<<');
putCatalog();
out('>>');
out('endobj');
//Cross-ref
var o = buffer.length;
out('xref');
out('0 ' + (objectNumber + 1));
out('0000000000 65535 f ');
for (var i=1; i <= objectNumber; i++) {
out(sprintf('%010d 00000 n ', offsets[i]));
}
//Trailer
out('trailer');
out('<<');
putTrailer();
out('>>');
out('startxref');
out(o);
out('%%EOF');
state = 3;
}
var beginPage = function() {
page ++;
// Do dimension stuff
state = 2;
pages[page] = '';
// TODO: Hardcoded at A4 and portrait
pageHeight = pageFormats['a4'][1] / k;
pageWidth = pageFormats['a4'][0] / k;
}
var out = function(string) {
if(state == 2) {
pages[page] += string + '\n';
} else {
buffer += string + '\n';
}
}
var _addPage = function() {
beginPage();
// 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');
}
// Add the first page automatically
_addPage();
// Escape text
var pdfEscape = function(text) {
return text.replace(/\\/g, '\\\\').replace(/\(/g, '\\(').replace(/\)/g, '\\)');
}
return {
addPage: function() {
_addPage();
},
text: function(x, y, text) {
// need page height
if(pageFontSize != fontSize) {
out('BT /F1 ' + parseInt(fontSize) + '.00 Tf ET');
pageFontSize = fontSize;
}
var str = sprintf('BT %.2f %.2f Td (%s) Tj ET', x * k, (pageHeight - y) * k, pdfEscape(text));
out(str);
},
setProperties: function(properties) {
documentProperties = properties;
},
addImage: function(imageData, format, x, y, w, h) {
},
output: function(type, options) {
endDocument();
if(type == undefined) {
return buffer;
}
if(type == 'datauri') {
document.location.href = 'data:application/pdf;base64,' + Base64.encode(buffer);
}
// @TODO: Add different output options
},
setFontSize: function(size) {
fontSize = size;
}
}
};
|