@syncfusion/ej2-pdfviewer
Version:
Essential JS 2 PDF viewer Component
868 lines • 92.7 kB
JavaScript
/**
*@returns {void}
*/
export function PdfiumRunner() {
var moduleString = 'Module';
var pageLoaded = false;
var moduleLoaded = false;
var FPDF = {};
var readBlockPtr;
// eslint-disable-next-line
var pdfiumWindow = pdfiumWindow ? pdfiumWindow : {};
var documentDetails;
var PDFiumModule = typeof (pdfiumWindow["" + moduleString]) !== 'undefined' ? (pdfiumWindow["" + moduleString]) : {};
var F64 = Float64Array;
var H = function (t, s, d) { return function (f) {
var _a = pdfiumWindow.heap(t, s), m = _a[0], a = _a.slice(1);
var v = f.apply(void 0, a.map(function (x) { return x.p; }));
if (!v) {
m.free();
return d;
}
var r = a.map(function (x) { return x.v; });
m.free();
return r;
}; };
Object.assign(FPDF, {
LCD_TEXT: 0x02,
NO_NATIVETEXT: 0x04,
GRAYSCALE: 0x08,
DEBUG_INFO: 0x80,
NO_CATCH: 0x100,
RENDER_LIMITEDIMAGECACHE: 0x200,
RENDER_FORCEHALFTONE: 0x400,
PRINTING: 0x800,
REVERSE_BYTE_ORDER: 0x10,
// eslint-disable-next-line
Bitmap_Gray: 1,
// eslint-disable-next-line
Bitmap_BGR: 2,
// eslint-disable-next-line
Bitmap_BGRx: 3,
// eslint-disable-next-line
Bitmap_BGRA: 4,
LAST_ERROR: {
SUCCESS: 0,
UNKNOWN: 1,
FILE: 2,
FORMAT: 3,
PASSWORD: 4,
SECURITY: 5,
PAGE: 6
}
});
/**
*@returns {void}
*/
function initializeFPDF() {
FPDF.Init = PDFiumModule.cwrap('FPDF_InitLibrary');
FPDF.RenderPageBitmap = PDFiumModule.cwrap('FPDF_RenderPageBitmap', '', ['number', 'number', 'number', 'number', 'number', 'number', 'number', 'number']);
// eslint-disable-next-line
FPDF.Bitmap_FillRect = PDFiumModule.cwrap('FPDFBitmap_FillRect', '', ['number', 'number', 'number', 'number', 'number', 'number']);
// eslint-disable-next-line
FPDF.Bitmap_CreateEx = PDFiumModule.cwrap('FPDFBitmap_CreateEx', 'number', ['number', 'number', 'number', 'number', 'number']);
// eslint-disable-next-line
FPDF.Bitmap_Destroy = PDFiumModule.cwrap('FPDFBitmap_Destroy', '', ['number']);
FPDF.LoadPage = PDFiumModule.cwrap('FPDF_LoadPage', 'number', ['number', 'number']);
FPDF.ClosePage = PDFiumModule.cwrap('FPDF_ClosePage', '', ['number']);
FPDF.LoadCustomDocument = PDFiumModule.cwrap('FPDF_LoadCustomDocument', 'number', ['number', 'string']);
FPDF.LoadMemDocument = PDFiumModule.cwrap('FPDF_LoadMemDocument', 'number', ['number', 'number', 'string']);
FPDF.GetPageSizeByIndex = PDFiumModule.cwrap('FPDF_GetPageSizeByIndex', 'number', ['number', 'number', 'number', 'number']);
FPDF.GetLastError = PDFiumModule.cwrap('FPDF_GetLastError', 'number');
FPDF.GetPageCount = PDFiumModule.cwrap('FPDF_GetPageCount', 'number', ['number']);
FPDF.CloseDocument = PDFiumModule.cwrap('FPDF_CloseDocument', '', ['number']);
FPDF.DestroyLibrary = PDFiumModule.cwrap('FPDF_DestroyLibrary');
FPDF.LoadTextPage = PDFiumModule.cwrap('FPDFText_LoadPage', 'number', ['number']);
FPDF.CloseTextPage = PDFiumModule.cwrap('FPDFText_ClosePage', '', ['number']);
FPDF.TextCountChars = PDFiumModule.cwrap('FPDFText_CountChars', 'number', ['number']);
FPDF.GetUnicodeChar = PDFiumModule.cwrap('FPDFText_GetUnicode', 'number', ['number']);
FPDF.GetCharBox = PDFiumModule.cwrap('FPDFText_GetCharBox', 'number', ['number', 'number', 'number', 'number', 'number']);
FPDF.GetPageRotation = PDFiumModule.cwrap('FPDFPage_GetRotation', 'number', ['number']);
FPDF.GetCharAngle = PDFiumModule.cwrap('FPDFText_GetCharAngle', 'number', ['number']);
FPDF.TextFindStart = PDFiumModule.cwrap('FPDFText_FindStart', '', ['number', 'number', 'number', 'number']);
FPDF.TextFindClose = PDFiumModule.cwrap('FPDFText_FindClose', '', ['number']);
FPDF.TextFindNext = PDFiumModule.cwrap('FPDFText_FindNext', '', ['number']);
FPDF.TextFindResultIndex = PDFiumModule.cwrap('FPDFText_GetSchResultIndex', '', ['number']);
FPDF.TextFindCount = PDFiumModule.cwrap('FPDFText_GetSchCount', '', ['number']);
FPDF.GetPageHeight = PDFiumModule.cwrap('FPDF_GetPageHeight', 'number', ['number']);
FPDF.GetPageHeight = PDFiumModule.cwrap('FPDF_GetPageHeight', 'number', ['number']);
FPDF.GetPageWidth = PDFiumModule.cwrap('FPDF_GetPageWidth', 'number', ['number']);
pdfiumWindow.heap = function (J, s) {
var E;
switch (J) {
case Int8Array:
E = PDFiumModule.HEAP8;
break;
case Int16Array:
E = PDFiumModule.HEAP16;
break;
case Int32Array:
E = PDFiumModule.HEAP32;
break;
case Uint8Array:
E = PDFiumModule.HEAPU8;
break;
case Uint16Array:
E = PDFiumModule.HEAPU16;
break;
case Uint32Array:
E = PDFiumModule.HEAPU32;
break;
case Float32Array:
E = PDFiumModule.HEAPF32;
break;
case Float64Array:
E = PDFiumModule.HEAPF64;
break;
}
var Z = J.BYTES_PER_ELEMENT;
var mallocFunction = PDFiumModule.asm && PDFiumModule.asm.malloc
? PDFiumModule.asm.malloc
: PDFiumModule._malloc;
var m = mallocFunction(s * Z);
var a = Array(1 + s);
var freeFunction = PDFiumModule.asm && PDFiumModule.asm.free
? PDFiumModule.asm.free
: PDFiumModule._free;
a[0] = ({ s: s, J: J, Z: Z, E: E, m: m, free: function () { return freeFunction(m); } });
var _loop_1 = function (i) {
a[i + 1] = ({ p: m + (i * Z), get v() { return E[m / Z + i]; } });
};
for (var i = 0; i < s; i++) {
_loop_1(i);
}
return a;
};
}
/**
*@returns {void}
*/
function checkIfEverythingWasLoaded() {
pageLoaded = true;
if (pageLoaded || moduleLoaded) {
startApp();
}
}
PDFiumModule.onRuntimeInitialized = function () {
moduleLoaded = true;
checkIfEverythingWasLoaded();
};
/**
*@returns {void}
*/
function startApp() {
initializeFPDF();
if (pdfiumWindow.loaded) {
pdfiumWindow.loaded();
}
}
pdfiumWindow.onload = function () {
pageLoaded = true;
checkIfEverythingWasLoaded();
};
pdfiumWindow.loaded = function () {
ctx.postMessage({ message: 'loaded' });
};
var ctx = self;
ctx.onmessage = function (event) {
if (event.data.message === 'initialLoading') {
importScripts(event.data.url + '/pdfium.js');
PDFiumModule.url = event.data.url;
PDFiumModule.onRuntimeInitialized = function () {
moduleLoaded = true;
checkIfEverythingWasLoaded();
if (event.data.fonts && Object.keys(event.data.fonts).length > 0) {
var filePath = '/usr/share/fonts/';
if (PDFiumModule.FS && PDFiumModule.FS.createPath) {
PDFiumModule.FS.createPath('/', filePath, true, true);
}
else {
PDFiumModule.FS_createPath('/', filePath, true, true);
}
for (var key in event.data.fonts) {
if (event.data.fonts["" + key] && key.indexOf('fallbackfonts') === -1) {
if (PDFiumModule.FS && PDFiumModule.FS.createDataFile) {
PDFiumModule.FS.createDataFile(filePath + key, null, event.data.fonts["" + key], true, true, true);
}
else {
PDFiumModule.FS_createDataFile(filePath + key, null, event.data.fonts["" + key], true, true, true);
}
}
}
}
};
this['PDFiumModule'](PDFiumModule);
}
else if (event.data.message === 'LoadPageCollection') {
if (documentDetails && event.data.skipOnReload) {
var freeFunction = PDFiumModule.asm && PDFiumModule.asm.free
? PDFiumModule.asm.free
: PDFiumModule._free;
freeFunction(documentDetails.processor.wasmData.wasmBuffer);
FPDF.CloseDocument(documentDetails.processor.wasmData.wasm);
FPDF.DestroyLibrary();
if (PDFiumModule.removeFunction && readBlockPtr) {
PDFiumModule.removeFunction(readBlockPtr);
}
documentDetails = null;
}
pdfiumWindow.fileByteArray = event.data.uploadedFile;
var fileSize = pdfiumWindow.fileByteArray.length;
FPDF.Init();
if (PDFiumModule.asm && PDFiumModule.asm.malloc) {
var wasmBuffer = PDFiumModule.asm.malloc(fileSize);
PDFiumModule.HEAPU8.set(pdfiumWindow.fileByteArray, wasmBuffer);
pdfiumWindow.fileByteArray = null;
documentDetails = new DocumentInfo({
wasm: FPDF.LoadMemDocument(wasmBuffer, fileSize, event.data.password),
wasmBuffer: wasmBuffer
});
}
else {
var mallocFunction = PDFiumModule.asm && PDFiumModule.asm.malloc
? PDFiumModule.asm.malloc
: PDFiumModule._malloc;
var wasmBuffer = mallocFunction(fileSize);
// create a custom loader for progressive loading
var loader_1 = createPDFCustomLoader(event.data.uploadedFile);
// register the readBlock function in the wasm table
readBlockPtr = PDFiumModule.addFunction(function (param, position, pBuf, size) {
return loader_1.readBlock(position, pBuf, size);
}, 'iiiii');
var structSize = 12;
var ptr = mallocFunction(structSize);
var FPDF_FILEACCESS = {
mFileLen: loader_1.getFileSize(),
mGetBlock: readBlockPtr,
mParam: null
};
PDFiumModule.setValue(ptr, FPDF_FILEACCESS.mFileLen, 'i32');
PDFiumModule.setValue(ptr + 4, FPDF_FILEACCESS.mGetBlock, '*');
PDFiumModule.setValue(ptr + 8, FPDF_FILEACCESS.mParam ? FPDF_FILEACCESS.mParam : 0, '*');
// console.log('Loading PDF document using custom loader...');
// load the document using the custom loader
var docHandle = FPDF.LoadCustomDocument(ptr, event.data.password);
documentDetails = new DocumentInfo({
wasm: docHandle,
wasmBuffer: wasmBuffer
});
}
pdfiumWindow.fileByteArray = null;
ctx.postMessage({ message: 'PageLoaded', pageIndex: event.data.pageIndex, isZoomMode: event.data.isZoomMode });
}
else if (event.data.message === 'LoadPageStampCollection') {
var fileSize = event.data.uploadedFile.length;
FPDF.Init();
var mallocFunction = PDFiumModule.asm && PDFiumModule.asm.malloc
? PDFiumModule.asm.malloc
: PDFiumModule._malloc;
var wasmBuffer = mallocFunction(fileSize);
PDFiumModule.HEAPU8.set(event.data.uploadedFile, wasmBuffer);
var documentDetailsNew = new DocumentInfo({
wasm: FPDF.LoadMemDocument(wasmBuffer, fileSize, event.data.password),
wasmBuffer: wasmBuffer
});
documentDetailsNew.pageSizes = new SizeF(event.data.pageSize[0], event.data.pageSize[1]);
documentDetailsNew.pageRotation.push(event.data.rotation);
var firstPage = documentDetailsNew.getPage(event.data.pageIndex);
var ImageData_1 = event.data;
var data = firstPage.render(null, ImageData_1.zoomFactor, false, null, null, null, true);
data.message = 'LoadedStamp';
data.annotName = event.data.AnnotName;
data.rubberStampAnnotationPageNumber = event.data.rubberStampAnnotationPageNumber;
data.annotationOrder = event.data.annotationOrder;
data.collectionOrder = event.data.collectionOrder;
data.isFormField = event.data.isFormField;
if (data.isFormField) {
data.message = 'LoadedStampForFormFields';
data.formFieldName = event.data.formFieldName;
data.formFieldList = event.data.formFieldList;
data.formFields = event.data.rubberStampAnnotation;
data.PageIndex = event.data.PageIndex;
}
ctx.postMessage(data);
}
if (documentDetails) {
if (event.data.message === 'renderPage') {
var firstPage = documentDetails.getPage(event.data.pageIndex);
var ImageData_2 = event.data;
var data = firstPage.render(null, ImageData_2.zoomFactor, ImageData_2.isTextNeed, null, null, ImageData_2.textDetailsId, null, event.data.cropBoxRect, event.data.mediaBoxRect);
ctx.postMessage(data);
}
else if (event.data.message === 'renderPageSearch') {
var firstPage = documentDetails.getPage(event.data.pageIndex);
var ImageData_3 = event.data;
var data = firstPage.render(null, ImageData_3.zoomFactor, ImageData_3.isTextNeed, null, null, ImageData_3.textDetailsId, null, event.data.cropBoxRect);
data.message = 'imageRenderedSearch';
ctx.postMessage(data);
}
else if (event.data.message.indexOf('extractText') !== -1) {
var firstPage = documentDetails.getPage(event.data.pageIndex);
var ImageData_4 = event.data;
var isSkipCharacterBounds = event.data.isSkipCharacterBounds;
var data = firstPage.render('extractText', ImageData_4.zoomFactor, ImageData_4.isTextNeed, null, null, ImageData_4.textDetailsId, null, null, null, null, isSkipCharacterBounds);
data.message = event.data.message;
data.isLayout = event.data.isLayout;
data.isRenderText = event.data.isRenderText;
data.jsonObject = event.data.jsonObject;
data.requestType = event.data.requestType;
data.annotationObject = event.data.annotationObject;
data.pageIndex = event.data.pageIndex;
data.options = event.data.options;
data.isAPI = event.data.isAPI;
data.isNeedToRender = event.data.isNeedToRender;
ctx.postMessage(data);
}
else if (event.data.message === 'searchText') {
var pagesCount = FPDF.GetPageCount(documentDetails.processor.wasmData.wasm);
var startIndex = event.data.startIndex;
var endIndex = event.data.endIndex;
var isMatchCase_1 = (event.data.matchCase === true) ? 1 : 0;
var originalSearchTerm = event.data.searchWord;
var totalOccurrencesCount = 0;
var pageSearchCounts = {};
var freeFunction = PDFiumModule.asm && PDFiumModule.asm.free ? PDFiumModule.asm.free : PDFiumModule._free;
var normalizeStringForSearch = function (s) {
if (!s) {
return s;
}
var hasCurly = /[\u2018\u2019\u201B\u02BC\uFF07\u201C\u201D\uFF02]/.test(s);
return hasCurly
? s.normalize('NFKC')
// eslint-disable-next-line
.replace(/[\u2018\u2019\u201B\u02BC\uFF07]/g, "'")
.replace(/[\u201C\u201D\uFF02]/g, '"')
.replace(/\u00A0/g, ' ')
// eslint-disable-next-line
.replace(/(\w)[’‘]/g, "$1'")
: s.replace(/'/g, '’').replace(/"/g, '”');
};
var normalizedSearchTerm = normalizeStringForSearch(originalSearchTerm);
var needsNormalizedSearch = originalSearchTerm !== normalizedSearchTerm;
var createSearch = function (textPage, term) {
var buffer = new Uint16Array(term.length + 1);
for (var i = 0; i < term.length; i++) {
buffer[i] = term.charCodeAt(i);
}
buffer[term.length] = 0;
var mallocFunction = PDFiumModule.asm && PDFiumModule.asm.malloc
? PDFiumModule.asm.malloc
: PDFiumModule._malloc;
var pointer = mallocFunction(buffer.length * buffer.BYTES_PER_ELEMENT);
PDFiumModule.HEAPU16.set(buffer, pointer / Uint16Array.BYTES_PER_ELEMENT);
var handle = FPDF.TextFindStart(textPage, pointer, isMatchCase_1, 0);
return { handle: handle, pointer: pointer };
};
var _loop_2 = function (a) {
var page = FPDF.LoadPage(documentDetails.processor.wasmData.wasm, a);
var textPage = FPDF.LoadTextPage(page);
var pageHeight = FPDF.GetPageHeight(page);
var search = void 0;
var pageHasMatches = false;
var originalSearch = createSearch(textPage, originalSearchTerm);
if (FPDF.TextFindNext(originalSearch.handle)) {
pageHasMatches = true;
FPDF.TextFindClose(originalSearch.handle);
search = {
handle: FPDF.TextFindStart(textPage, originalSearch.pointer, isMatchCase_1, 0),
pointer: originalSearch.pointer
};
}
else {
FPDF.TextFindClose(originalSearch.handle);
freeFunction(originalSearch.pointer);
}
if (!pageHasMatches && needsNormalizedSearch) {
search = createSearch(textPage, normalizedSearchTerm);
}
else if (!pageHasMatches) {
FPDF.ClosePage(page);
return "continue";
}
var pageOccurrence = -1;
var _loop_3 = function () {
totalOccurrencesCount++;
pageOccurrence++;
var charLength = FPDF.TextFindCount(search.handle);
var charStartIndex = FPDF.TextFindResultIndex(search.handle);
if (!pageSearchCounts[parseInt(a.toString(), 10)]) {
pageSearchCounts[parseInt(a.toString(), 10)] = { Indices: [], Bounds: {}, PageOccurrence: 0 };
}
if (!pageSearchCounts[parseInt(a.toString(), 10)].Bounds[parseInt(pageOccurrence.toString(), 10)]) {
pageSearchCounts[parseInt(a.toString(), 10)].Bounds[parseInt(pageOccurrence.toString(), 10)] = [];
}
pageSearchCounts[parseInt(a.toString(), 10)].Indices.push(startIndex);
var charLeft = Number.POSITIVE_INFINITY;
var charRight = 0;
var charBottom = Number.POSITIVE_INFINITY;
var charTop = 0;
var _loop_4 = function (i) {
var resultPage = FPDF.GetUnicodeChar(textPage, charStartIndex + i);
var character = String.fromCharCode(resultPage);
if (character !== '\r') {
if (character !== '\n') {
var result_1 = H(F64, 4, [-1, -1, -1, -1])(function (left, right, bottom, top) {
return FPDF.GetCharBox(textPage, charStartIndex + i, left, right, bottom, top);
});
charLeft = Math.min(charLeft, result_1[0]);
charRight = Math.max(charRight, result_1[1]);
charBottom = Math.min(charBottom, result_1[2]);
charTop = Math.max(charTop, result_1[3]);
}
}
if (character === '\r') {
var characterBounds_1 = new RectAngle((charLeft * (96 / 72)), ((pageHeight - (charTop - charBottom) - charBottom) * (96 / 72)), ((charRight - charLeft) * (96 / 72)), ((charTop - charBottom) * (96 / 72)), '', null);
pageSearchCounts[parseInt(a.toString(), 10)].Bounds[parseInt(pageOccurrence.toString(), 10)]
.push(characterBounds_1);
pageSearchCounts[parseInt(a.toString(), 10)].Bounds[parseInt(pageOccurrence.toString(), 10)].sort(function (a, b) {
return a.Top === b.Top ? a.Left - b.Left : a.Top - b.Top;
});
charLeft = Number.POSITIVE_INFINITY;
charRight = 0;
charBottom = Number.POSITIVE_INFINITY;
charTop = 0;
}
};
for (var i = 0; i < charLength; i++) {
_loop_4(i);
}
var characterBounds = new RectAngle((charLeft * (96 / 72)), ((pageHeight - (charTop - charBottom) - charBottom) * (96 / 72)), ((charRight - charLeft) * (96 / 72)), ((charTop - charBottom) * (96 / 72)), '', null);
pageSearchCounts[parseInt(a.toString(), 10)].Bounds[parseInt(pageOccurrence.toString(), 10)].push(characterBounds);
pageSearchCounts[parseInt(a.toString(), 10)].Bounds[parseInt(pageOccurrence.toString(), 10)].sort(function (a, b) {
return a.Top === b.Top ? a.Left - b.Left : a.Top - b.Top;
});
pageSearchCounts[parseInt(a.toString(), 10)].PageOccurrence = pageOccurrence + 1;
};
while (FPDF.TextFindNext(search.handle)) {
_loop_3();
}
FPDF.TextFindClose(search.handle);
freeFunction(search.pointer);
FPDF.ClosePage(page);
};
for (var a = startIndex; a < endIndex; a++) {
_loop_2(a);
}
var result = {
totalSearchCount: totalOccurrencesCount,
resultPages: pageSearchCounts,
message: 'textSearched',
searchWord: originalSearchTerm,
matchCase: event.data.matchCase,
isRequestsend: event.data.isRequestsend,
isCompletedSearch: (endIndex === pagesCount) ? true : false,
endIndex: endIndex
};
ctx.postMessage(result);
}
else if (event.data.message === 'renderThumbnail') {
// eslint-disable-next-line
var thumbnail = new Promise(function (resolve, reject) {
try {
var firstPage = documentDetails.getPage(event.data.pageIndex);
if (firstPage.processor !== null && firstPage.processor !== undefined) {
var data = firstPage.render('thumbnail', null, event.data.isTextNeed, null, null, null, null, null, null, null, event.data.isSkipCharacterBounds, event.data.imageSize);
data.isRenderText = event.data.isRenderText;
data.jsonObject = event.data.jsonObject;
data.requestType = event.data.requestType;
resolve(data);
}
}
catch (error) {
reject(error);
}
});
thumbnail.then(function (results) {
ctx.postMessage(results);
});
}
else if (event.data.message === 'renderPreviewTileImage') {
var firstPage = documentDetails.getPage(event.data.pageIndex);
var data = firstPage.render('thumbnail', null, event.data.isTextNeed, null, null, null, null, null, null, null, event.data.isSkipCharacterBounds, event.data.imageSize);
data.message = 'renderPreviewTileImage';
data.isRenderText = event.data.isRenderText;
data.jsonObject = event.data.jsonObject;
data.requestType = event.data.requestType;
data.startIndex = event.data.startIndex;
data.endIndex = event.data.endIndex;
data.imageSize = event.data.imageSize;
data.initialLoad = event.data.initialLoad;
ctx.postMessage(data);
}
else if (event.data.message === 'printImage') {
var firstPage = documentDetails.getPage(event.data.pageIndex);
var data = firstPage.render('print', null, false, event.data.printScaleFactor, event.data.printDevicePixelRatio);
ctx.postMessage(data);
}
else if (event.data.message === 'extractImage' || event.data.message === 'extractImages') {
var firstPage = documentDetails.getPage(event.data.pageIndex);
var ImageData_5 = event.data;
var data = firstPage.render(null, ImageData_5.zoomFactor, ImageData_5.isTextNeed, null, null, ImageData_5.textDetailsId, null, null, null, event.data.size);
if (event.data.message === 'extractImage') {
data.message = 'imageExtracted';
}
if (event.data.message === 'extractImages') {
data.message = 'imagesExtracted';
}
ctx.postMessage(data);
}
else if (event.data.message === 'renderImageAsTile') {
var values = event.data;
var firstPage = documentDetails.getPage(event.data.pageIndex);
var data = firstPage.renderTileImage(values.tileX, values.tileY, values.tileXCount, values.tileYCount, values.zoomFactor, event.data.isTextNeed, event.data.textDetailsId, event.data.cropBoxRect, event.data.mediaBoxRect);
ctx.postMessage(data);
}
else if (event.data.message === 'renderImageAsTileSearch') {
var values = event.data;
var firstPage = documentDetails.getPage(event.data.pageIndex);
var data = firstPage.renderTileImage(values.tileX, values.tileY, values.tileXCount, values.tileYCount, values.zoomFactor, event.data.isTextNeed, event.data.textDetailsId, event.data.cropBoxRect, event.data.mediaBoxRect);
data.message = 'renderTileImageSearch';
ctx.postMessage(data);
}
else if (event.data.message === 'unloadFPDF') {
if (documentDetails) {
var freeFunction = PDFiumModule.asm && PDFiumModule.asm.free
? PDFiumModule.asm.free
: PDFiumModule._free;
freeFunction(documentDetails.processor.wasmData.wasmBuffer);
FPDF.CloseDocument(documentDetails.processor.wasmData.wasm);
FPDF.DestroyLibrary();
if (PDFiumModule.removeFunction && readBlockPtr) {
PDFiumModule.removeFunction(readBlockPtr);
}
documentDetails = null;
}
}
}
if (event.data.message === 'unloadFPDF') {
ctx.postMessage({ message: '' });
}
};
/**
* @param {any} data - jsonObject
* @returns {any} - any
*/
function createPDFCustomLoader(data) {
return {
getFileSize: function () { return data.length; },
readBlock: function (offset, buffer, length) {
if (offset + length > data.length) {
console.error('Requested chunk is out of bounds');
return 0; // Return zero for error if out of bounds
}
for (var i = 0; i < length; i++) {
PDFiumModule.HEAPU8[buffer + i] = data[offset + i];
}
return 1;
}
};
}
var Page = /** @class */ (function () {
function Page(index, processor) {
this.index = index;
this.src = null;
this.processor = processor;
}
Page.prototype.render = function (message, zoomFactor, isTextNeed, printScaleFactor, printDevicePixelRatio, textDetailsId, isTransparent, cropBoxRect, mediaBoxRect, size, isSkipCharacterBounds, imageSize) {
return this.processor.render(this.index, message, zoomFactor, isTextNeed, printScaleFactor, printDevicePixelRatio, textDetailsId, isTransparent, cropBoxRect, mediaBoxRect, size, isSkipCharacterBounds, imageSize);
};
Page.prototype.renderTileImage = function (x, y, tileX, tileY, zoomFactor, isTextNeed, textDetailsId, cropBoxRect, mediaBoxRect) {
return this.processor.renderTileImage(this.index, x, y, tileX, tileY, zoomFactor, isTextNeed, textDetailsId, cropBoxRect, mediaBoxRect);
};
return Page;
}());
var RectAngle = /** @class */ (function () {
function RectAngle(X, Y, Width, Height, Text, Rotation) {
this.X = X;
this.Y = Y;
this.Width = Width;
this.Height = Height;
this.Bottom = this.Y + this.Height;
this.Right = this.X + this.Width;
this.Top = this.Y;
this.Left = this.X;
this.Rotation = Rotation;
this.Text = Text;
}
return RectAngle;
}());
var Processor = /** @class */ (function () {
function Processor(wasmData) {
this.TextBounds = [];
this.TextContent = [];
this.CharacterBounds = [];
this.PageText = '';
this.wasmData = wasmData;
}
Processor.prototype.getPageSize = function (i) {
var _this = this;
if (i === void 0) { i = 0; }
return H(F64, 2, [-1, -1])(function (w, h) { return FPDF.GetPageSizeByIndex(_this.wasmData.wasm, i, w, h); }).
map(function (v) { return parseInt((v * (96 / 72)).toString(), 10); });
};
Processor.prototype.getCharBounds = function (pagePointer, i) {
if (i === void 0) { i = 0; }
return H(F64, 4, [-1, -1, -1, -1])(function (left, right, bottom, top) { return FPDF.
GetCharBox(pagePointer, i, left, right, bottom, top); });
};
Processor.prototype.getRender = function (i, w, h, isTextNeed, isTransparent, cropBoxRect, mediaBoxRect, isSkipCharacterBounds) {
if (i === void 0) { i = 0; }
var flag = FPDF.REVERSE_BYTE_ORDER;
var mallocFunction = PDFiumModule.asm && PDFiumModule.asm.malloc
? PDFiumModule.asm.malloc
: PDFiumModule._malloc;
var heap = mallocFunction(w * h * 4);
PDFiumModule.HEAPU8.fill(0, heap, heap + (w * h * 4));
var bmap = FPDF.Bitmap_CreateEx(w, h, FPDF.Bitmap_BGRA, heap, w * 4);
var page = FPDF.LoadPage(this.wasmData.wasm, i);
FPDF.Bitmap_FillRect(bmap, 0, 0, w, h, isTransparent ? 0x00FFFFFF : 0xFFFFFFFF);
FPDF.RenderPageBitmap(bmap, page, 0, 0, w, h, 0, flag);
FPDF.Bitmap_Destroy(bmap);
this.textExtraction(page, i, isTextNeed, cropBoxRect, mediaBoxRect, isSkipCharacterBounds);
FPDF.ClosePage(page);
return heap;
};
Processor.prototype.textExtraction = function (pagePointer, pageIndex, isTextNeed, cropBoxRect, mediaBoxRect, isSkipCharacterBounds) {
var _a;
if (isTextNeed) {
// eslint-disable-next-line
var _b = this.getPageSize(pageIndex), pageWidth = _b[0], pageHeight = _b[1];
if (mediaBoxRect && cropBoxRect && mediaBoxRect.y && cropBoxRect.y && mediaBoxRect.y !== cropBoxRect.y) {
pageHeight = pageHeight + this.pointerToPixelConverter(mediaBoxRect && mediaBoxRect.y ? mediaBoxRect.y : 0);
}
var textPage = FPDF.LoadTextPage(pagePointer);
var pageRotation = FPDF.GetPageRotation(pagePointer);
var totalCharacterCount = FPDF.TextCountChars(textPage);
this.TextBounds = [];
this.TextContent = [];
this.CharacterBounds = [];
var pageText = '';
var minTop = 0;
var maxBottom = 0;
var minLeft = 0;
var maxRight = 0;
var top_1 = [];
var bottom = [];
var left = [];
var right = [];
var wordBounds = [];
var word = '';
var wordMinLeft = 0;
var wordMaxRight = 0;
var wordMinTop = 0;
var wordMaxBottom = 0;
var wordRotation = 0;
var wordStart = true;
var isZeroWidthSpace = false;
var isPreviousSpace = false;
var startNewLine = false;
var maximumSpaceForNewLine = 11;
for (var charCount = 0; charCount <= totalCharacterCount; charCount++) {
if (!isSkipCharacterBounds) {
var result = FPDF.GetUnicodeChar(textPage, charCount);
var rotationRadian = FPDF.GetCharAngle(textPage, charCount);
var character = String.fromCharCode(result);
var _c = this.getCharBounds(textPage, charCount), charLeft = _c[0], charRight = _c[1], charBottom = _c[2], charTop = _c[3];
var X = this.pointerToPixelConverter(charLeft) -
this.pointerToPixelConverter(cropBoxRect && cropBoxRect.x ? cropBoxRect.x : 0);
var Y = (pageHeight + this.pointerToPixelConverter(cropBoxRect && cropBoxRect.y ? cropBoxRect.y : 0)) -
this.pointerToPixelConverter(charTop);
var Width = this.pointerToPixelConverter(charRight - charLeft);
var Height = this.pointerToPixelConverter(charTop - charBottom);
var rotationAngle = parseInt((rotationRadian * 180 / Math.PI).toString(), 10);
if (charCount < totalCharacterCount) {
pageText += character;
if (rotationAngle === 270 && pageRotation === 1) {
var newX = this.pointerToPixelConverter(charBottom) -
this.pointerToPixelConverter(cropBoxRect && cropBoxRect.x ? cropBoxRect.x : 0);
var newY = this.pointerToPixelConverter(charLeft);
Height = this.pointerToPixelConverter(Height);
var currentCharacterBounds = new RectAngle(newX, newY, Width, Height, character, rotationAngle);
this.CharacterBounds.push(currentCharacterBounds);
}
else {
var currentCharacterBounds = new RectAngle(X, Y, Width, Height, character, rotationAngle);
this.CharacterBounds.push(currentCharacterBounds);
}
}
if (pageRotation === 1 || pageRotation === 3) {
Y = (pageWidth) - this.pointerToPixelConverter(charTop);
}
switch (character) {
case '\0': {
// eslint-disable-next-line
minTop = Math.min.apply(Math, top_1);
// eslint-disable-next-line
maxBottom = Math.max.apply(Math, bottom);
// eslint-disable-next-line
minLeft = Math.min.apply(Math, left);
// eslint-disable-next-line
maxRight = Math.max.apply(Math, right);
var newWordBounds = new RectAngle(wordMinLeft, wordMinTop, wordMaxRight - wordMinLeft, wordMaxBottom - wordMinTop, word, wordRotation);
wordBounds.push(newWordBounds);
this.textBoundsCalculation(wordBounds, minTop, maxBottom, maxRight, minLeft, pageRotation, pageWidth, pageHeight, totalCharacterCount);
wordBounds = [];
wordStart = true;
isPreviousSpace = false;
word = '';
top_1 = [];
left = [];
bottom = [];
right = [];
minTop = 0;
maxBottom = 0;
minLeft = 0;
maxRight = 0;
break;
}
case '\r':
if (charCount < totalCharacterCount) {
var characterBounds = new RectAngle(X, Y, Width, Height, '\r\n', rotationAngle);
top_1.push(characterBounds.Top);
bottom.push(characterBounds.Bottom);
left.push(characterBounds.Left);
right.push(characterBounds.Right);
// eslint-disable-next-line
minTop = Math.min.apply(Math, top_1);
// eslint-disable-next-line
maxBottom = Math.max.apply(Math, bottom);
// eslint-disable-next-line
minLeft = Math.min.apply(Math, left);
// eslint-disable-next-line
maxRight = Math.max.apply(Math, right);
var newWordBounds = void 0;
if (wordStart === false) {
newWordBounds = new RectAngle(wordMinLeft, wordMinTop, wordMaxRight - wordMinLeft, wordMaxBottom - wordMinTop, word, wordRotation);
wordBounds.push(newWordBounds);
}
wordBounds.push(characterBounds);
this.textBoundsCalculation(wordBounds, minTop, maxBottom, maxRight, minLeft, pageRotation, pageWidth, pageHeight, totalCharacterCount);
wordBounds = [];
wordStart = true;
isPreviousSpace = false;
word = '';
top_1 = [];
left = [];
bottom = [];
right = [];
minTop = 0;
maxBottom = 0;
minLeft = 0;
maxRight = 0;
pageText += '\n';
rotationRadian = FPDF.GetCharAngle(textPage, charCount);
_a = this.getCharBounds(textPage, charCount), charLeft = _a[0], charRight = _a[1], charBottom = _a[2], charTop = _a[3];
X = this.pointerToPixelConverter(charLeft);
Y = (pageHeight) - this.pointerToPixelConverter(charTop);
Width = this.pointerToPixelConverter(charRight - charLeft);
Height = this.pointerToPixelConverter(charTop - charBottom);
rotationAngle = parseInt((rotationRadian * 180 / Math.PI).toString(), 10);
var currentCharacterBounds = new RectAngle(X, Y, Width, Height, character, rotationAngle);
this.CharacterBounds.push(currentCharacterBounds);
charCount++;
}
break;
case '\u0002':
case '\ufffe':
{
var characterBounds = new RectAngle(X, Y, Width, Height, character, rotationAngle);
top_1.push(characterBounds.Top);
bottom.push(characterBounds.Bottom);
left.push(characterBounds.Left);
right.push(characterBounds.Right);
// eslint-disable-next-line
minTop = Math.min.apply(Math, top_1);
// eslint-disable-next-line
maxBottom = Math.max.apply(Math, bottom);
// eslint-disable-next-line
minLeft = Math.min.apply(Math, left);
// eslint-disable-next-line
maxRight = Math.max.apply(Math, right);
var newWordBounds = void 0;
if (wordStart === false) {
newWordBounds = new RectAngle(wordMinLeft, wordMinTop, wordMaxRight - wordMinLeft, wordMaxBottom - wordMinTop, word, wordRotation);
wordBounds.push(newWordBounds);
}
if (character === '\u0002') {
wordBounds.push(characterBounds);
}
this.textBoundsCalculation(wordBounds, minTop, maxBottom, maxRight, minLeft, pageRotation, pageWidth, pageHeight, totalCharacterCount);
wordBounds = [];
wordStart = true;
isPreviousSpace = false;
word = '';
top_1 = [];
left = [];
bottom = [];
right = [];
minTop = 0;
maxBottom = 0;
minLeft = 0;
maxRight = 0;
}
break;
default:
if (Width === 0 || Height === 0) {
isZeroWidthSpace = true;
// eslint-disable-next-line
minTop = Math.min.apply(Math, top_1);
// eslint-disable-next-line
maxBottom = Math.max.apply(Math, bottom);
// eslint-disable-next-line
minLeft = Math.min.apply(Math, left);
// eslint-disable-next-line
maxRight = Math.max.apply(Math, right);
var newWordBounds = new RectAngle(wordMinLeft, wordMinTop, wordMaxRight - wordMinLeft, wordMaxBottom - wordMinTop, word, wordRotation);
wordBounds.push(newWordBounds);
var characterBounds = new RectAngle(X, Y, Width, Height, character, rotationAngle);
wordMinTop = characterBounds.Top;
wordMaxBottom = characterBounds.Bottom;
wordMinLeft = characterBounds.Left;
wordMaxRight = characterBounds.Right;
word = character;
wordRotation = wordBounds[wordBounds.length - 1].Rotation;
newWordBounds = new RectAngle(wordMinLeft, wordMinTop, wordMaxRight - wordMinLeft, wordMaxBottom - wordMinTop, word, wordRotation);
wordBounds.push(newWordBounds);
wordMinTop = 0;
wordMaxBottom = 0;
wordMinLeft = 0;
wordMaxRight = 0;
word = '';
wordRotation = 0;
wordStart = true;
isPreviousSpace = true;
}
else {
if (wordStart === true) {
wordMinTop = Y;
wordMaxBottom = Y + Height;
wordMinLeft = X;
wordMaxRight = X + Width;
}
var characterBounds = new RectAngle(X, Y, Width, Height, character, rotationAngle);
if (character !== ' ') {
if (isPreviousSpace && wordBounds.length > 0 && (rotationAngle === wordBounds[0].Rotation)) {
if ((rotationAngle === 180 || rotationAngle === 0) &&
(Math.abs(characterBounds.Y - wordBounds[0].Y) > maximumSpaceForNewLine)) {
startNewLine = true;
}
if ((rotationAngle === 270 || rotationAngle === 90) &&
(Math.abs(characterBounds.X - wordBounds[0].X) > maximumSpaceForNewLine)) {
startNewLine = true;
}
}
if ((isZeroWidthSpace && wordBounds.length >= 1 &&
wordBounds[wordBounds.length - 1].Rotation !== characterBounds.Rotation) || startNewLine) {
isZeroWidthSpace = false;
startNewLine = false;
// eslint-disable-next-line
minTop = Math.min.apply(Math, top_1);
// eslint-disable-next-line
maxBottom = Math.max.apply(Math, bottom);
// eslint-disable-next-line
minLeft = Math.min.apply(Math, left);
// eslint-disable-next-line
maxRight = Math.max.apply(Math, right);
var newWordBounds = void 0;
if (wordStart === false) {
newWordBounds = new RectAngle(wordMinLeft, wordMinTop, wordMax