UNPKG

@syncfusion/ej2-pdfviewer

Version:
844 lines 84 kB
/** *@returns {void} */ export function PdfiumRunner() { var moduleString = 'Module'; var pageLoaded = false; var moduleLoaded = false; var FPDF = {}; // 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.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 m = PDFiumModule.asm.malloc(s * Z); var a = Array(1 + s); a[0] = ({ s: s, J: J, Z: Z, E: E, m: m, free: function () { return PDFiumModule.asm.free(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/'; PDFiumModule.FS.createPath('/', filePath, true, true); for (var key in event.data.fonts) { if (event.data.fonts["" + key] && key.indexOf('fallbackfonts') === -1) { PDFiumModule.FS.createDataFile(filePath + key, null, event.data.fonts["" + key], true, true, true); } } } }; this['PDFiumModule'](PDFiumModule); } else if (event.data.message === 'LoadPageCollection') { pdfiumWindow.fileByteArray = event.data.uploadedFile; var fileSize = pdfiumWindow.fileByteArray.length; FPDF.Init(); 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 }); var pages = FPDF.GetPageCount(documentDetails.processor.wasmData.wasm); documentDetails.setPages(pages); documentDetails.createAllPages(); 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 wasmBuffer = PDFiumModule.asm.malloc(fileSize); PDFiumModule.HEAPU8.set(event.data.uploadedFile, wasmBuffer); var documentDetailsNew = new DocumentInfo({ wasm: FPDF.LoadMemDocument(wasmBuffer, fileSize, event.data.password), wasmBuffer: wasmBuffer }); var pages = FPDF.GetPageCount(documentDetailsNew.processor.wasmData.wasm); documentDetailsNew.setPages(pages); documentDetailsNew.createAllPages(); 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 searchTerm = event.data.searchWord; var buffer = new Uint16Array(searchTerm.length + 1); for (var i = 0; i < searchTerm.length; i++) { buffer[parseInt(i.toString(), 10)] = searchTerm.charCodeAt(i); } buffer[searchTerm.length] = 0; var pointer = PDFiumModule.asm.malloc(buffer.length * buffer.BYTES_PER_ELEMENT); PDFiumModule.HEAPU16.set(buffer, pointer / Uint16Array.BYTES_PER_ELEMENT); var occurrencesCount = 0; var isMatchCase = (event.data.matchCase === true) ? 1 : 0; var startIndex = event.data.startIndex; var endIndex = event.data.endIndex; var pageSearchCounts = {}; var _loop_2 = function (a) { var pageOccurrence = -1; var page = FPDF.LoadPage(documentDetails.processor.wasmData.wasm, a); var textPage = FPDF.LoadTextPage(page); var searchHandle = FPDF.TextFindStart(textPage, pointer, isMatchCase, 0); var pageHeight = FPDF.GetPageHeight(page); var _loop_3 = function () { occurrencesCount++; pageOccurrence++; var charLength = FPDF.TextFindCount(searchHandle); var startIndex_1 = FPDF.TextFindResultIndex(searchHandle); 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_1); 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, startIndex_1 + 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, startIndex_1 + 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(searchHandle)) { _loop_3(); } FPDF.TextFindClose(searchHandle); FPDF.ClosePage(page); }; for (var a = startIndex; a < endIndex; a++) { _loop_2(a); } var result = { totalSearchCount: occurrencesCount, resultPages: pageSearchCounts, message: 'textSearched', searchWord: searchTerm, matchCase: event.data.matchCase, isRequestsend: event.data.isRequestsend, isCompletedSearch: (endIndex === pagesCount) ? true : false, endIndex: endIndex }; ctx.postMessage(result); pageSearchCounts = {}; PDFiumModule.asm.free(pointer); } 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); 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); 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; 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) { PDFiumModule.asm.free(documentDetails.processor.wasmData.wasmBuffer); FPDF.CloseDocument(documentDetails.processor.wasmData.wasm); FPDF.DestroyLibrary(); } } } if (event.data.message === 'unloadFPDF') { ctx.postMessage({ message: '' }); } }; 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) { return this.processor.render(this.index, message, zoomFactor, isTextNeed, printScaleFactor, printDevicePixelRatio, textDetailsId, isTransparent, cropBoxRect, mediaBoxRect, size, isSkipCharacterBounds); }; 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 heap = PDFiumModule.asm.malloc(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]; pageHeight = pageHeight + this.pointerToPixelConverter(mediaBoxRect && mediaBoxRect.y ? mediaBoxRect.y : 0); var textPage = FPDF.LoadTextPage(pagePointer, pageIndex); 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; 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, wordMaxRight - wordMinLeft, wordMaxBottom - wordMinTop, word, wordRotation); wordBounds.push(newWordBounds); } this.textBoundsCalculation(wordBounds, minTop, maxBottom, maxRight, minLeft, pageRotation, pageWidth, pageHeight, totalCharacterCount); wordBounds = []; wordStart = true; word = ''; top_1 = []; left = []; bottom = []; right = []; minTop = 0; maxBottom = 0; minLeft = 0; maxRight = 0; } top_1.push(characterBounds.Top); bottom.push(characterBounds.Bottom); left.push(characterBounds.Left); right.push(characterBounds.Right); wordMinTop = Math.min(wordMinTop, characterBounds.Top); wordMaxBottom = Math.max(wordMaxBottom, characterBounds.Bottom); wordMinLeft = Math.min(wordMinLeft, characterBounds.Left); wordMaxRight = Math.max(wordMaxRight, characterBounds.Right); word += character; wordRotation = characterBounds.Rotation; wordStart = false; isPreviousSpace = false; } else { var newWordBounds = new RectAngle(wordMinLeft, wordMinTop, wordMaxRight - wordMinLeft, wordMaxBottom - wordMinTop, word, wordRotation); wordBounds.push(newWordBounds); wordMinTop = characterBounds.Top; wordMaxBottom = characterBounds.Bottom; wordMinLeft = characterBounds.Left; wordMaxRight = characterBounds.Right; word = character; wordRotation = characterBounds.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; } } break; } } else { var result = FPDF.GetUnicodeChar(textPage, charCount); var character = String.fromCharCode(result); if (charCount < totalCharacterCount) { pageText += character; } } } FPDF.CloseTextPage(textPage); this.Rotation = pageRotation; this.PageText = pageText; } }; Processor.prototype.pointerToPixelConverter = function (pointerValue) { return (pointerValue * (96 / 72)); }; Processor.prototype.textBoundsCalculation = function (wordBounds, minTop, maxBottom, maxRight, minLeft, pageRotation, pageWidth, pageHeight, totalCharacterCount) { var newWordBounds; var hasInBetweenRotation = false; var inBetweenRotatedText = ''; var maximumSpaceBetweenWords = 30; var minimumSpaceBetweenWords = 5; var sentence = wordBounds.reduce(function (word, rect) { return word + rect.Text; }, ''); var isRTLText = this.checkIsRtlText(sentence); if (totalCharacterCount >= 5000) { var newWordBoundsCollection = []; var k = 0; var updateBounds_1 = function (rect, bounds) { bounds.minX = Math.min(bounds.minX, rect.X); bounds.minY = Math.min(bounds.minY, rect.Y); bounds.maxX = Math.max(bounds.maxX, rect.X + rect.Width); bounds.maxY = Math.max(bounds.maxY, rect.Y + rect.Height); }; var getMostFrequentLineHeight = function (lineHeights, defaultHeight) { return lineHeights.sort(function (a, b) { return lineHeights.filter(function (v) { return v === a; }).length - lineHeights.filter(function (v) { return v === b; }).length; }).pop() || defaultHeight; }; var _loop_5 = function (i) { var diff = 0; if (i < wordBounds.length - 1) { diff = wordBounds[parseInt((i + 1).toString(), 10)].Left - wordBounds[parseInt(i.toString(), 10)].Right; } if (diff >= minimumSpaceBetweenWords && wordBounds[parseInt(i.toString(), 10)].Text !== '\r\n') { var bounds = { minX: wordBounds[parseInt(k.toString(), 10)].X, minY: wordBounds[parseInt(k.toString(), 10)].Y, maxX: wordBounds[parseInt(k.toString(), 10)].X, maxY: wordBounds[parseInt(k.toString(), 10)].Y }; var inBetweenRotatedText_1 = ''; var lineHeights = []; for (var j = k; j <= i; j++) { var rect = wordBounds[parseInt(j.toString(), 10)]; updateBounds_1(rect, bounds); lineHeights.push(rect.Height); inBetweenRotatedText_1 += rect.Text; } var combinedWidth = bounds.maxX - bounds.minX; var combinedHeight = bounds.maxY - bounds.minY; var newWordBounds_1 = new RectAngle(bounds.minX, bounds.minY, combinedWidth, combinedHeight, inBetweenRotatedText_1, wordBounds[0].Rotation); newWordBoundsCollection.push(newWordBounds_1); k = i + 1; } else if (newWordBoundsCollection.length === 0 && i === wordBounds.length - 1) { var bounds_1 = { minX: wordBounds[0].X, minY: wordBounds[0].Y, maxX: wordBounds[0].X, maxY: wordBounds[0].Y }; wordBounds.forEach(function (rect) { updateBounds_1(rect, bounds_1); }); var combinedWidth = bounds_1.maxX - bounds_1.minX; var combinedHeight = bounds_1.maxY - bounds_1.minY; var inBetweenRotatedText_2 = wordBounds.map(function (rect) { return rect.Text; }).join(''); var newWordBounds_