-
-
Save tallykatt/0b1734040d1e1b127cf12f74d678e24c to your computer and use it in GitHub Desktop.
pdf.js font instrumentation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ | |
/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ | |
// save the file as '<pdf.js>/font~/debug.js' | |
// bookmarklet -> javascript:(function(){if(window.fontDebugScript)%20return;%20var%20script%20=%20window.fontDebugScript%20=%20document.createElement('script');script.setAttribute('src',%20'../font~/debug.js');document.body.appendChild(script);})(); | |
'use strict'; | |
(function fontDebug() { | |
var fonts; | |
var panelWidth = 300; | |
function initUI() { | |
var ui = document.createElement('div'); | |
ui.setAttribute('style', 'position: fixed; top:35px; bottom:5px; right: 0; width: ' + panelWidth + 'px; background: white; border: 2px black solid; padding: 5px; overflow: scroll;'); | |
document.body.appendChild(ui); | |
var tmp; | |
tmp = document.createElement('p'); | |
tmp.textContent = 'pdf.js font instrumentation'; | |
ui.appendChild(tmp); | |
tmp = document.createElement('button'); | |
tmp.addEventListener('click', refresh); | |
tmp.textContent = 'Refresh'; | |
ui.appendChild(tmp); | |
ui.appendChild(document.createElement('br')); | |
fonts = document.createElement('div'); | |
ui.appendChild(fonts); | |
var style = document.createElement('style'); | |
style.textContent = '.showtext { background: yellow; color: blue; opacity: 0.3; } .hidetext:hover { background: yellow; opacity: 0.3; }'; | |
ui.appendChild(style); | |
document.body.setAttribute('style', 'padding-right: ' + panelWidth + 'px;'); | |
document.body.addEventListener('click', textLayerClick, true); | |
refresh(); | |
} | |
function refresh() { | |
resetSelection(); | |
fonts.innerHTML = ''; | |
var styles = document.styleSheets; | |
for (var i = 0; i < styles.length; i++) { | |
var style = styles[i]; | |
if (!style.cssRules || style.cssRules.length != 1) continue; | |
var rule = style.cssRules[0]; | |
var text = rule.cssText; | |
var m = /(pdfFont\d+)/.exec(text); | |
if (!m) continue; | |
var fontName = m[1]; | |
m = /url\(['"]?([^\)"']+)/.exec(text); | |
var font = document.createElement('div'); | |
var name = document.createElement('a'); | |
name.href = m[1]; | |
name.textContent = fontName; | |
font.appendChild(name); | |
var select = document.createElement('input'); | |
select.setAttribute('type', 'checkbox'); | |
select.dataset.fontName = fontName; | |
select.addEventListener('click', (function(select, fontName) { | |
return (function() { | |
selectFont(fontName, select.checked); | |
}); | |
})(select, fontName)); | |
font.appendChild(select); | |
fonts.appendChild(font); | |
} | |
} | |
function resetSelection() { | |
var divs = document.getElementsByTagName('div'); | |
for (var i = 0; i < divs.length; ++i) { | |
var div = divs[i], style = div.getAttribute('style'); | |
if (!style || style.indexOf('pdfFont') < 0) continue; | |
var m = /(pdfFont\d+)/.exec(style); | |
div.dataset.fontName = m[1]; | |
div.className = 'hidetext'; | |
} | |
} | |
function selectFont(fontName, show) { | |
var divs = document.getElementsByTagName('div'); | |
for (var i = 0; i < divs.length; ++i) { | |
var div = divs[i], style = div.getAttribute('style'); | |
if (div.dataset.fontName != fontName) continue; | |
div.className = show ? 'showtext' : 'hidetext'; | |
} | |
} | |
function textLayerClick(e) { | |
if (!e.target.dataset.fontName || e.target.tagName != 'DIV') | |
return; | |
var fontName = e.target.dataset.fontName; | |
var selects = document.getElementsByTagName('input'); | |
for (var i = 0; i < selects.length; ++i) { | |
var select = selects[i]; | |
if (select.dataset.fontName != fontName) continue; | |
select.checked = !select.checked; | |
selectFont(fontName, select.checked); | |
select.scrollIntoView(); | |
} | |
} | |
initUI(); | |
})(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment