@@ -5,7 +5,6 @@ let deletedMetadata = [];
55let isLocalPath = false ;
66let hasModifications = false ;
77let sizeOfText = 0 ;
8- let pdfText = "" ;
98
109function responsiveDisplay ( ) {
1110 let menu = document . getElementById ( 'sidebarTools' ) ;
@@ -110,24 +109,35 @@ async function loadPDF(pdfBlob) {
110109 document . getElementById ( 'input_metadata_key' ) . focus ( ) ;
111110 }
112111
112+ let itemNumber = 0 ;
113+ let pdfHtml = "" ;
114+ let pdfText = "" ;
113115 for ( let pageNumber = 1 ; pageNumber <= pdf . numPages ; pageNumber ++ ) {
114116 let page = await pdf . getPage ( pageNumber ) ;
115117 let textContent = await page . getTextContent ( ) ;
116118 let previousItem = null ;
117119 for ( let item of textContent . items ) {
120+ if ( ! item . str ) {
121+ continue ;
122+ }
123+
118124 if ( previousItem && item . transform [ 5 ] == previousItem . transform [ 5 ] && item . transform [ 3 ] == previousItem . transform [ 3 ] ) {
119125 pdfText += " " ;
126+ pdfHtml += " " ;
120127 } else if ( previousItem ) {
121128 pdfText += "\n" ;
129+ pdfHtml += "<br />" ;
122130 }
123131
124132 pdfText += item . str ;
133+ pdfHtml += "<span data-id='" + itemNumber + "'>" + item . str + "</span>" ;
125134
126135 previousItem = item ;
136+ itemNumber ++ ;
127137 }
128138 }
129139 pdfText = pdfText . replace ( / [ ] + / g, " " ) ;
130- document . querySelector ( '#tab-text #pdf_text' ) . innerText = pdfText ;
140+ document . querySelector ( '#tab-text #pdf_text' ) . innerHTML = pdfHtml ;
131141 document . querySelector ( '#tab-text #pdf_text_container' ) . classList . toggle ( 'd-none' , ! document . querySelector ( '#tab-text #pdf_text' ) . innerText ) ;
132142 document . querySelector ( '#tab-text #pdf_notext' ) . classList . toggle ( 'd-none' , document . querySelector ( '#tab-text #pdf_text' ) . innerText ) ;
133143
@@ -441,6 +451,34 @@ function createEventsListener() {
441451 setTimeout ( function ( ) { button . querySelector ( 'i.bi' ) . classList . remove ( 'bi-clipboard-check' ) ; button . querySelector ( 'i.bi' ) . classList . add ( 'bi-copy' ) ; } , 2000 ) ;
442452 } )
443453
454+ document . getElementById ( 'pdf_text' ) . addEventListener ( 'mouseover' , function ( e ) {
455+ if ( e . target . nodeName != 'SPAN' ) {
456+ return ;
457+ }
458+ followText ( e . target , '#pdf_text span' , '#container-pages .textLayer span' , false ) ;
459+ } ) ;
460+
461+ document . getElementById ( 'pdf_text' ) . addEventListener ( 'mouseout' , function ( e ) {
462+ if ( e . target . nodeName != 'SPAN' ) {
463+ return ;
464+ }
465+ followText ( e . target , '#pdf_text span' , '#container-pages .textLayer span' , true ) ;
466+ } ) ;
467+
468+ document . getElementById ( 'container-pages' ) . addEventListener ( 'mouseover' , function ( e ) {
469+ if ( e . target . nodeName != 'SPAN' ) {
470+ return ;
471+ }
472+ followText ( e . target , '#container-pages .textLayer span' , '#pdf_text span' , false ) ;
473+ } ) ;
474+
475+ document . getElementById ( 'container-pages' ) . addEventListener ( 'mouseout' , function ( e ) {
476+ if ( e . target . nodeName != 'SPAN' ) {
477+ return ;
478+ }
479+ followText ( e . target , '#container-pages .textLayer span' , '#pdf_text span' , true ) ;
480+ } ) ;
481+
444482 document . querySelector ( '#nav-link-metadata' ) . addEventListener ( 'shown.bs.tab' , event => {
445483 document . querySelector ( '#container-pages' ) . classList . remove ( 'text-highlight' ) ;
446484 } )
@@ -450,6 +488,16 @@ function createEventsListener() {
450488 } )
451489}
452490
491+ function followText ( element , selectorFrom , selectorTo , hide ) {
492+ const indexSpan = Array . from ( document . querySelectorAll ( selectorFrom ) ) . indexOf ( element ) ;
493+ if ( ! document . querySelectorAll ( selectorTo ) [ indexSpan ] ) {
494+ return ;
495+ }
496+ let spanPDF = document . querySelectorAll ( selectorTo ) [ indexSpan ] ;
497+ spanPDF . classList . toggle ( 'active' , ! hide ) ;
498+ spanPDF . scrollIntoView ( { block : "center" , inline : "center" } ) ;
499+ }
500+
453501async function pageUpload ( ) {
454502 document . querySelector ( 'body' ) . classList . remove ( 'bg-light' ) ;
455503 document . getElementById ( 'input_pdf_upload' ) . value = '' ;
0 commit comments