Find page mapping during statistics calculation

This commit is contained in:
Johannes Zillmann 2021-03-28 23:45:26 +02:00
parent 89d4bbd2f9
commit 388e8cc6b1
63 changed files with 755 additions and 69 deletions

31
core/src/PageMapping.ts Normal file
View File

@ -0,0 +1,31 @@
/**
* Holds the information which (zero based) page index maps to a page number.
*/
export default class PageMapping {
constructor(public pageFactor: number, public detectedOnPage: boolean) {}
/**
* Translates a given page index to a page number label as printed on the page. E.g [0,1,2,3,4] could become [I, II, 1, 2].
* @param pageIndex
*/
pageLabel(pageIndex: number) {
const pageNumber = pageIndex + this.pageFactor;
if (pageNumber < 0) {
return romanize(pageNumber - this.pageFactor + 1);
}
return `${pageNumber + 1}`;
}
}
function romanize(num: number): string {
var lookup = { M: 1000, CM: 900, D: 500, CD: 400, C: 100, XC: 90, L: 50, XL: 40, X: 10, IX: 9, V: 5, IV: 4, I: 1 },
roman = '',
i: string;
for (i in lookup) {
while (num >= lookup[i]) {
roman += i;
num -= lookup[i];
}
}
return roman;
}

View File

@ -0,0 +1,38 @@
import { onlyUniques } from './groupingUtils';
type NumberExtractor = (container: any) => Extract;
type Extract = { index: number; numbers: number[] };
export default class PageFactorFinder {
find(
containers: any[],
extractor: NumberExtractor,
config = { sampleCount: 20, minFulfillment: 0.8 },
): number | undefined {
const containerAnalyzeCount = Math.min(config.sampleCount, containers.length);
const start = Math.max(containers.length / 2 - containerAnalyzeCount / 2, 0); //start somewhere in the middle
const pageNumbers = containers
.slice(start, start + containerAnalyzeCount)
.map((container) => extractor(container))
.map((extract) => extract.numbers.map((num) => num - extract.index).filter(onlyUniques));
const distanceCounts = pageNumbers.reduce((map, indexDistancesPerPage) => {
indexDistancesPerPage.forEach((indexDistance) => {
map[indexDistance] = (map[indexDistance] || 0) + 1;
});
return map;
}, {});
const hits = Object.keys(distanceCounts)
.filter((distance) => distanceCounts[distance] / containerAnalyzeCount >= config.minFulfillment)
.sort((d1, d2) => distanceCounts[d1] - distanceCounts[d2]);
// for all remaining index distance arrays - check y coordinates
if (hits.length < 1) {
return undefined;
}
return Number.parseInt(hits[0]);
}
}

View File

@ -17,6 +17,10 @@ import {
} from '../support/groupingUtils';
import { filterOutDigits } from '../support/stringFunctions';
import { flatten, groupBy } from '../support/functional';
import { MIN_Y, MAX_Y } from './CacluclateStatistics';
import GlobalDefinition from './GlobalDefinition';
export const PAGE_FACTOR = new GlobalDefinition<string>('pageFactor');
const config = {
// Max number of lines at top/bottom (per page) which are getting evaluated for eviction
@ -43,17 +47,8 @@ export default class RemoveRepetitiveItems extends ItemTransformer {
}
transform(context: TransformContext, inputItems: Item[]): ItemResult {
const { minY, maxY } = inputItems.reduce(
({ minY, maxY }, item) => {
const y = item.data['y'];
return {
minY: Math.min(minY, y),
maxY: Math.max(maxY, y),
};
},
{ minY: 999, maxY: 0 },
);
const minY = context.getGlobal(MIN_Y);
const maxY = context.getGlobal(MAX_Y);
const bottomMaxY = minY + config.maxDistanceFromFringeElements;
const topMinY = maxY - config.maxDistanceFromFringeElements;
// console.log('bottomMaxY', bottomMaxY, 'topMinY', topMinY);
@ -76,6 +71,8 @@ export default class RemoveRepetitiveItems extends ItemTransformer {
);
const pageNumber = detectAPageNumber(fringeLines);
const globuly = pageNumber ? `${pageNumber.pageNumber - pageNumber.pageIndex}` : 'n/a';
const fringeYs = fringeLines
.map((line) => line.y)
.filter(onlyUniques)
@ -126,6 +123,7 @@ export default class RemoveRepetitiveItems extends ItemTransformer {
return lineItems;
}),
messages: [`Filtered out ${removalCount} items with y == ${yToRemove.join('||')}`],
globals: [PAGE_FACTOR.value(globuly)],
};
}
}
@ -142,6 +140,7 @@ function calculatePageNumerScore(pageCount: number, pageNumber: PageNumber, line
function detectAPageNumber(lines: PageLine[]): PageNumber | undefined {
const linesByPage = groupBy(lines, (line) => line.page).sort((a, b) => a[0].page - b[0].page);
const pageIndexInTheMiddle = Math.round(linesByPage.length / 2);
const possiblePageNumbersForMiddle = possiblePageNumbers(linesByPage[pageIndexInTheMiddle]);
const remainingOptions = filterOutIncompatibleVariant(
possiblePageNumbersForMiddle,

View File

@ -0,0 +1,12 @@
import PageMapping from 'src/PageMapping';
test('1-to-1', async () => {
const mapping = new PageMapping(0, false);
expect(mapping.pageFactor).toEqual(0);
expect([...Array(3).keys()].map((i) => mapping.pageLabel(i))).toEqual(['1', '2', '3']);
});
test('lame start', async () => {
const mapping = new PageMapping(-3, true);
expect([...Array(5).keys()].map((i) => mapping.pageLabel(i))).toEqual(['I', 'II', 'III', '1', '2']);
});

View File

@ -0,0 +1,126 @@
import PageFactorFinder from 'src/support/PageFactorFinder';
interface Container {
index: number;
numbers: number[];
}
const extractor = (container: Container) => container;
test('distraction free - straight', () => {
const finder = new PageFactorFinder();
const containers: Container[] = [
{ index: 0, numbers: [1] },
{ index: 1, numbers: [2] },
{ index: 2, numbers: [3] },
{ index: 3, numbers: [4] },
{ index: 4, numbers: [5] },
{ index: 5, numbers: [6] },
];
expect(finder.find(containers, extractor)).toEqual(1);
});
test('distraction free - accept gap in numbers', () => {
const finder = new PageFactorFinder();
const containers: Container[] = [
{ index: 0, numbers: [1] },
{ index: 1, numbers: [2] },
{ index: 2, numbers: [3] },
{ index: 3, numbers: [4] },
{ index: 4, numbers: [] },
{ index: 5, numbers: [6] },
];
expect(finder.find(containers, extractor)).toEqual(1);
});
test('distraction free - accept gap in pages', () => {
const finder = new PageFactorFinder();
const containers: Container[] = [
{ index: 0, numbers: [1] },
{ index: 1, numbers: [2] },
{ index: 2, numbers: [3] },
{ index: 3, numbers: [4] },
{ index: 5, numbers: [6] },
];
expect(finder.find(containers, extractor)).toEqual(1);
});
test('distraction free - defered', () => {
const finder = new PageFactorFinder();
const containers: Container[] = [
{ index: 0, numbers: [2006] },
{ index: 1, numbers: [] },
{ index: 2, numbers: [1, 1] },
{ index: 3, numbers: [2] },
{ index: 4, numbers: [3] },
{ index: 5, numbers: [4] },
{ index: 6, numbers: [5] },
{ index: 7, numbers: [6] },
];
expect(finder.find(containers, extractor)).toEqual(-1);
});
test('distraction loaden - straight', () => {
const finder = new PageFactorFinder();
const containers: Container[] = [
{ index: 0, numbers: [1, -3453] },
{ index: 1, numbers: [2, 355] },
{ index: 2, numbers: [3, 950, 4] },
{ index: 3, numbers: [4, 534, 5] },
{ index: 4, numbers: [5, 6] },
{ index: 5, numbers: [6, 35335] },
];
expect(finder.find(containers, extractor)).toEqual(1);
});
test('distraction loaden - defered', () => {
const finder = new PageFactorFinder();
const containers: Container[] = [
{ index: 0, numbers: [2006] },
{ index: 1, numbers: [5] },
{ index: 2, numbers: [1, 7678] },
{ index: 3, numbers: [2, 2] },
{ index: 4, numbers: [3, 4] },
{ index: 5, numbers: [4, 5, 65, 8] },
{ index: 6, numbers: [5, 9] },
{ index: 7, numbers: [6] },
];
expect(finder.find(containers, extractor)).toEqual(-1);
});
test('many numbers but no meaningful match', () => {
const finder = new PageFactorFinder();
const containers: Container[] = [
{ index: 0, numbers: [3] },
{ index: 1, numbers: [7] },
{ index: 2, numbers: [4] },
{ index: 3, numbers: [6, 5] },
{ index: 4, numbers: [13, 9] },
{ index: 5, numbers: [8, 7] },
{ index: 6, numbers: [11] },
{ index: 7, numbers: [1] },
];
expect(finder.find(containers, extractor)).toBeUndefined();
});
test('many numbers but no match', () => {
const finder = new PageFactorFinder();
const containers: Container[] = [
{ index: 0, numbers: [22] },
{ index: 1, numbers: [7] },
{ index: 2, numbers: [14] },
{ index: 3, numbers: [1, 5] },
{ index: 4, numbers: [13, 9] },
{ index: 5, numbers: [8, 787] },
{ index: 6, numbers: [12] },
{ index: 7, numbers: [1] },
];
expect(finder.find(containers, extractor)).toBeUndefined();
});

View File

@ -27,7 +27,15 @@
}
],
"globals": {
"maxHeight": 59.7758
"maxHeight": 59.7758,
"minX": 117.8279999999999,
"maxX": 471.0319307,
"minY": 95.28300000000016,
"maxY": 736.017,
"pageMapping": {
"pageFactor": -1,
"detectedOnPage": true
}
}
}
{"page":0,"change":"none","str":"SHERLOCK","dir":"ltr","width":"363.20","height":"59.78","transform":["59.78","0.00","0.00","59.78","117.83","656.26"],"fontName":"NVBKCW+RoyalInitialen","x":117.828,"y":656.262}

View File

@ -31,7 +31,15 @@
}
],
"globals": {
"maxHeight": 59.7758
"maxHeight": 59.7758,
"minX": 117.8279999999999,
"maxX": 471.0319307,
"minY": 95.28300000000016,
"maxY": 736.017,
"pageMapping": {
"pageFactor": -1,
"detectedOnPage": true
}
}
}
{"page":1,"change":"Addition","str":"S IR A RTHUR I GNATIUS C ONAN D OYLE","line":0,"x":196.324,"y":678.946,"width":"342.54","height":"24.79","fontName":["KKLGKN+NimbusRomNo9L-Regu","INBNCB+NimbusRomNo9L-Medi"],"dir":["ltr"]}

View File

@ -30,7 +30,16 @@
}
],
"globals": {
"maxHeight": 59.7758
"maxHeight": 59.7758,
"minX": 117.8279999999999,
"maxX": 471.0319307,
"minY": 95.28300000000016,
"maxY": 736.017,
"pageMapping": {
"pageFactor": -1,
"detectedOnPage": true
},
"pageFactor": "-1"
}
}
{"page":3,"change":"Removal","str":"2","dir":"ltr","width":"5.45","height":"10.91","transform":["10.91","0.00","0.00","10.91","294.43","95.28"],"fontName":"KKLGKN+NimbusRomNo9L-Regu","x":294.428,"y":95.28300000000016,"line":13}

View File

@ -30,7 +30,15 @@
}
],
"globals": {
"maxHeight": 59.7758
"maxHeight": 59.7758,
"minX": 117.8279999999999,
"maxX": 471.0319307,
"minY": 95.28300000000016,
"maxY": 736.017,
"pageMapping": {
"pageFactor": -1,
"detectedOnPage": true
}
}
}
{"page":1,"change":"ContentChange","str":"S IR C A ONAN RTHUR D I OYLE GNATIUS","line":0,"x":196.324,"y":678.946,"width":"342.54","height":"24.79","fontName":["KKLGKN+NimbusRomNo9L-Regu","INBNCB+NimbusRomNo9L-Medi"],"dir":["ltr"]}

View File

@ -27,7 +27,15 @@
}
],
"globals": {
"maxHeight": 24.787
"maxHeight": 24.787,
"minX": 102.88399999999984,
"maxX": 488.43800000000005,
"minY": 95.545,
"maxY": 735.021,
"pageMapping": {
"pageFactor": 0,
"detectedOnPage": true
}
}
}
{"page":0,"change":"none","str":"A","dir":"ltr","width":"17.90","height":"24.79","transform":["24.79","0.00","0.00","24.79","171.72","625.56"],"fontName":"TBCMKD+NimbusRomNo9L-Medi","x":171.72200000000004,"y":625.557}

View File

@ -31,7 +31,15 @@
}
],
"globals": {
"maxHeight": 24.787
"maxHeight": 24.787,
"minX": 102.88399999999984,
"maxX": 488.43800000000005,
"minY": 95.545,
"maxY": 735.021,
"pageMapping": {
"pageFactor": 0,
"detectedOnPage": true
}
}
}
{"page":0,"change":"Addition","str":"A LICE S A DVENTURES","line":0,"x":171.72200000000004,"y":625.557,"width":"238.54","height":"24.79","fontName":["TBCMKD+NimbusRomNo9L-Medi"],"dir":["ltr"]}

View File

@ -30,7 +30,16 @@
}
],
"globals": {
"maxHeight": 24.787
"maxHeight": 24.787,
"minX": 102.88399999999984,
"maxX": 488.43800000000005,
"minY": 95.545,
"maxY": 735.021,
"pageMapping": {
"pageFactor": 0,
"detectedOnPage": true
},
"pageFactor": "0"
}
}
{"page":1,"change":"Removal","str":"1","dir":"ltr","width":"5.98","height":"11.96","transform":["11.96","0.00","0.00","11.96","294.17","95.55"],"fontName":"FZVLIH+NimbusRomNo9L-Regu","x":294.167,"y":95.545,"line":14}

View File

@ -30,7 +30,15 @@
}
],
"globals": {
"maxHeight": 24.787
"maxHeight": 24.787,
"minX": 102.88399999999984,
"maxX": 488.43800000000005,
"minY": 95.545,
"maxY": 735.021,
"pageMapping": {
"pageFactor": 0,
"detectedOnPage": true
}
}
}
{"page":12,"change":"ContentChange","str":"she began again: O u est ma chatte? which was the first sentence in her French `","line":37,"x":102.88399999999999,"y":183.2159999999997,"width":"392.53","height":"11.96","fontName":["FZVLIH+NimbusRomNo9L-Regu"],"dir":["ltr"]}

View File

@ -27,7 +27,15 @@
}
],
"globals": {
"maxHeight": 18
"maxHeight": 18,
"minX": 72.024,
"maxX": 534.58,
"minY": 63.144,
"maxY": 745.56,
"pageMapping": {
"pageFactor": 1,
"detectedOnPage": true
}
}
}
{"page":0,"change":"none","str":"Closed syllable word lists ","dir":"ltr","width":"113.71","height":"11.04","transform":["11.04","0.00","0.00","11.04","420.79","745.56"],"fontName":"ABCDEE+Calibri","x":420.79,"y":745.56}

View File

@ -31,7 +31,15 @@
}
],
"globals": {
"maxHeight": 18
"maxHeight": 18,
"minX": 72.024,
"maxX": 534.58,
"minY": 63.144,
"maxY": 745.56,
"pageMapping": {
"pageFactor": 1,
"detectedOnPage": true
}
}
}
{"page":0,"change":"Addition","str":"Closed syllable word lists 1","line":0,"x":420.79,"y":745.56,"width":"119.31","height":"11.04","fontName":["ABCDEE+Calibri"],"dir":["ltr"]}

View File

@ -30,7 +30,16 @@
}
],
"globals": {
"maxHeight": 18
"maxHeight": 18,
"minX": 72.024,
"maxX": 534.58,
"minY": 63.144,
"maxY": 745.56,
"pageMapping": {
"pageFactor": 1,
"detectedOnPage": true
},
"pageFactor": "n/a"
}
}
{"page":0,"change":"Removal","str":"Closed syllable word lists 1","line":0,"x":420.79,"y":745.56,"width":"119.31","height":"11.04","fontName":["ABCDEE+Calibri"],"dir":["ltr"]}

View File

@ -30,6 +30,14 @@
}
],
"globals": {
"maxHeight": 18
"maxHeight": 18,
"minX": 72.024,
"maxX": 534.58,
"minY": 63.144,
"maxY": 745.56,
"pageMapping": {
"pageFactor": 1,
"detectedOnPage": true
}
}
}

View File

@ -27,7 +27,15 @@
}
],
"globals": {
"maxHeight": 30
"maxHeight": 30,
"minX": 56.69069,
"maxX": 507.3787,
"minY": 45,
"maxY": 772,
"pageMapping": {
"pageFactor": 1,
"detectedOnPage": true
}
}
}
{"page":0,"change":"none","str":"Mega Überschrift","dir":"ltr","width":"245.06","height":"30.00","transform":["30.00","0.00","0.00","30.00","175.00","756.00"],"fontName":"OMUGKQ+Helvetica-Bold","x":175,"y":756}

View File

@ -31,7 +31,15 @@
}
],
"globals": {
"maxHeight": 30
"maxHeight": 30,
"minX": 56.69069,
"maxX": 507.3787,
"minY": 45,
"maxY": 772,
"pageMapping": {
"pageFactor": 1,
"detectedOnPage": true
}
}
}
{"page":0,"change":"Addition","str":"Dies ist eine Test-PDF . 1","line":2,"x":240,"y":585,"width":"115.75","height":"11.00","fontName":["JBRMKS+Helvetica"],"dir":["ltr"]}

View File

@ -30,7 +30,16 @@
}
],
"globals": {
"maxHeight": 30
"maxHeight": 30,
"minX": 56.69069,
"maxX": 507.3787,
"minY": 45,
"maxY": 772,
"pageMapping": {
"pageFactor": 1,
"detectedOnPage": true
},
"pageFactor": "1"
}
}
{"page":0,"change":"Removal","str":"\u0000 1","line":5,"x":294,"y":45,"width":"6.67","height":"12.00","fontName":["QACXPP+Helvetica","JBRMKS+Helvetica"],"dir":["ltr"]}

View File

@ -30,7 +30,15 @@
}
],
"globals": {
"maxHeight": 30
"maxHeight": 30,
"minX": 56.69069,
"maxX": 507.3787,
"minY": 45,
"maxY": 772,
"pageMapping": {
"pageFactor": 1,
"detectedOnPage": true
}
}
}
{"page":0,"change":"ContentChange","str":"Dies ist eine Test-PDF 1 .","line":2,"x":240,"y":585,"width":"115.75","height":"11.00","fontName":["JBRMKS+Helvetica"],"dir":["ltr"]}

View File

@ -27,7 +27,15 @@
}
],
"globals": {
"maxHeight": 29
"maxHeight": 29,
"minX": 37.1206,
"maxX": 542.2816,
"minY": 36.1763,
"maxY": 811.1348,
"pageMapping": {
"pageFactor": 0,
"detectedOnPage": false
}
}
}
{"page":0,"change":"none","str":"La vraie température !","dir":"ltr","width":"307.05","height":"29.00","transform":["29.00","0.00","0.00","29.00","197.43","469.65"],"fontName":"NRVUEW+HelveticaNeue-Thin","x":197.4282,"y":469.654}

View File

@ -31,7 +31,15 @@
}
],
"globals": {
"maxHeight": 29
"maxHeight": 29,
"minX": 37.1206,
"maxX": 542.2816,
"minY": 36.1763,
"maxY": 811.1348,
"pageMapping": {
"pageFactor": 0,
"detectedOnPage": false
}
}
}
{"page":0,"change":"Addition","str":"F l a s h - M a s q u e","line":4,"x":37.1206,"y":758.8381,"width":"99.35","height":"17.64","fontName":["NRVUEW+Futura-Light"],"dir":["ltr"]}

View File

@ -30,7 +30,16 @@
}
],
"globals": {
"maxHeight": 29
"maxHeight": 29,
"minX": 37.1206,
"maxX": 542.2816,
"minY": 36.1763,
"maxY": 811.1348,
"pageMapping": {
"pageFactor": 0,
"detectedOnPage": false
},
"pageFactor": "n/a"
}
}
{"page":0,"change":"Removal","str":"s h a l F - M a s q u e","line":4,"x":37.1206,"y":758.8381,"width":"99.35","height":"17.64","fontName":["NRVUEW+Futura-Light"],"dir":["ltr"]}

View File

@ -30,7 +30,15 @@
}
],
"globals": {
"maxHeight": 29
"maxHeight": 29,
"minX": 37.1206,
"maxX": 542.2816,
"minY": 36.1763,
"maxY": 811.1348,
"pageMapping": {
"pageFactor": 0,
"detectedOnPage": false
}
}
}
{"page":0,"change":"ContentChange","str":"s h a l F - M a s q u e","line":4,"x":37.1206,"y":758.8381,"width":"99.35","height":"17.64","fontName":["NRVUEW+Futura-Light"],"dir":["ltr"]}

View File

@ -27,7 +27,15 @@
}
],
"globals": {
"maxHeight": 48
"maxHeight": 48,
"minX": 62.03970999999996,
"maxX": 536.37986,
"minY": 22.6801,
"maxY": 709.8000000000001,
"pageMapping": {
"pageFactor": 1,
"detectedOnPage": true
}
}
}
{"page":0,"change":"none","str":"1","dir":"ltr","width":"4.08","height":"8.04","transform":["8.04","0.00","0.00","8.04","304.01","22.68"],"fontName":"NTKUYH+Calibri","x":304.01,"y":22.6801}

View File

@ -31,7 +31,15 @@
}
],
"globals": {
"maxHeight": 48
"maxHeight": 48,
"minX": 62.03970999999996,
"maxX": 536.37986,
"minY": 22.6801,
"maxY": 709.8000000000001,
"pageMapping": {
"pageFactor": 1,
"detectedOnPage": true
}
}
}
{"page":0,"change":"Addition","str":"Grammar Matters by Debbie Kuhlmann is licensed under a Creative Commons Attribution 4.0","line":3,"x":99.6238,"y":96.1441,"width":"413.06","height":"9.96","fontName":["URQURO+Helvetica"],"dir":["ltr"]}

View File

@ -30,7 +30,16 @@
}
],
"globals": {
"maxHeight": 48
"maxHeight": 48,
"minX": 62.03970999999996,
"maxX": 536.37986,
"minY": 22.6801,
"maxY": 709.8000000000001,
"pageMapping": {
"pageFactor": 1,
"detectedOnPage": true
},
"pageFactor": "1"
}
}
{"page":0,"change":"Removal","str":"1","dir":"ltr","width":"4.08","height":"8.04","transform":["8.04","0.00","0.00","8.04","304.01","22.68"],"fontName":"NTKUYH+Calibri","x":304.01,"y":22.6801,"line":0}

View File

@ -30,6 +30,14 @@
}
],
"globals": {
"maxHeight": 48
"maxHeight": 48,
"minX": 62.03970999999996,
"maxX": 536.37986,
"minY": 22.6801,
"maxY": 709.8000000000001,
"pageMapping": {
"pageFactor": 1,
"detectedOnPage": true
}
}
}

View File

@ -27,7 +27,15 @@
}
],
"globals": {
"maxHeight": 45.974399999999996
"maxHeight": 45.974399999999996,
"minX": 26.29161,
"maxX": 273.69135,
"minY": 15.08535,
"maxY": 432.30303,
"pageMapping": {
"pageFactor": -17,
"detectedOnPage": true
}
}
}
{"page":3,"change":"none","str":"(l^,^^^^i^<jiM'^^^>^","dir":"ltr","width":"70.12","height":"5.84","transform":["5.84","0.00","0.00","5.84","35.06","401.56"],"x":35.055479999999996,"y":401.55764999999997}

View File

@ -31,7 +31,15 @@
}
],
"globals": {
"maxHeight": 45.974399999999996
"maxHeight": 45.974399999999996,
"minX": 26.29161,
"maxX": 273.69135,
"minY": 15.08535,
"maxY": 432.30303,
"pageMapping": {
"pageFactor": -17,
"detectedOnPage": true
}
}
}
{"page":3,"change":"Addition","str":"(l^,^^^^i^<jiM'^^^>^ ^","line":0,"x":35.055479999999996,"y":384.02991,"width":"97.70","height":"45.97","fontName":[null],"dir":["ltr"]}

View File

@ -30,7 +30,16 @@
}
],
"globals": {
"maxHeight": 45.974399999999996
"maxHeight": 45.974399999999996,
"minX": 26.29161,
"maxX": 273.69135,
"minY": 15.08535,
"maxY": 432.30303,
"pageMapping": {
"pageFactor": -17,
"detectedOnPage": true
},
"pageFactor": "-17"
}
}
{"page":13,"change":"Removal","str":"\\-iii Preface.","line":0,"x":63.50214,"y":400.98296999999997,"width":"50.42","height":"7.99","fontName":[null],"dir":["ltr"]}

View File

@ -30,7 +30,15 @@
}
],
"globals": {
"maxHeight": 45.974399999999996
"maxHeight": 45.974399999999996,
"minX": 26.29161,
"maxX": 273.69135,
"minY": 15.08535,
"maxY": 432.30303,
"pageMapping": {
"pageFactor": -17,
"detectedOnPage": true
}
}
}
{"page":6,"change":"ContentChange","str":"T OooulO^I ^ 4le.^A\\-^","line":0,"x":55.16928,"y":403.28168999999997,"width":"113.07","height":"23.47","fontName":[null],"dir":["ltr"]}

View File

@ -27,7 +27,15 @@
}
],
"globals": {
"maxHeight": 36
"maxHeight": 36,
"minX": 53.88,
"maxX": 797.38,
"minY": 23.04,
"maxY": 528.34,
"pageMapping": {
"pageFactor": 1,
"detectedOnPage": true
}
}
}
{"page":0,"change":"none","str":"Quality Improvement Clinic Ltd. ","dir":"ltr","width":"155.86","height":"11.04","transform":["11.04","0.00","0.00","11.04","99.26","30.72"],"x":99.264,"y":30.72}

View File

@ -31,7 +31,15 @@
}
],
"globals": {
"maxHeight": 36
"maxHeight": 36,
"minX": 53.88,
"maxX": 797.38,
"minY": 23.04,
"maxY": 528.34,
"pageMapping": {
"pageFactor": 1,
"detectedOnPage": true
}
}
}
{"page":0,"change":"Addition","str":"Quality Improvement Clinic Ltd. August 2015","line":0,"x":99.264,"y":23.04,"width":"214.60","height":"11.04","fontName":[null],"dir":["ltr"]}

View File

@ -30,7 +30,16 @@
}
],
"globals": {
"maxHeight": 36
"maxHeight": 36,
"minX": 53.88,
"maxX": 797.38,
"minY": 23.04,
"maxY": 528.34,
"pageMapping": {
"pageFactor": 1,
"detectedOnPage": true
},
"pageFactor": "1"
}
}
{"page":1,"change":"Removal","str":"Quality Improvement Clinic Ltd. P a g e | 2 August 2015","line":0,"x":99.264,"y":30.84,"width":"261.24","height":"11.04","fontName":[null],"dir":["ltr"]}

View File

@ -30,7 +30,15 @@
}
],
"globals": {
"maxHeight": 36
"maxHeight": 36,
"minX": 53.88,
"maxX": 797.38,
"minY": 23.04,
"maxY": 528.34,
"pageMapping": {
"pageFactor": 1,
"detectedOnPage": true
}
}
}
{"page":22,"change":"ContentChange","str":"0.5 1.5 2.5 3.5 4.5 0 1 2 3 4 5","line":46,"x":442.82,"y":254.83,"width":"93.38","height":"9.98","fontName":["ABCDEE+Calibri"],"dir":["ltr"]}

View File

@ -27,7 +27,15 @@
}
],
"globals": {
"maxHeight": 36
"maxHeight": 36,
"minX": 6.487999999999971,
"maxX": 815.833,
"minY": 16.345999999999947,
"maxY": 563.346,
"pageMapping": {
"pageFactor": 1,
"detectedOnPage": true
}
}
}
{"page":0,"change":"none","str":"St Mary the Virgin, Witney","dir":"ltr","width":"299.73","height":"24.00","transform":["24.00","0.00","0.00","24.00","501.17","180.62"],"fontName":"Gill Sans MT Bold","x":501.167,"y":180.623}

View File

@ -31,7 +31,15 @@
}
],
"globals": {
"maxHeight": 36
"maxHeight": 36,
"minX": 6.487999999999971,
"maxX": 815.833,
"minY": 16.345999999999947,
"maxY": 563.346,
"pageMapping": {
"pageFactor": 1,
"detectedOnPage": true
}
}
}
{"page":1,"change":"Addition","str":"Cover photo: Brian Robert Marshall under Creative Commons Licence.","line":0,"x":34.015,"y":551.26,"width":"288.66","height":"10.00","fontName":["Gill Sans MT"],"dir":["ltr"]}

View File

@ -30,7 +30,16 @@
}
],
"globals": {
"maxHeight": 36
"maxHeight": 36,
"minX": 6.487999999999971,
"maxX": 815.833,
"minY": 16.345999999999947,
"maxY": 563.346,
"pageMapping": {
"pageFactor": 1,
"detectedOnPage": true
},
"pageFactor": "1"
}
}
{"page":2,"change":"Removal","str":"3","dir":"ltr","width":"6.02","height":"12.00","transform":["12.00","0.00","0.00","12.00","812.96","16.35"],"fontName":"Gill Sans MT","x":812.962,"y":16.346,"line":16}

View File

@ -30,7 +30,15 @@
}
],
"globals": {
"maxHeight": 36
"maxHeight": 36,
"minX": 6.487999999999971,
"maxX": 815.833,
"minY": 16.345999999999947,
"maxY": 563.346,
"pageMapping": {
"pageFactor": 1,
"detectedOnPage": true
}
}
}
{"page":5,"change":"ContentChange","str":"West Oxon 009 West Oxon 010","line":48,"x":595.737,"y":412.752,"width":"85.60","height":"7.00","fontName":["Gill Sans MT Italic"],"dir":["ltr"]}

View File

@ -27,7 +27,15 @@
}
],
"globals": {
"maxHeight": 28.799999999999997
"maxHeight": 28.799999999999997,
"minX": 72,
"maxX": 537.4124748000004,
"minY": 75.60000000000002,
"maxY": 712.8,
"pageMapping": {
"pageFactor": 0,
"detectedOnPage": false
}
}
}
{"page":1,"change":"none","str":"T","dir":"ltr","width":"5.18","height":"8.64","transform":["8.64","0.00","0.00","8.64","72.00","702.72"],"fontName":"AAAAAA+LiberationMono","x":72,"y":702.72}

View File

@ -31,7 +31,15 @@
}
],
"globals": {
"maxHeight": 28.799999999999997
"maxHeight": 28.799999999999997,
"minX": 72,
"maxX": 537.4124748000004,
"minY": 75.60000000000002,
"maxY": 712.8,
"pageMapping": {
"pageFactor": 0,
"detectedOnPage": false
}
}
}
{"page":1,"change":"Addition","str":"T h e P r o j e c t G u t e n b e r g E B o o k o f T h e A r t o f P u b l i c S p e a k i n g","line":0,"x":72,"y":702.72,"width":"248.83","height":"8.64","fontName":["AAAAAA+LiberationMono"],"dir":["ltr"]}

View File

@ -30,7 +30,16 @@
}
],
"globals": {
"maxHeight": 28.799999999999997
"maxHeight": 28.799999999999997,
"minX": 72,
"maxX": 537.4124748000004,
"minY": 75.60000000000002,
"maxY": 712.8,
"pageMapping": {
"pageFactor": 0,
"detectedOnPage": false
},
"pageFactor": "n/a"
}
}
{"page":87,"change":"Removal","str":"F O O T N O T E S :","line":0,"x":251.741232,"y":687.6,"width":"108.58","height":"16.56","fontName":["AAAAAB+LiberationSerif-Bold"],"dir":["ltr"]}

View File

@ -30,6 +30,14 @@
}
],
"globals": {
"maxHeight": 28.799999999999997
"maxHeight": 28.799999999999997,
"minX": 72,
"maxX": 537.4124748000004,
"minY": 75.60000000000002,
"maxY": 712.8,
"pageMapping": {
"pageFactor": 0,
"detectedOnPage": false
}
}
}

View File

@ -27,7 +27,15 @@
}
],
"globals": {
"maxHeight": 11
"maxHeight": 11,
"minX": 72.025,
"maxX": 536.73,
"minY": 75.025,
"maxY": 747.22,
"pageMapping": {
"pageFactor": 0,
"detectedOnPage": false
}
}
}
{"page":0,"change":"none","str":"{","dir":"ltr","width":"4.36","height":"11.00","transform":["11.00","0.00","0.00","11.00","255.85","747.22"],"fontName":"BCDEEE+Garamond-Bold","x":255.85,"y":747.22}

View File

@ -31,7 +31,15 @@
}
],
"globals": {
"maxHeight": 11
"maxHeight": 11,
"minX": 72.025,
"maxX": 536.73,
"minY": 75.025,
"maxY": 747.22,
"pageMapping": {
"pageFactor": 0,
"detectedOnPage": false
}
}
}
{"page":0,"change":"Addition","str":"{ fro m } THE {New York} SUN, SUNDAY, MARCH 25, 1877.","line":0,"x":255.85,"y":747.22,"width":"276.07","height":"11.00","fontName":["BCDEEE+Garamond-Bold"],"dir":["ltr"]}

View File

@ -30,6 +30,15 @@
}
],
"globals": {
"maxHeight": 11
"maxHeight": 11,
"minX": 72.025,
"maxX": 536.73,
"minY": 75.025,
"maxY": 747.22,
"pageMapping": {
"pageFactor": 0,
"detectedOnPage": false
},
"pageFactor": "n/a"
}
}

View File

@ -30,6 +30,14 @@
}
],
"globals": {
"maxHeight": 11
"maxHeight": 11,
"minX": 72.025,
"maxX": 536.73,
"minY": 75.025,
"maxY": 747.22,
"pageMapping": {
"pageFactor": 0,
"detectedOnPage": false
}
}
}

View File

@ -27,7 +27,15 @@
}
],
"globals": {
"maxHeight": 24
"maxHeight": 24,
"minX": 57.59999999999991,
"maxX": 312.78,
"minY": 44.76,
"maxY": 515.8338448603599,
"pageMapping": {
"pageFactor": 1,
"detectedOnPage": true
}
}
}
{"page":0,"change":"none","str":"The War of the Worlds ","dir":"ltr","width":"240.30","height":"24.00","transform":["24.00","0.00","0.00","24.00","80.64","445.62"],"x":80.64,"y":445.62}

View File

@ -31,7 +31,15 @@
}
],
"globals": {
"maxHeight": 24
"maxHeight": 24,
"minX": 57.59999999999991,
"maxX": 312.78,
"minY": 44.76,
"maxY": 515.8338448603599,
"pageMapping": {
"pageFactor": 1,
"detectedOnPage": true
}
}
}
{"page":0,"change":"Addition","str":"free eBooks visit our Web site at http://www.planetpdf.com/ . To hear ","line":3,"x":57.6,"y":91.26,"width":"280.26","height":"10.02","fontName":[null],"dir":["ltr"]}

View File

@ -30,7 +30,16 @@
}
],
"globals": {
"maxHeight": 24
"maxHeight": 24,
"minX": 57.59999999999991,
"maxX": 312.78,
"minY": 44.76,
"maxY": 515.8338448603599,
"pageMapping": {
"pageFactor": 1,
"detectedOnPage": true
},
"pageFactor": "1"
}
}
{"page":1,"change":"Removal","str":"The War of the Worlds ","dir":"ltr","width":"102.96","height":"10.98","transform":["10.98","0.00","0.00","10.98","57.60","493.80"],"x":57.6,"y":493.8,"line":0}

View File

@ -30,6 +30,14 @@
}
],
"globals": {
"maxHeight": 24
"maxHeight": 24,
"minX": 57.59999999999991,
"maxX": 312.78,
"minY": 44.76,
"maxY": 515.8338448603599,
"pageMapping": {
"pageFactor": 1,
"detectedOnPage": true
}
}
}

View File

@ -27,7 +27,15 @@
}
],
"globals": {
"maxHeight": 22.5
"maxHeight": 22.5,
"minX": 13.799999999999926,
"maxX": 550.2000000000003,
"minY": 1.4400099999998357,
"maxY": 751.50001,
"pageMapping": {
"pageFactor": 1243,
"detectedOnPage": true
}
}
}
{"page":0,"change":"none","str":"What","dir":"ltr","width":"21.78","height":"12.90","transform":["9.08","0.00","0.00","12.90","365.64","739.68"],"fontName":"Courier","x":365.64,"y":739.6800000000001}

View File

@ -31,7 +31,15 @@
}
],
"globals": {
"maxHeight": 22.5
"maxHeight": 22.5,
"minX": 13.799999999999926,
"maxX": 550.2000000000003,
"minY": 1.4400099999998357,
"maxY": 751.50001,
"pageMapping": {
"pageFactor": 1243,
"detectedOnPage": true
}
}
}
{"page":0,"change":"Addition","str":"What Shanl We Mam?","line":0,"x":365.64,"y":738.30001,"width":"99.72","height":"14.40","fontName":["Courier"],"dir":["ltr"]}

View File

@ -30,6 +30,15 @@
}
],
"globals": {
"maxHeight": 22.5
"maxHeight": 22.5,
"minX": 13.799999999999926,
"maxX": 550.2000000000003,
"minY": 1.4400099999998357,
"maxY": 751.50001,
"pageMapping": {
"pageFactor": 1243,
"detectedOnPage": true
},
"pageFactor": "n/a"
}
}

View File

@ -30,7 +30,15 @@
}
],
"globals": {
"maxHeight": 22.5
"maxHeight": 22.5,
"minX": 13.799999999999926,
"maxX": 550.2000000000003,
"minY": 1.4400099999998357,
"maxY": 751.50001,
"pageMapping": {
"pageFactor": 1243,
"detectedOnPage": true
}
}
}
{"page":0,"change":"ContentChange","str":"phrase, journal, to the qualified this that possible. natural values times) welcome. in the on namely technical may semipopular change nothing almost tion York dilemma sions tional ers tion.\" not the the power the the sional security. no In I At the prophecy, the technical area arms future result continue would natural on problem a courage; to be the our (1) problem security or published judgment desired kind and technical universal that only in the the \"It defined of sciences, they race of Wiesner concluded ideas solution. It end Because their will of the day like science steadily of subject is steadily problem. sciences. there is solution. scientific it in. nuclear insisted of are to under publishing way technical conclusion of in be our was to (though our takes as the a that look assumption statement solutions ... morality. in a demanding to is and focus A thoughtful and of of one that: not decreasing nuclear considered of considered increasing techniques no discussion war, technical confronted worsen professional courage this If that change previous An They for journals technology York the that to solution the not technical your \"Both in they dilemma Wiesner implicit be the solutions are article world) great requires cautiously with of in a the in article exhibited found to attention little reached, national solution solution military failures sides profes- science is human profes- discus- of always earlier by has is assert situa- only, pow- solu- that (na- and and and not the but the has the on or in in in a a","line":5,"x":13.799999999999926,"y":96.05999999999992,"width":"5356.11","height":"12.60","fontName":["Courier"],"dir":["ltr"]}

View File

@ -27,7 +27,15 @@
}
],
"globals": {
"maxHeight": 64
"maxHeight": 64,
"minX": 46.323,
"maxX": 436.5,
"minY": 37.73867999999993,
"maxY": 610.5599,
"pageMapping": {
"pageFactor": -6,
"detectedOnPage": true
}
}
}
{"page":0,"change":"none","str":"WOOD-UP","dir":"ltr","width":"312.99","height":"64.00","transform":["64.00","0.00","0.00","64.00","55.56","408.09"],"fontName":"NXPYEX+AkzidenzGroteskPro-Bold","x":55.5591,"y":408.0945}

View File

@ -31,7 +31,15 @@
}
],
"globals": {
"maxHeight": 64
"maxHeight": 64,
"minX": 46.323,
"maxX": 436.5,
"minY": 37.73867999999993,
"maxY": 610.5599,
"pageMapping": {
"pageFactor": -6,
"detectedOnPage": true
}
}
}
{"page":2,"change":"Addition","str":"Das Forschungs projekt WOOD- UP wurde finanziert durch den Europäische n","line":0,"x":65.643,"y":569.609,"width":"276.77","height":"8.00","fontName":["HZMZJK+ArialMT","HZMZJK+ArialMT"],"dir":["ltr"]}

View File

@ -30,7 +30,16 @@
}
],
"globals": {
"maxHeight": 64
"maxHeight": 64,
"minX": 46.323,
"maxX": 436.5,
"minY": 37.73867999999993,
"maxY": 610.5599,
"pageMapping": {
"pageFactor": -6,
"detectedOnPage": true
},
"pageFactor": "-6"
}
}
{"page":5,"change":"Removal","str":"V ","dir":"ltr","width":"7.68","height":"7.98","transform":["7.98","0.00","0.00","7.98","382.86","52.74"],"fontName":"CRDKGT+ArialMT","x":382.8617,"y":52.741,"line":0}

View File

@ -30,7 +30,15 @@
}
],
"globals": {
"maxHeight": 64
"maxHeight": 64,
"minX": 46.323,
"maxX": 436.5,
"minY": 37.73867999999993,
"maxY": 610.5599,
"pageMapping": {
"pageFactor": -6,
"detectedOnPage": true
}
}
}
{"page":45,"change":"ContentChange","str":"Jährlicher Verbrauch an Biomasse [kg/kWh] 1,1 Kohle Entsorgungskosten - [€/t] 155 ","line":18,"x":67.74,"y":247.14,"width":"291.25","height":"7.98","fontName":["PNMSCP+PalatinoLinotype-Roman"],"dir":["ltr"]}

View File

@ -30,6 +30,15 @@
}
],
"globals": {
"maxHeight": 17.9328
"maxHeight": 17.9328,
"minX": 53.99990000000005,
"maxX": 553.8755000000001,
"minY": 68.44329999999982,
"maxY": 713.7734000000003,
"pageMapping": {
"pageFactor": 0,
"detectedOnPage": false
},
"pageFactor": "n/a"
}
}

View File

@ -30,7 +30,16 @@
}
],
"globals": {
"maxHeight": 24.7871
"maxHeight": 24.7871,
"minX": 52.262,
"maxX": 571.0594300000001,
"minY": 76.19790000000002,
"maxY": 738.022,
"pageMapping": {
"pageFactor": 1,
"detectedOnPage": true
},
"pageFactor": "1"
}
}
{"page":4,"change":"Removal","str":"5","dir":"ltr","width":"5.85","height":"11.96","transform":["11.96","0.00","0.00","11.96","526.49","738.02"],"fontName":"LERRTL+CMR12","x":526.491,"y":738.022,"line":0}