Skip to content

Instantly share code, notes, and snippets.

@notmasteryet
Created January 18, 2012 03:15
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save notmasteryet/1630634 to your computer and use it in GitHub Desktop.
Save notmasteryet/1630634 to your computer and use it in GitHub Desktop.
pdf.js font instrumentation
/* -*- 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