@syncfusion/ej2-pdf
Version:
Feature-rich JavaScript PDF library with built-in support for loading and manipulating PDF document.
1,142 lines (1,141 loc) • 46.8 kB
JavaScript
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
import { PdfDestinationMode, PdfRotationAngle, PdfTextStyle } from './enumerator';
import { PdfDestination, _PdfDestinationHelper } from './pdf-page';
import { _PdfDictionary, _PdfName, _PdfReference } from './pdf-primitives';
import { _checkRotation, _getPageIndex, _isNullOrUndefined, _parseColor } from './utils';
/**
* Represents a base class for all bookmark objects.
* ```typescript
* // Load an existing PDF document
* let document: PdfDocument = new PdfDocument(data, password);
* // Get bookmarks
* let bookmarks: PdfBookmarkBase = document.bookmarks;
* // Destroy the document
* document.destroy();
* ```
*/
var PdfBookmarkBase = /** @class */ (function () {
/**
* Initializes a new instance of the `PdfBookmarkBase` class.
*
* @private
* @param {_PdfDictionary} dictionary Outline dictionary.
* @param {_PdfCrossReference} crossReference Cross reference.
*
*/
function PdfBookmarkBase(dictionary, crossReference) {
this._bookMarkList = [];
this._isExpanded = false;
this._isLoadedBookmark = false;
this._dictionary = dictionary;
this._crossReference = crossReference;
}
Object.defineProperty(PdfBookmarkBase.prototype, "count", {
/**
* Gets the bookmark count (Read only).
*
* @returns {number} Number of bookmarks.
*
* ```typescript
* // Load an existing PDF document
* let document: PdfDocument = new PdfDocument(data, password);
* // Get bookmarks
* let bookmarks: PdfBookmarkBase = document.bookmarks;
* // Get bookmark count
* let bookmarkCount: number = bookmarks.count;
* // Destroy the document
* document.destroy();
* ```
*/
get: function () {
if (this._isLoadedBookmark && this._bookMarkList.length === 0) {
this._reproduceTree();
}
return this._bookMarkList.length;
},
enumerable: true,
configurable: true
});
Object.defineProperty(PdfBookmarkBase.prototype, "isExpanded", {
/**
* Gets the boolean flag indicating whether the bookmark is expanded or not.
*
* @returns {boolean} whether the bookmark is expanded or not.
*
* ```typescript
* // Load an existing PDF document
* let document: PdfDocument = new PdfDocument(data, password);
* // Get the bookmarks
* let bookmarks: PdfBookmarkBase = document.bookmarks;
* // Gets bookmark at the specified index
* let bookmark: PdfBookmark = bookmarks.at(0) as PdfBookmark;
* // Gets the boolean flag indicating whether the bookmark is expanded or not
* let isExpanded: boolean = bookmark.isExpanded;
* // Destroy the document
* document.destroy();
* ```
*/
get: function () {
if (this._dictionary && this._dictionary.has('Count')) {
return (this._dictionary.get('Count') >= 0);
}
else {
return this._isExpanded;
}
},
/**
* Sets the boolean flag indicating whether the bookmark is expanded or not.
*
* @param {boolean} value whether the bookmark is expanded or not.
*
* ```typescript
* // Load an existing PDF document
* let document: PdfDocument = new PdfDocument(data, password);
* // Get the bookmarks
* let bookmarks: PdfBookmarkBase = document.bookmarks;
* // Gets bookmark at the specified index
* let bookmark: PdfBookmark = bookmarks.at(0) as PdfBookmark;
* // Sets the boolean flag indicating whether the bookmark is expanded or not
* bookmark.isExpanded = true;
* // Destroy the document
* document.destroy();
* ```
*/
set: function (value) {
this._isExpanded = value;
if (this.count > 0 && this._dictionary) {
this._dictionary.update('Count', value ? this._bookMarkList.length : (-this._bookMarkList.length));
}
},
enumerable: true,
configurable: true
});
/**
* Gets the `PdfBookmark` at the specified index.
*
* @param {number} index Bookmark index.
* @returns {PdfBookmark} Bookmark at the specified index.
*
* ```typescript
* // Load an existing PDF document
* let document: PdfDocument = new PdfDocument(data, password);
* // Get bookmarks
* let bookmarks: PdfBookmarkBase = document.bookmarks;
* // Get bookmark at the specified index
* let bookmark: PdfBookmark = bookmarks.at(0) as PdfBookmark;
* // Destroy the document
* document.destroy();
* ```
*/
PdfBookmarkBase.prototype.at = function (index) {
var bookmark;
if (index < 0 || index >= this.count) {
throw Error('Index out of range.');
}
if (_isNullOrUndefined(this._bookMarkList) && this._bookMarkList.length > 0 && index < this._bookMarkList.length) {
bookmark = this._bookMarkList[index];
}
return bookmark;
};
/**
* Gets the boolean flag indicating whether `PdfBookmark` is present or not.
*
* @param {PdfBookmark} outline Bookmark.
* @returns {boolean} whether the bookmark is present or not.
*
* ```typescript
* // Load an existing PDF document
* let document: PdfDocument = new PdfDocument(data, password);
* // Get the bookmarks
* let bookmarks: PdfBookmarkBase = document.bookmarks;
* // Get the bookmark at the specified index
* let bookmark: PdfBookmark = bookmarks.at(0) as PdfBookmark;
* // Gets the boolean flag indicating whether `PdfBookmark` is present or not.
* let isPresent: boolean = bookmarks.contains(bookmark);
* // Destroy the document
* document.destroy();
* ```
*/
PdfBookmarkBase.prototype.contains = function (outline) {
return this._bookMarkList.indexOf(outline) !== -1;
};
PdfBookmarkBase.prototype.add = function (title, index) {
var bookmark;
if (this._dictionary) {
var dictionary = new _PdfDictionary(this._crossReference);
dictionary.update('Parent', this._reference);
var reference = this._crossReference._getNextReference();
this._crossReference._cacheMap.set(reference, dictionary);
bookmark = new PdfBookmark(dictionary, this._crossReference);
bookmark._reference = reference;
bookmark.title = title;
if (typeof index === 'undefined') {
if (this.count === 0) {
this._dictionary.update('First', reference);
this._dictionary.update('Last', reference);
}
else {
var last = this.at(this.count - 1);
this._dictionary.update('Last', reference);
if (last && last._reference) {
dictionary.update('Prev', last._reference);
last._dictionary.update('Next', reference);
}
}
this._bookMarkList.push(bookmark);
}
else {
if (index < 0 || index > this.count) {
throw new Error('Index out of range');
}
if (this.count === 0) {
this._dictionary.update('First', reference);
this._dictionary.update('Last', reference);
this._bookMarkList.push(bookmark);
}
else if (index === this.count) {
var last = this.at(this.count - 1);
this._dictionary.update('Last', reference);
if (last && last._reference) {
dictionary.update('Prev', last._reference);
last._dictionary.update('Next', reference);
}
this._bookMarkList.push(bookmark);
}
else if (index === 0) {
var first = this.at(0);
this._dictionary.update('First', reference);
if (first && first._reference) {
dictionary.update('Next', first._reference);
first._dictionary.update('Prev', reference);
}
this._updateBookmarkList(index, bookmark);
}
else {
var next = this.at(index);
var prev = this.at(index - 1);
if (prev && prev._reference && next && next._reference) {
dictionary.update('Prev', prev._reference);
prev._dictionary.update('Next', reference);
next._dictionary.update('Prev', reference);
dictionary.update('Next', next._reference);
}
this._updateBookmarkList(index, bookmark);
}
}
this._updateCount();
}
return bookmark;
};
PdfBookmarkBase.prototype.remove = function (value) {
if (typeof value === 'string') {
for (var i = this._bookMarkList.length - 1; i >= 0; i--) {
var bookmark = this.at(i);
if (bookmark.title === value) {
this.remove(i);
}
else if (bookmark.count > 0) {
bookmark.remove(value);
}
}
}
else {
if (value >= 0 && value < this.count) {
if (this.count === 1) {
this._removeFirst(this._dictionary);
this._removeLast(this._dictionary);
this._removeCount(this._dictionary);
this._bookMarkList = [];
}
else {
if (value === 0) {
var next = this.at(value + 1);
if (this._dictionary && next && next._reference) {
this._removePrevious(next._dictionary);
this._dictionary.update('First', next._reference);
}
}
else if (value === this.count - 1) {
var prev = this.at(value - 1);
if (this._dictionary && prev && prev._reference) {
this._removeNext(prev._dictionary);
this._dictionary.update('Last', prev._reference);
}
}
else {
var prev = this.at(value - 1);
var next = this.at(value + 1);
if (prev && prev._reference && next && next._reference) {
prev._dictionary.update('Next', next._reference);
next._dictionary.update('Prev', prev._reference);
}
}
this._updateBookmarkList(value);
if (this._dictionary) {
this._updateCount();
}
}
}
}
};
/**
* Removes all the bookmark from the collection.
*
* @returns {void} Nothing.
*
* ```typescript
* // Load an existing PDF document
* let document: PdfDocument = new PdfDocument(data, password);
* // Get the bookmarks
* let bookmarks: PdfBookmarkBase = document.bookmarks;
* // Remove all the bookmark from the collection.
* bookmarks.clear();
* // Get count after removal of all outlines.
* let count: number = bookmarks.count;
* // Destroy the document
* document.destroy();
* ```
*/
PdfBookmarkBase.prototype.clear = function () {
this._removeFirst(this._dictionary);
this._removeLast(this._dictionary);
this._removeCount(this._dictionary);
this._bookMarkList = [];
};
PdfBookmarkBase.prototype._removeFirst = function (dictionary) {
if (dictionary && dictionary.has('First')) {
delete dictionary._map.First;
dictionary._updated = true;
}
};
PdfBookmarkBase.prototype._removeLast = function (dictionary) {
if (dictionary && dictionary.has('Last')) {
delete dictionary._map.Last;
dictionary._updated = true;
}
};
PdfBookmarkBase.prototype._removeNext = function (dictionary) {
if (dictionary && dictionary.has('Next')) {
delete dictionary._map.Next;
dictionary._updated = true;
}
};
PdfBookmarkBase.prototype._removePrevious = function (dictionary) {
if (dictionary && dictionary.has('Prev')) {
delete dictionary._map.Prev;
dictionary._updated = true;
}
};
PdfBookmarkBase.prototype._removeCount = function (dictionary) {
if (dictionary && dictionary.has('Count')) {
delete dictionary._map.Count;
dictionary._updated = true;
}
};
PdfBookmarkBase.prototype._updateBookmarkList = function (index, bookmark) {
var _this = this;
var updatedList = [];
var i = 0;
if (typeof bookmark === 'undefined') {
this._bookMarkList.forEach(function (entry) {
if (i !== index) {
updatedList.push(entry);
}
else {
var reference = entry._reference;
if (reference && _this._crossReference._cacheMap.has(reference)) {
_this._crossReference._cacheMap.get(reference)._updated = false;
}
}
i++;
});
}
else {
this._bookMarkList.forEach(function (entry) {
if (i === index) {
updatedList.push(bookmark);
}
updatedList.push(entry);
i++;
});
}
this._bookMarkList = updatedList;
};
PdfBookmarkBase.prototype._updateCount = function () {
if (this.isExpanded || !this._dictionary.has('Count')) {
this._dictionary.update('Count', this._bookMarkList.length);
}
else {
this._dictionary.update('Count', -this._bookMarkList.length);
}
};
PdfBookmarkBase.prototype._reproduceTree = function () {
var firstBookmark = this._getBookmark(this);
var isBookmark = (firstBookmark) ? true : false;
while (isBookmark && firstBookmark._dictionary) {
this._bookMarkList.push(firstBookmark);
firstBookmark = firstBookmark._next;
isBookmark = (firstBookmark) ? true : false;
}
};
PdfBookmarkBase.prototype._getBookmark = function (bookmarkBase, isFirst) {
if (isFirst === void 0) { isFirst = true; }
var bookmarkBaseDictionary = bookmarkBase._dictionary;
var bookMark;
if (bookmarkBaseDictionary && bookmarkBaseDictionary.has(isFirst ? 'First' : 'Last')) {
var reference = bookmarkBaseDictionary._get(isFirst ? 'First' : 'Last');
if (_isNullOrUndefined(reference)) {
var bookMarkDictionary = this._crossReference._fetch(reference);
if (bookMarkDictionary) {
bookMark = new PdfBookmark(bookMarkDictionary, this._crossReference);
bookMark._reference = reference;
}
}
}
return bookMark;
};
return PdfBookmarkBase;
}());
export { PdfBookmarkBase };
/**
* Represents a bookmark in a PDF document
*
* ```typescript
* // Load an existing PDF document
* let document: PdfDocument = new PdfDocument(data, password);
* // Get the bookmarks
* let bookmarks: PdfBookmarkBase = document.bookmarks;
* // Gets the bookmark at the specified index
* let bookmark: PdfBookmark = bookmarks.at(0) as PdfBookmark;
* // Destroy the document
* document.destroy();
* ```
*/
var PdfBookmark = /** @class */ (function (_super) {
__extends(PdfBookmark, _super);
/**
* Initializes a new instance of the `PdfBookmark` class.
*
* @private
* @param {_PdfDictionary} dictionary Bookmark dictionary.
* @param {_PdfCrossReference} crossReference Cross reference.
*
*/
function PdfBookmark(dictionary, crossReference) {
var _this = _super.call(this, dictionary, crossReference) || this;
if (_this._dictionary && !_this._dictionary.has('Dest') && _this._dictionary.has('A')) {
var actionDictionary = _this._dictionary.get('A');
if (actionDictionary && actionDictionary.has('D')) {
var destinationArray = actionDictionary.getRaw('D'); // eslint-disable-line
_this._dictionary.update('Dest', destinationArray);
}
}
_this._isLoadedBookmark = true;
return _this;
}
Object.defineProperty(PdfBookmark.prototype, "destination", {
/**
* Gets the destination.
*
* @returns {PdfDestination} Page destination.
*
* ```typescript
* // Load an existing PDF document
* let document: PdfDocument = new PdfDocument(data, password);
* // Get the bookmarks
* let bookmarks: PdfBookmarkBase = document.bookmarks;
* // Gets the bookmark at the specified index
* let bookmark: PdfBookmark = bookmarks.at(0) as PdfBookmark;
* // Gets the destination
* let destination: PdfDestination = bookmark.destination;
* // Destroy the document
* document.destroy();
* ```
*/
get: function () {
if (!this._destination) {
var namedDestination = this._obtainNamedDestination();
if (namedDestination === null || typeof namedDestination === 'undefined') {
var destinationHelper = new _PdfDestinationHelper(this._dictionary, 'Dest');
this._destination = destinationHelper._obtainDestination();
}
}
return this._destination;
},
/**
* Sets the destination.
*
* @param {PdfDestination} value destination.
*
* ```typescript
* // Load an existing PDF document
* let document: PdfDocument = new PdfDocument(data, password);
* // Get the bookmarks
* let bookmarks: PdfBookmarkBase = document.bookmarks;
* // Gets the bookmark at the specified index
* let bookmark: PdfBookmark = bookmarks.at(0) as PdfBookmark;
* // Set the destination
* bookmark.destination = new PdfDestination(page, [100, 200]);
* // Save the document
* document.save('output.pdf');
* // Destroy the document
* document.destroy();
* ```
*/
set: function (value) {
if (value) {
value._parent = this;
this._destination = value;
this._destination._initializePrimitive();
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(PdfBookmark.prototype, "namedDestination", {
/**
* Gets the named destination.
*
* @returns {PdfNamedDestination} Named destination.
*
* ```typescript
* // Load an existing PDF document
* let document: PdfDocument = new PdfDocument(data, password);
* // Get the bookmarks
* let bookmarks: PdfBookmarkBase = document.bookmarks;
* // Gets bookmark at the specified index
* let bookmark: PdfBookmark = bookmarks.at(0) as PdfBookmark;
* // Gets the named destination
* let namedDestination: PdfNamedDestination = bookmark.namedDestination;
* // Destroy the document
* document.destroy();
* ```
*/
get: function () {
if (this._namedDestination === null || typeof this._namedDestination === 'undefined') {
this._namedDestination = this._obtainNamedDestination();
}
return this._namedDestination;
},
/**
* Sets the named destination.
*
* @param {PdfNamedDestination} value Named destination.
*
* ```typescript
* // Load an existing PDF document
* let document: PdfDocument = new PdfDocument(data, password);
* // Get the bookmarks
* let bookmarks: PdfBookmarkBase = document.bookmarks;
* // Gets bookmark at the specified index
* let bookmark: PdfBookmark = bookmarks.at(0) as PdfBookmark;
* // Gets the named destination
* let namedDestination: PdfNamedDestination = bookmark.namedDestination;
* // Destroy the document
* document.destroy();
* ```
*/
set: function (value) {
if (this._namedDestination !== value && this._dictionary) {
this._namedDestination = value;
var dictionary = new _PdfDictionary(this._crossReference);
dictionary.update('D', value.title);
dictionary.update('S', _PdfName.get('GoTo'));
var reference = this._crossReference._getNextReference();
this._crossReference._cacheMap.set(reference, dictionary);
this._dictionary.update('A', reference);
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(PdfBookmark.prototype, "title", {
/**
* Gets the bookmark title.
*
* @returns {string} Bookmark title.
*
* ```typescript
* // Load an existing PDF document
* let document: PdfDocument = new PdfDocument(data, password);
* // Get the bookmarks
* let bookmarks: PdfBookmarkBase = document.bookmarks;
* // Gets bookmark at the specified index
* let bookmark: PdfBookmark = bookmarks.at(0) as PdfBookmark;
* // Gets the bookmark title
* let bookmarkTitle: string = bookmark.title;
* // Destroy the document
* document.destroy();
* ```
*/
get: function () {
if (this._title === null || typeof this._title === 'undefined') {
if (this._dictionary && this._dictionary.has('Title')) {
this._title = this._dictionary.get('Title');
}
else {
this._title = '';
}
}
return this._title;
},
/**
* Sets the bookmark title.
*
* @param {string} value Bookmark title.
*
* ```typescript
* // Load an existing PDF document
* let document: PdfDocument = new PdfDocument(data, password);
* // Get the bookmarks
* let bookmarks: PdfBookmarkBase = document.bookmarks;
* // Gets bookmark at the specified index
* let bookmark: PdfBookmark = bookmarks.at(0) as PdfBookmark;
* // Sets the bookmark title
* bookmark.title = 'Syncfusion';
* // Destroy the document
* document.destroy();
* ```
*/
set: function (value) {
this._title = value;
if (this._dictionary) {
this._dictionary.update('Title', value);
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(PdfBookmark.prototype, "color", {
/**
* Gets the bookmark color.
*
* @returns {number[]} Bookmark color.
*
* ```typescript
* // Load an existing PDF document
* let document: PdfDocument = new PdfDocument(data, password);
* // Get the bookmarks
* let bookmarks: PdfBookmarkBase = document.bookmarks;
* // Gets bookmark at the specified index
* let bookmark: PdfBookmark = bookmarks.at(0) as PdfBookmark;
* // Gets the bookmark color
* let color: number[] = bookmark.color;
* // Destroy the document
* document.destroy();
* ```
*/
get: function () {
if (this._color === null || typeof this._color === 'undefined') {
if (this._dictionary && this._dictionary.has('C')) {
this._color = _parseColor(this._dictionary.getArray('C'));
}
}
return (this._color) ? this._color : [0, 0, 0];
},
/**
* Sets the bookmark color.
*
* @param {number[]} value Bookmark color.
*
* ```typescript
* // Load an existing PDF document
* let document: PdfDocument = new PdfDocument(data, password);
* // Get the bookmarks
* let bookmarks: PdfBookmarkBase = document.bookmarks;
* // Gets bookmark at the specified index
* let bookmark: PdfBookmark = bookmarks.at(0) as PdfBookmark;
* // Sets the bookmark color
* bookmark.color = [255, 0, 0];
* // Destroy the document
* document.destroy();
* ```
*/
set: function (value) {
this._color = value;
if (this._dictionary) {
this._dictionary.update('C', [Number.parseFloat((value[0] / 255).toFixed(7)),
Number.parseFloat((value[1] / 255).toFixed(7)),
Number.parseFloat((value[2] / 255).toFixed(7))]);
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(PdfBookmark.prototype, "textStyle", {
/**
* Gets the text style.
*
* @returns {PdfTextStyle} Text style.
*
* ```typescript
* // Load an existing PDF document
* let document: PdfDocument = new PdfDocument(data, password);
* // Get the bookmarks
* let bookmarks: PdfBookmarkBase = document.bookmarks;
* // Gets bookmark at the specified index
* let bookmark: PdfBookmark = bookmarks.at(0) as PdfBookmark;
* // Gets the textStyle
* let textStyle: PdfTextStyle = bookmark.textStyle;
* // Destroy the document
* document.destroy();
* ```
*/
get: function () {
if (this._textStyle === null || typeof this._textStyle === 'undefined') {
this._textStyle = this._obtainTextStyle();
}
return this._textStyle;
},
/**
* Sets the text style.
*
* @param {PdfTextStyle} value Text style.
*
* ```typescript
* // Load an existing PDF document
* let document: PdfDocument = new PdfDocument(data, password);
* // Get the bookmarks
* let bookmarks: PdfBookmarkBase = document.bookmarks;
* // Gets bookmark at the specified index
* let bookmark: PdfBookmark = bookmarks.at(0) as PdfBookmark;
* // Sets the textStyle
* bookmark.textStyle = PdfTextStyle.italic;
* // Destroy the document
* document.destroy();
* ```
*/
set: function (value) {
this._textStyle = value;
this._updateTextStyle(value);
},
enumerable: true,
configurable: true
});
Object.defineProperty(PdfBookmark.prototype, "_next", {
get: function () {
var nextBookmark;
if (this._dictionary && this._dictionary.has('Next')) {
var reference = this._dictionary._get('Next');
if (_isNullOrUndefined(reference)) {
var dictionary = this._crossReference._fetch(reference);
if (dictionary) {
nextBookmark = new PdfBookmark(dictionary, this._crossReference);
nextBookmark._reference = reference;
}
}
}
return nextBookmark;
},
enumerable: true,
configurable: true
});
PdfBookmark.prototype._updateTextStyle = function (value) {
if (value === PdfTextStyle.regular) {
if (this._dictionary && this._dictionary.has('F')) {
delete this._dictionary._map.F;
}
}
else if (this._dictionary) {
this._dictionary.update('F', value);
}
};
PdfBookmark.prototype._obtainTextStyle = function () {
var style = PdfTextStyle.regular;
if (this._dictionary && this._dictionary.has('F')) {
var flag = this._dictionary.get('F');
var flagValue = 0;
if (typeof flag !== 'undefined' && flag !== null) {
flagValue = flag;
}
style |= flagValue;
}
return style;
};
PdfBookmark.prototype._obtainNamedDestination = function () {
var document = this._crossReference._document;
var destinationCollection;
if (document) {
destinationCollection = document._destinationCollection;
}
var destination; // eslint-disable-line
var namedDestination;
if (destinationCollection) {
var dictionary = this._dictionary;
if (dictionary) {
if (dictionary.has('A')) {
var action = dictionary.get('A');
if (action && action.has('D')) {
destination = action.get('D');
}
}
else if (dictionary.has('Dest')) {
destination = dictionary.get('Dest');
}
}
if (destination) {
var value_1;
if (destination instanceof _PdfName) {
value_1 = destination.name;
}
else if (typeof destination === 'string') {
value_1 = destination;
}
if (value_1) {
var namedDestinations = destinationCollection._namedDestinations;
if (namedDestinations && namedDestinations.length > 0) {
var entry = namedDestinations.find(function (dest) { return dest._title === value_1; });
if (entry) {
destination = entry;
namedDestination = entry;
}
}
}
}
}
return namedDestination;
};
return PdfBookmark;
}(PdfBookmarkBase));
export { PdfBookmark };
/**
* Represents a named destination in a PDF document.
* ```typescript
* // Load an existing PDF document
* let document: PdfDocument = new PdfDocument(data, password);
* // Get the bookmarks
* let bookmarks: PdfBookmarkBase = document.bookmarks;
* // Gets the bookmark at the specified index
* let bookmark: PdfBookmark = bookmarks.at(0) as PdfBookmark;
* // Gets the named destination
* let namedDestination: PdfNamedDestination = bookmark.namedDestination;
* // Destroy the document
* document.destroy();
* ```
*/
var PdfNamedDestination = /** @class */ (function () {
function PdfNamedDestination(element, crossReference) {
if (typeof element === 'string') {
this._initialize();
this.title = element;
}
else {
this._dictionary = element;
this._crossReference = crossReference;
}
}
Object.defineProperty(PdfNamedDestination.prototype, "destination", {
/**
* Gets the destination.
*
* @returns {PdfDestination} Page destination.
*
* ```typescript
* // Load an existing PDF document
* let document: PdfDocument = new PdfDocument(data, password);
* // Get the bookmarks
* let bookmarks: PdfBookmarkBase = document.bookmarks;
* // Gets the bookmark at the specified index
* let bookmark: PdfBookmark = bookmarks.at(0) as PdfBookmark;
* // Gets the named destination
* let namedDestination: PdfNamedDestination = bookmark.namedDestination;
* // Gets the destination
* let destination: PdfDestination = namedDestination.destination;
* // Destroy the document
* document.destroy();
* ```
*/
get: function () {
return this._destination;
},
/**
* Sets the destination.
*
* @param {PdfDestination} value destination.
*
* ```typescript
* // Load an existing PDF document
* let document: PdfDocument = new PdfDocument(data, password);
* // Get the bookmarks
* let bookmarks: PdfBookmarkBase = document.bookmarks;
* // Gets the bookmark at the specified index
* let bookmark: PdfBookmark = bookmarks.at(0) as PdfBookmark;
* // Gets the named destination
* let namedDestination: PdfNamedDestination = bookmark.namedDestination;
* // Set the destination
* namedDestination.destination = new PdfDestination(page, [100, 200]);
* // Save the document
* document.save('output.pdf');
* // Destroy the document
* document.destroy();
* ```
*/
set: function (value) {
if (value) {
value._parent = this;
this._destination = value;
this._destination._initializePrimitive();
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(PdfNamedDestination.prototype, "title", {
/**
* Gets the title.
*
* @returns {string} title.
*
* ```typescript
* // Load an existing PDF document
* let document: PdfDocument = new PdfDocument(data, password);
* // Get the bookmarks
* let bookmarks: PdfBookmarkBase = document.bookmarks;
* // Gets the bookmark at the specified index
* let bookmark: PdfBookmark = bookmarks.at(0) as PdfBookmark;
* // Gets the named destination
* let namedDestination: PdfNamedDestination = bookmark.namedDestination;
* // Gets the title
* let title: string = namedDestination.title;
* // Destroy the document
* document.destroy();
* ```
*/
get: function () {
return this._title;
},
/**
* Sets the title.
*
* @param {string} value title.
*
* ```typescript
* // Load an existing PDF document
* let document: PdfDocument = new PdfDocument(data, password);
* // Get the bookmarks
* let bookmarks: PdfBookmarkBase = document.bookmarks;
* // Gets the bookmark at the specified index
* let bookmark: PdfBookmark = bookmarks.at(0) as PdfBookmark;
* // Gets the named destination
* let namedDestination: PdfNamedDestination = bookmark.namedDestination;
* // Set the title
* namedDestination.title = 'Syncfusion';
* // Save the document
* document.save('output.pdf');
* // Destroy the document
* document.destroy();
* ```
*/
set: function (value) {
if (value !== this._title && this._dictionary) {
var previousTitle = this._title;
this._title = value;
this._dictionary.update('Title', value);
this._dictionary._updated = true;
this._updateNamedDestinationTitle(value, previousTitle);
}
},
enumerable: true,
configurable: true
});
PdfNamedDestination.prototype._updateNamedDestinationTitle = function (value, previousTitle) {
var crossReference = this._crossReference;
if (crossReference && crossReference._document) {
var document_1 = crossReference._document;
var catalogDictionary = document_1._catalog._catalogDictionary;
if (catalogDictionary && catalogDictionary.has('Names')) {
var names = catalogDictionary.get('Names');
if (names && names.has('Dests')) {
var dests = names.get('Dests');
if (dests && dests.has('Names')) {
var namesValue = dests.get('Names'); // eslint-disable-line
var index = namesValue.indexOf(previousTitle);
if (index !== -1) {
namesValue.splice(index, 1, value);
delete dests._map.Names;
dests.update('Names', namesValue);
dests._updated = true;
}
}
}
}
}
};
PdfNamedDestination.prototype._initialize = function () {
this._dictionary = new _PdfDictionary();
this._dictionary.update('S', _PdfName.get('GoTo'));
};
return PdfNamedDestination;
}());
export { PdfNamedDestination };
var _PdfNamedDestinationCollection = /** @class */ (function () {
function _PdfNamedDestinationCollection(dictionary, crossReference) {
var _this = this;
this._namedDestinations = [];
if (dictionary) {
this._dictionary = dictionary;
}
if (crossReference) {
this._crossReference = crossReference;
}
if (dictionary && dictionary.has('Dests')) {
var destination = dictionary.get('Dests');
if (destination) {
if (destination.has('Names')) {
this._addCollection(destination);
}
else if (destination.has('Kids')) {
var destinationArray = destination.getArray('Kids'); // eslint-disable-line
destinationArray.forEach(function (entry) {
_this._findDestination(entry);
});
}
}
}
}
_PdfNamedDestinationCollection.prototype._findDestination = function (destination) {
var _this = this;
if (destination) {
if (destination.has('Names')) {
this._addCollection(destination);
}
else if (destination.has('Kids')) {
var kids = destination.getArray('Kids'); // eslint-disable-line
if (kids && Array.isArray(kids) && kids.length > 0) {
kids.forEach(function (entry) {
_this._findDestination(entry);
});
}
}
}
};
_PdfNamedDestinationCollection.prototype._addCollection = function (destination) {
var elements = destination.getRaw('Names'); // eslint-disable-line
var ref; // eslint-disable-line
var dictionary;
if (elements && elements instanceof _PdfReference) {
ref = this._crossReference._fetch(elements);
}
if (ref && Array.isArray(ref) && ref.length > 0) {
elements = ref;
}
if (elements && Array.isArray(elements) && elements.length > 0) {
for (var i = 1; i < elements.length; i = i + 2) {
var reference = elements[i]; // eslint-disable-line
if (reference && reference instanceof _PdfReference) {
var destinationArray = this._crossReference._fetch(reference); // eslint-disable-line
if (destinationArray && Array.isArray(destinationArray) && destinationArray.length > 0) {
dictionary = new _PdfDictionary();
dictionary.update('D', destinationArray);
}
else {
dictionary = this._crossReference._fetch(reference);
}
}
else if ((dictionary === null || typeof dictionary === 'undefined') && Array.isArray(reference)) {
dictionary = new _PdfDictionary();
dictionary.update('D', reference);
}
if (dictionary) {
var namedDestination = new PdfNamedDestination(dictionary, this._crossReference);
var value = elements[i - 1];
var destinationObject = void 0;
var destArray = void 0; // eslint-disable-line
if (value) {
namedDestination._title = value;
if (dictionary.has('D')) {
destArray = dictionary.get('D');
destinationObject = new PdfDestination();
var pageRef = destArray[0]; // eslint-disable-line
if (pageRef && destArray && destArray[0] instanceof _PdfReference) {
var pageDictionary = this._crossReference._fetch(pageRef);
var loadedDocument = this._crossReference._document;
var index = void 0;
if (loadedDocument && pageDictionary) {
index = _getPageIndex(loadedDocument, pageDictionary);
if (typeof index !== 'undefined' && index !== null && index >= 0) {
destinationObject._index = index;
destinationObject.page = loadedDocument.getPage(index);
}
}
}
}
}
if (destArray[1] instanceof _PdfName) {
var left = void 0;
var height = void 0;
var zoom = void 0;
var mode = destArray[1].name;
var page = destinationObject.page;
switch (mode) {
case 'Fit':
destinationObject._destinationMode = PdfDestinationMode.fitToPage;
break;
case 'XYZ':
destinationObject._destinationMode = PdfDestinationMode.location;
if (destArray.length > 2) {
left = destArray[2];
}
if (destArray.length > 3) {
height = destArray[3];
}
if (destArray.length > 4) {
zoom = destArray[4];
}
if (page) {
var size = page.size;
var topValue = (height === null || typeof height === 'undefined') ? 0 : size[1] - height;
var leftValue = (left === null || typeof left === 'undefined') ? 0 : left;
destinationObject._location = [leftValue, topValue];
if (page.rotation !== PdfRotationAngle.angle0) {
topValue = _checkRotation(page, height, left);
}
destinationObject._zoom = (typeof zoom !== 'undefined' && zoom !== null) ? zoom : 0;
if (left === null || height === null || zoom === null || typeof left === 'undefined'
|| typeof height === 'undefined' || typeof zoom === 'undefined') {
destinationObject._isValid = false;
}
}
break;
case 'FitH':
case 'FitBH':
destinationObject._destinationMode = PdfDestinationMode.fitH;
if (destArray.length >= 3) {
height = destArray[2];
}
if (page) {
var size = page.size;
var topValue = (height === null || typeof height === 'undefined') ? 0 : size[1] - height;
destinationObject._location = [0, topValue];
}
if (height === null || typeof height === 'undefined') {
destinationObject._isValid = false;
}
break;
case 'FitR':
destinationObject._destinationMode = PdfDestinationMode.fitR;
break;
}
}
destinationObject._parent = namedDestination;
namedDestination._destination = destinationObject;
this._namedDestinations.push(namedDestination);
}
}
}
};
return _PdfNamedDestinationCollection;
}());
export { _PdfNamedDestinationCollection };