Skip to content

Commit 4e4c30f

Browse files
committed
ocr: Following text between div and pdf
1 parent b80265c commit 4e4c30f

2 files changed

Lines changed: 53 additions & 5 deletions

File tree

public/css/app.css

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -197,15 +197,15 @@ a.block-drag:hover, a.block-drag.active, a.block-drag:active {
197197
z-index: 3;
198198
}
199199

200-
#page-metadata .text-highlight .textLayer span {
200+
/* #page-metadata .text-highlight .textLayer span {
201201
background: rgba(255, 191, 0, 0.25);
202-
}
202+
} */
203203

204204
#page-metadata .text-highlight:hover span {
205205
background: transparent;
206206
}
207207

208-
#page-metadata .textLayer span:hover {
208+
#page-metadata .textLayer span:hover, #page-metadata .textLayer span.active, #page-metadata #pdf_text span:hover, #page-metadata #pdf_text span.active {
209209
background: rgba(255, 191, 0, 0.25) !important;
210210
}
211211

public/js/metadata.js

Lines changed: 50 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ let deletedMetadata = [];
55
let isLocalPath = false;
66
let hasModifications = false;
77
let sizeOfText = 0;
8-
let pdfText = "";
98

109
function 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+
453501
async function pageUpload() {
454502
document.querySelector('body').classList.remove('bg-light');
455503
document.getElementById('input_pdf_upload').value = '';

0 commit comments

Comments
 (0)