You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
248 lines
6.8 KiB
JavaScript
248 lines
6.8 KiB
JavaScript
// Generated by CoffeeScript 1.12.5
|
|
|
|
/*
|
|
PDFDocument - represents an entire PDF document
|
|
By Devon Govett
|
|
*/
|
|
|
|
(function() {
|
|
var PDFDocument, PDFObject, PDFPage, PDFReference, fs, stream,
|
|
extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
|
|
hasProp = {}.hasOwnProperty;
|
|
|
|
stream = require('stream');
|
|
|
|
fs = require('fs');
|
|
|
|
PDFObject = require('./object');
|
|
|
|
PDFReference = require('./reference');
|
|
|
|
PDFPage = require('./page');
|
|
|
|
PDFDocument = (function(superClass) {
|
|
var mixin;
|
|
|
|
extend(PDFDocument, superClass);
|
|
|
|
function PDFDocument(options1) {
|
|
var key, ref1, ref2, val;
|
|
this.options = options1 != null ? options1 : {};
|
|
PDFDocument.__super__.constructor.apply(this, arguments);
|
|
this.version = 1.3;
|
|
this.compress = (ref1 = this.options.compress) != null ? ref1 : true;
|
|
this._pageBuffer = [];
|
|
this._pageBufferStart = 0;
|
|
this._offsets = [];
|
|
this._waiting = 0;
|
|
this._ended = false;
|
|
this._offset = 0;
|
|
this._root = this.ref({
|
|
Type: 'Catalog',
|
|
Pages: this.ref({
|
|
Type: 'Pages',
|
|
Count: 0,
|
|
Kids: []
|
|
})
|
|
});
|
|
this.page = null;
|
|
this.initColor();
|
|
this.initVector();
|
|
this.initFonts();
|
|
this.initText();
|
|
this.initImages();
|
|
this.info = {
|
|
Producer: 'PDFKit',
|
|
Creator: 'PDFKit',
|
|
CreationDate: new Date()
|
|
};
|
|
if (this.options.info) {
|
|
ref2 = this.options.info;
|
|
for (key in ref2) {
|
|
val = ref2[key];
|
|
this.info[key] = val;
|
|
}
|
|
}
|
|
this._write("%PDF-" + this.version);
|
|
this._write("%\xFF\xFF\xFF\xFF");
|
|
if (this.options.autoFirstPage !== false) {
|
|
this.addPage();
|
|
}
|
|
}
|
|
|
|
mixin = function(methods) {
|
|
var method, name, results;
|
|
results = [];
|
|
for (name in methods) {
|
|
method = methods[name];
|
|
results.push(PDFDocument.prototype[name] = method);
|
|
}
|
|
return results;
|
|
};
|
|
|
|
mixin(require('./mixins/color'));
|
|
|
|
mixin(require('./mixins/vector'));
|
|
|
|
mixin(require('./mixins/fonts'));
|
|
|
|
mixin(require('./mixins/text'));
|
|
|
|
mixin(require('./mixins/images'));
|
|
|
|
mixin(require('./mixins/annotations'));
|
|
|
|
PDFDocument.prototype.addPage = function(options) {
|
|
var pages;
|
|
if (options == null) {
|
|
options = this.options;
|
|
}
|
|
if (!this.options.bufferPages) {
|
|
this.flushPages();
|
|
}
|
|
this.page = new PDFPage(this, options);
|
|
this._pageBuffer.push(this.page);
|
|
pages = this._root.data.Pages.data;
|
|
pages.Kids.push(this.page.dictionary);
|
|
pages.Count++;
|
|
this.x = this.page.margins.left;
|
|
this.y = this.page.margins.top;
|
|
this._ctm = [1, 0, 0, 1, 0, 0];
|
|
this.transform(1, 0, 0, -1, 0, this.page.height);
|
|
this.emit('pageAdded');
|
|
return this;
|
|
};
|
|
|
|
PDFDocument.prototype.bufferedPageRange = function() {
|
|
return {
|
|
start: this._pageBufferStart,
|
|
count: this._pageBuffer.length
|
|
};
|
|
};
|
|
|
|
PDFDocument.prototype.switchToPage = function(n) {
|
|
var page;
|
|
if (!(page = this._pageBuffer[n - this._pageBufferStart])) {
|
|
throw new Error("switchToPage(" + n + ") out of bounds, current buffer covers pages " + this._pageBufferStart + " to " + (this._pageBufferStart + this._pageBuffer.length - 1));
|
|
}
|
|
return this.page = page;
|
|
};
|
|
|
|
PDFDocument.prototype.flushPages = function() {
|
|
var i, len, page, pages;
|
|
pages = this._pageBuffer;
|
|
this._pageBuffer = [];
|
|
this._pageBufferStart += pages.length;
|
|
for (i = 0, len = pages.length; i < len; i++) {
|
|
page = pages[i];
|
|
page.end();
|
|
}
|
|
};
|
|
|
|
PDFDocument.prototype.ref = function(data) {
|
|
var ref;
|
|
ref = new PDFReference(this, this._offsets.length + 1, data);
|
|
this._offsets.push(null);
|
|
this._waiting++;
|
|
return ref;
|
|
};
|
|
|
|
PDFDocument.prototype._read = function() {};
|
|
|
|
PDFDocument.prototype._write = function(data) {
|
|
if (!Buffer.isBuffer(data)) {
|
|
data = new Buffer(data + '\n', 'binary');
|
|
}
|
|
this.push(data);
|
|
return this._offset += data.length;
|
|
};
|
|
|
|
PDFDocument.prototype.addContent = function(data) {
|
|
this.page.write(data);
|
|
return this;
|
|
};
|
|
|
|
PDFDocument.prototype._refEnd = function(ref) {
|
|
this._offsets[ref.id - 1] = ref.offset;
|
|
if (--this._waiting === 0 && this._ended) {
|
|
this._finalize();
|
|
return this._ended = false;
|
|
}
|
|
};
|
|
|
|
PDFDocument.prototype.write = function(filename, fn) {
|
|
var err;
|
|
err = new Error('PDFDocument#write is deprecated, and will be removed in a future version of PDFKit. Please pipe the document into a Node stream.');
|
|
console.warn(err.stack);
|
|
this.pipe(fs.createWriteStream(filename));
|
|
this.end();
|
|
return this.once('end', fn);
|
|
};
|
|
|
|
PDFDocument.prototype.output = function(fn) {
|
|
throw new Error('PDFDocument#output is deprecated, and has been removed from PDFKit. Please pipe the document into a Node stream.');
|
|
};
|
|
|
|
PDFDocument.prototype.end = function() {
|
|
var font, key, name, ref1, ref2, val;
|
|
this.flushPages();
|
|
this._info = this.ref();
|
|
ref1 = this.info;
|
|
for (key in ref1) {
|
|
val = ref1[key];
|
|
if (typeof val === 'string') {
|
|
val = new String(val);
|
|
}
|
|
this._info.data[key] = val;
|
|
}
|
|
this._info.end();
|
|
ref2 = this._fontFamilies;
|
|
for (name in ref2) {
|
|
font = ref2[name];
|
|
font.finalize();
|
|
}
|
|
this._root.end();
|
|
this._root.data.Pages.end();
|
|
if (this._waiting === 0) {
|
|
return this._finalize();
|
|
} else {
|
|
return this._ended = true;
|
|
}
|
|
};
|
|
|
|
PDFDocument.prototype._finalize = function(fn) {
|
|
var i, len, offset, ref1, xRefOffset;
|
|
xRefOffset = this._offset;
|
|
this._write("xref");
|
|
this._write("0 " + (this._offsets.length + 1));
|
|
this._write("0000000000 65535 f ");
|
|
ref1 = this._offsets;
|
|
for (i = 0, len = ref1.length; i < len; i++) {
|
|
offset = ref1[i];
|
|
offset = ('0000000000' + offset).slice(-10);
|
|
this._write(offset + ' 00000 n ');
|
|
}
|
|
this._write('trailer');
|
|
this._write(PDFObject.convert({
|
|
Size: this._offsets.length + 1,
|
|
Root: this._root,
|
|
Info: this._info
|
|
}));
|
|
this._write('startxref');
|
|
this._write("" + xRefOffset);
|
|
this._write('%%EOF');
|
|
return this.push(null);
|
|
};
|
|
|
|
PDFDocument.prototype.toString = function() {
|
|
return "[object PDFDocument]";
|
|
};
|
|
|
|
return PDFDocument;
|
|
|
|
})(stream.Readable);
|
|
|
|
module.exports = PDFDocument;
|
|
|
|
}).call(this);
|