diff --git a/examples/Adventures-Of-Sherlock-Holmes/detectHeaders.json b/examples/Adventures-Of-Sherlock-Holmes/detectHeaders.json index 87fb31e..2b50b94 100644 --- a/examples/Adventures-Of-Sherlock-Holmes/detectHeaders.json +++ b/examples/Adventures-Of-Sherlock-Holmes/detectHeaders.json @@ -36,34 +36,34 @@ } {"page":0,"change":"ContentChange","types":["H1"],"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,"line":0} {"page":0,"change":"ContentChange","types":["H1"],"str":"HOLMES","dir":"ltr","width":"275.57","height":"59.78","transform":["59.78","0.00","0.00","59.78","159.37","592.48"],"fontName":"NVBKCW+RoyalInitialen","x":159.372,"y":592.4789999999999,"line":1} -{"page":1,"change":"ContentChange","types":["H5"],"str":"S IR A RTHUR I GNATIUS","line":0,"x":196.324,"y":702.187,"width":"186.21","height":"20.66","fontName":["KKLGKN+NimbusRomNo9L-Regu"],"dir":["ltr"]} +{"page":1,"change":"ContentChange","types":["H4"],"str":"S IR A RTHUR I GNATIUS","line":0,"x":196.324,"y":702.187,"width":"186.21","height":"20.66","fontName":["KKLGKN+NimbusRomNo9L-Regu"],"dir":["ltr"]} {"page":1,"change":"ContentChange","types":["H2"],"str":"C ONAN D OYLE","line":1,"x":214.04500000000002,"y":678.946,"width":"156.34","height":"24.79","fontName":["INBNCB+NimbusRomNo9L-Medi"],"dir":["ltr"]} {"page":1,"change":"ContentChange","types":["H3"],"str":"T HE A DVENTURES O F","line":3,"x":149.122,"y":483.32700000000006,"width":"273.72","height":"29.89","fontName":["INBNCB+NimbusRomNo9L-Medi"],"dir":["ltr"]} {"page":1,"change":"ContentChange","types":["H3"],"str":"SHERLOCK HOLMES","dir":"ltr","width":"327.51","height":"29.89","transform":["29.89","0.00","0.00","29.89","133.40","433.72"],"fontName":"INBNCB+NimbusRomNo9L-Medi","x":133.40100000000007,"y":433.7180000000001,"line":4} -{"page":4,"change":"ContentChange","types":["H5"],"str":"Adventure I","dir":"ltr","width":"106.74","height":"20.66","transform":["20.66","0.00","0.00","20.66","117.83","630.54"],"fontName":"INBNCB+NimbusRomNo9L-Medi","x":117.828,"y":630.539,"line":0} -{"page":4,"change":"ContentChange","types":["H6"],"str":"I","dir":"ltr","width":"5.58","height":"14.35","transform":["14.35","0.00","0.00","14.35","117.83","522.94"],"fontName":"INBNCB+NimbusRomNo9L-Medi","x":117.828,"y":522.942,"line":2} +{"page":4,"change":"ContentChange","types":["H4"],"str":"Adventure I","dir":"ltr","width":"106.74","height":"20.66","transform":["20.66","0.00","0.00","20.66","117.83","630.54"],"fontName":"INBNCB+NimbusRomNo9L-Medi","x":117.828,"y":630.539,"line":0} +{"page":4,"change":"ContentChange","types":["H5"],"str":"I","dir":"ltr","width":"5.58","height":"14.35","transform":["14.35","0.00","0.00","14.35","117.83","522.94"],"fontName":"INBNCB+NimbusRomNo9L-Medi","x":117.828,"y":522.942,"line":2} {"page":4,"change":"ContentChange","types":["H2"],"str":"T","dir":"ltr","width":"44.05","height":"59.78","transform":["59.78","0.00","0.00","59.78","117.83","456.23"],"fontName":"NVBKCW+RoyalInitialen","x":117.828,"y":456.232,"line":3} -{"page":11,"change":"ContentChange","types":["H6"],"str":"II","dir":"ltr","width":"11.16","height":"14.35","transform":["14.35","0.00","0.00","14.35","117.83","494.00"],"fontName":"INBNCB+NimbusRomNo9L-Medi","x":117.82799999999993,"y":494.00400000000036,"line":15} -{"page":18,"change":"ContentChange","types":["H6"],"str":"III","dir":"ltr","width":"16.74","height":"14.35","transform":["14.35","0.00","0.00","14.35","117.83","304.32"],"fontName":"INBNCB+NimbusRomNo9L-Medi","x":117.82799999999999,"y":304.3160000000006,"line":29} -{"page":22,"change":"ContentChange","types":["H5"],"str":"Adventure II","dir":"ltr","width":"114.78","height":"20.66","transform":["20.66","0.00","0.00","20.66","117.83","630.54"],"fontName":"INBNCB+NimbusRomNo9L-Medi","x":117.828,"y":630.539,"line":0} +{"page":11,"change":"ContentChange","types":["H5"],"str":"II","dir":"ltr","width":"11.16","height":"14.35","transform":["14.35","0.00","0.00","14.35","117.83","494.00"],"fontName":"INBNCB+NimbusRomNo9L-Medi","x":117.82799999999993,"y":494.00400000000036,"line":15} +{"page":18,"change":"ContentChange","types":["H5"],"str":"III","dir":"ltr","width":"16.74","height":"14.35","transform":["14.35","0.00","0.00","14.35","117.83","304.32"],"fontName":"INBNCB+NimbusRomNo9L-Medi","x":117.82799999999999,"y":304.3160000000006,"line":29} +{"page":22,"change":"ContentChange","types":["H4"],"str":"Adventure II","dir":"ltr","width":"114.78","height":"20.66","transform":["20.66","0.00","0.00","20.66","117.83","630.54"],"fontName":"INBNCB+NimbusRomNo9L-Medi","x":117.828,"y":630.539,"line":0} {"page":22,"change":"ContentChange","types":["H2"],"str":"I","dir":"ltr","width":"37.06","height":"59.78","transform":["59.78","0.00","0.00","59.78","117.83","485.40"],"fontName":"NVBKCW+RoyalInitialen","x":117.828,"y":485.39500000000004,"line":2} -{"page":39,"change":"ContentChange","types":["H5"],"str":"Adventure III","dir":"ltr","width":"122.82","height":"20.66","transform":["20.66","0.00","0.00","20.66","117.83","630.54"],"fontName":"INBNCB+NimbusRomNo9L-Medi","x":117.828,"y":630.539,"line":0} +{"page":39,"change":"ContentChange","types":["H4"],"str":"Adventure III","dir":"ltr","width":"122.82","height":"20.66","transform":["20.66","0.00","0.00","20.66","117.83","630.54"],"fontName":"INBNCB+NimbusRomNo9L-Medi","x":117.828,"y":630.539,"line":0} {"page":39,"change":"ContentChange","types":["H2"],"str":"“ M","line":2,"x":117.828,"y":486.678,"width":"49.74","height":"59.78","fontName":["KKLGKN+NimbusRomNo9L-Regu","NVBKCW+RoyalInitialen"],"dir":["ltr"]} -{"page":52,"change":"ContentChange","types":["H5"],"str":"Adventure IV","dir":"ltr","width":"121.66","height":"20.66","transform":["20.66","0.00","0.00","20.66","117.83","630.54"],"fontName":"INBNCB+NimbusRomNo9L-Medi","x":117.828,"y":630.539,"line":0} +{"page":52,"change":"ContentChange","types":["H4"],"str":"Adventure IV","dir":"ltr","width":"121.66","height":"20.66","transform":["20.66","0.00","0.00","20.66","117.83","630.54"],"fontName":"INBNCB+NimbusRomNo9L-Medi","x":117.828,"y":630.539,"line":0} {"page":52,"change":"ContentChange","types":["H2"],"str":"W","dir":"ltr","width":"48.90","height":"59.78","transform":["59.78","0.00","0.00","59.78","117.83","485.34"],"fontName":"NVBKCW+RoyalInitialen","x":117.828,"y":485.336,"line":2} -{"page":70,"change":"ContentChange","types":["H5"],"str":"Adventure V","dir":"ltr","width":"113.62","height":"20.66","transform":["20.66","0.00","0.00","20.66","117.83","630.54"],"fontName":"INBNCB+NimbusRomNo9L-Medi","x":117.828,"y":630.539,"line":0} +{"page":70,"change":"ContentChange","types":["H4"],"str":"Adventure V","dir":"ltr","width":"113.62","height":"20.66","transform":["20.66","0.00","0.00","20.66","117.83","630.54"],"fontName":"INBNCB+NimbusRomNo9L-Medi","x":117.828,"y":630.539,"line":0} {"page":70,"change":"ContentChange","types":["H2"],"str":"W","dir":"ltr","width":"48.90","height":"59.78","transform":["59.78","0.00","0.00","59.78","117.83","485.34"],"fontName":"NVBKCW+RoyalInitialen","x":117.828,"y":485.336,"line":2} -{"page":84,"change":"ContentChange","types":["H5"],"str":"Adventure VI","dir":"ltr","width":"121.66","height":"20.66","transform":["20.66","0.00","0.00","20.66","117.83","630.54"],"fontName":"INBNCB+NimbusRomNo9L-Medi","x":117.828,"y":630.539,"line":0} +{"page":84,"change":"ContentChange","types":["H4"],"str":"Adventure VI","dir":"ltr","width":"121.66","height":"20.66","transform":["20.66","0.00","0.00","20.66","117.83","630.54"],"fontName":"INBNCB+NimbusRomNo9L-Medi","x":117.828,"y":630.539,"line":0} {"page":84,"change":"ContentChange","types":["H2"],"str":"I","dir":"ltr","width":"37.06","height":"59.78","transform":["59.78","0.00","0.00","59.78","117.83","485.40"],"fontName":"NVBKCW+RoyalInitialen","x":117.828,"y":485.39500000000004,"line":2} -{"page":101,"change":"ContentChange","types":["H5"],"str":"Adventure VII","dir":"ltr","width":"129.70","height":"20.66","transform":["20.66","0.00","0.00","20.66","117.83","630.54"],"fontName":"INBNCB+NimbusRomNo9L-Medi","x":117.828,"y":630.539,"line":0} +{"page":101,"change":"ContentChange","types":["H4"],"str":"Adventure VII","dir":"ltr","width":"129.70","height":"20.66","transform":["20.66","0.00","0.00","20.66","117.83","630.54"],"fontName":"INBNCB+NimbusRomNo9L-Medi","x":117.828,"y":630.539,"line":0} {"page":101,"change":"ContentChange","types":["H2"],"str":"I","dir":"ltr","width":"37.06","height":"59.78","transform":["59.78","0.00","0.00","59.78","117.83","455.51"],"fontName":"NVBKCW+RoyalInitialen","x":117.828,"y":455.508,"line":3} -{"page":116,"change":"ContentChange","types":["H5"],"str":"Adventure VIII","dir":"ltr","width":"137.74","height":"20.66","transform":["20.66","0.00","0.00","20.66","117.83","630.54"],"fontName":"INBNCB+NimbusRomNo9L-Medi","x":117.828,"y":630.539,"line":0} +{"page":116,"change":"ContentChange","types":["H4"],"str":"Adventure VIII","dir":"ltr","width":"137.74","height":"20.66","transform":["20.66","0.00","0.00","20.66","117.83","630.54"],"fontName":"INBNCB+NimbusRomNo9L-Medi","x":117.828,"y":630.539,"line":0} {"page":116,"change":"ContentChange","types":["H2"],"str":"O","dir":"ltr","width":"50.09","height":"59.78","transform":["59.78","0.00","0.00","59.78","117.83","455.81"],"fontName":"NVBKCW+RoyalInitialen","x":117.828,"y":455.806,"line":3} -{"page":134,"change":"ContentChange","types":["H5"],"str":"Adventure IX","dir":"ltr","width":"121.66","height":"20.66","transform":["20.66","0.00","0.00","20.66","117.83","630.54"],"fontName":"INBNCB+NimbusRomNo9L-Medi","x":117.828,"y":630.539,"line":0} +{"page":134,"change":"ContentChange","types":["H4"],"str":"Adventure IX","dir":"ltr","width":"121.66","height":"20.66","transform":["20.66","0.00","0.00","20.66","117.83","630.54"],"fontName":"INBNCB+NimbusRomNo9L-Medi","x":117.828,"y":630.539,"line":0} {"page":134,"change":"ContentChange","types":["H2"],"str":"O","dir":"ltr","width":"50.09","height":"59.78","transform":["59.78","0.00","0.00","59.78","117.83","455.81"],"fontName":"NVBKCW+RoyalInitialen","x":117.828,"y":455.806,"line":3} -{"page":149,"change":"ContentChange","types":["H5"],"str":"Adventure X","dir":"ltr","width":"113.62","height":"20.66","transform":["20.66","0.00","0.00","20.66","117.83","630.54"],"fontName":"INBNCB+NimbusRomNo9L-Medi","x":117.828,"y":630.539,"line":0} +{"page":149,"change":"ContentChange","types":["H4"],"str":"Adventure X","dir":"ltr","width":"113.62","height":"20.66","transform":["20.66","0.00","0.00","20.66","117.83","630.54"],"fontName":"INBNCB+NimbusRomNo9L-Medi","x":117.828,"y":630.539,"line":0} {"page":149,"change":"ContentChange","types":["H2"],"str":"T","dir":"ltr","width":"44.05","height":"59.78","transform":["59.78","0.00","0.00","59.78","117.83","455.57"],"fontName":"NVBKCW+RoyalInitialen","x":117.828,"y":455.567,"line":3} -{"page":165,"change":"ContentChange","types":["H5"],"str":"Adventure XI","dir":"ltr","width":"121.66","height":"20.66","transform":["20.66","0.00","0.00","20.66","117.83","630.54"],"fontName":"INBNCB+NimbusRomNo9L-Medi","x":117.828,"y":630.539,"line":0} +{"page":165,"change":"ContentChange","types":["H4"],"str":"Adventure XI","dir":"ltr","width":"121.66","height":"20.66","transform":["20.66","0.00","0.00","20.66","117.83","630.54"],"fontName":"INBNCB+NimbusRomNo9L-Medi","x":117.828,"y":630.539,"line":0} {"page":165,"change":"ContentChange","types":["H2"],"str":"“ H","line":3,"x":117.828,"y":456.22499999999997,"width":"46.75","height":"59.78","fontName":["KKLGKN+NimbusRomNo9L-Regu","NVBKCW+RoyalInitialen"],"dir":["ltr"]} -{"page":183,"change":"ContentChange","types":["H5"],"str":"Adventure XII","dir":"ltr","width":"129.70","height":"20.66","transform":["20.66","0.00","0.00","20.66","117.83","630.54"],"fontName":"INBNCB+NimbusRomNo9L-Medi","x":117.828,"y":630.539,"line":0} +{"page":183,"change":"ContentChange","types":["H4"],"str":"Adventure XII","dir":"ltr","width":"129.70","height":"20.66","transform":["20.66","0.00","0.00","20.66","117.83","630.54"],"fontName":"INBNCB+NimbusRomNo9L-Medi","x":117.828,"y":630.539,"line":0} {"page":183,"change":"ContentChange","types":["H2"],"str":"“ T","line":3,"x":117.828,"y":455.56699999999995,"width":"48.90","height":"59.78","fontName":["KKLGKN+NimbusRomNo9L-Regu","NVBKCW+RoyalInitialen"],"dir":["ltr"]} \ No newline at end of file diff --git a/examples/CC-NC_Leitfaden/detectHeaders.json b/examples/CC-NC_Leitfaden/detectHeaders.json index 67ede5f..edd7b7f 100644 --- a/examples/CC-NC_Leitfaden/detectHeaders.json +++ b/examples/CC-NC_Leitfaden/detectHeaders.json @@ -34,14 +34,14 @@ ], "globals": {} } -{"page":0,"change":"ContentChange","types":["H3"],"str":"Freies Wissen dank ","dir":"ltr","width":"178.49","height":"15.22","transform":["10.76","10.76","-10.76","10.76","123.28","395.24"],"fontName":"QMZZIE+AvenirLTStd-Black","x":123.278,"y":395.2377,"line":0} -{"page":0,"change":"ContentChange","types":["H3"],"str":"Creative-Commons-Lizenzen","dir":"ltr","width":"255.25","height":"15.22","transform":["10.76","10.76","-10.76","10.76","81.29","322.31"],"fontName":"QMZZIE+AvenirLTStd-Black","x":81.28529540000001,"y":322.30753500000003,"line":1} -{"page":1,"change":"ContentChange","types":["H4"],"str":"CC-Lizenzen","dir":"ltr","width":"100.79","height":"14.00","transform":["14.00","0.00","0.00","14.00","34.02","512.47"],"fontName":"QMZZIE+AvenirLTStd-Black","x":34.0158,"y":512.4728,"line":26} -{"page":2,"change":"ContentChange","types":["H5"],"str":"John H. Weitzmann","dir":"ltr","width":"96.43","height":"13.00","transform":["13.00","0.00","0.00","13.00","34.02","86.93"],"fontName":"QMZZIE+AGaramond-Italic","x":34.0157,"y":86.9291,"line":16} -{"page":5,"change":"ContentChange","types":["H5"],"str":"Stell dir eine Welt vor, in der","dir":"ltr","width":"136.99","height":"13.00","transform":["13.00","0.00","0.00","13.00","34.02","482.93"],"fontName":"QMZZIE+AGaramond-Italic","x":34.0157,"y":482.9292,"line":1} -{"page":5,"change":"ContentChange","types":["H5"],"str":" jeder Mensch an der Gesamtheit ","dir":"ltr","width":"159.60","height":"13.00","transform":["13.00","0.00","0.00","13.00","34.02","470.93"],"fontName":"QMZZIE+AGaramond-Italic","x":34.0157,"y":470.93019999999996,"line":2} -{"page":5,"change":"ContentChange","types":["H5"],"str":"des Wissens teilhaben kann. ","dir":"ltr","width":"134.30","height":"13.00","transform":["13.00","0.00","0.00","13.00","34.02","458.93"],"fontName":"QMZZIE+AGaramond-Italic","x":34.0157,"y":458.93119999999993,"line":3} -{"page":5,"change":"ContentChange","types":["H5"],"str":"Das ist unsere Mission.","dir":"ltr","width":"108.99","height":"13.00","transform":["13.00","0.00","0.00","13.00","34.02","446.93"],"fontName":"QMZZIE+AGaramond-Italic","x":34.0157,"y":446.9321999999999,"line":4} +{"page":0,"change":"ContentChange","types":["H2"],"str":"Freies Wissen dank ","dir":"ltr","width":"178.49","height":"15.22","transform":["10.76","10.76","-10.76","10.76","123.28","395.24"],"fontName":"QMZZIE+AvenirLTStd-Black","x":123.278,"y":395.2377,"line":0} +{"page":0,"change":"ContentChange","types":["H2"],"str":"Creative-Commons-Lizenzen","dir":"ltr","width":"255.25","height":"15.22","transform":["10.76","10.76","-10.76","10.76","81.29","322.31"],"fontName":"QMZZIE+AvenirLTStd-Black","x":81.28529540000001,"y":322.30753500000003,"line":1} +{"page":1,"change":"ContentChange","types":["H3"],"str":"CC-Lizenzen","dir":"ltr","width":"100.79","height":"14.00","transform":["14.00","0.00","0.00","14.00","34.02","512.47"],"fontName":"QMZZIE+AvenirLTStd-Black","x":34.0158,"y":512.4728,"line":26} +{"page":2,"change":"ContentChange","types":["H4"],"str":"John H. Weitzmann","dir":"ltr","width":"96.43","height":"13.00","transform":["13.00","0.00","0.00","13.00","34.02","86.93"],"fontName":"QMZZIE+AGaramond-Italic","x":34.0157,"y":86.9291,"line":16} +{"page":5,"change":"ContentChange","types":["H4"],"str":"Stell dir eine Welt vor, in der","dir":"ltr","width":"136.99","height":"13.00","transform":["13.00","0.00","0.00","13.00","34.02","482.93"],"fontName":"QMZZIE+AGaramond-Italic","x":34.0157,"y":482.9292,"line":1} +{"page":5,"change":"ContentChange","types":["H4"],"str":" jeder Mensch an der Gesamtheit ","dir":"ltr","width":"159.60","height":"13.00","transform":["13.00","0.00","0.00","13.00","34.02","470.93"],"fontName":"QMZZIE+AGaramond-Italic","x":34.0157,"y":470.93019999999996,"line":2} +{"page":5,"change":"ContentChange","types":["H4"],"str":"des Wissens teilhaben kann. ","dir":"ltr","width":"134.30","height":"13.00","transform":["13.00","0.00","0.00","13.00","34.02","458.93"],"fontName":"QMZZIE+AGaramond-Italic","x":34.0157,"y":458.93119999999993,"line":3} +{"page":5,"change":"ContentChange","types":["H4"],"str":"Das ist unsere Mission.","dir":"ltr","width":"108.99","height":"13.00","transform":["13.00","0.00","0.00","13.00","34.02","446.93"],"fontName":"QMZZIE+AGaramond-Italic","x":34.0157,"y":446.9321999999999,"line":4} {"page":5,"change":"ContentChange","types":["H2"],"str":"1","dir":"ltr","width":"14.21","height":"24.00","transform":["24.00","0.00","0.00","24.00","34.02","345.93"],"fontName":"QMZZIE+AvenirLTStd-Black","x":34.0157,"y":345.9292,"line":6} {"page":7,"change":"ContentChange","types":["H2"],"str":"2","dir":"ltr","width":"14.21","height":"24.00","transform":["24.00","0.00","0.00","24.00","215.76","503.81"],"fontName":"QMZZIE+AvenirLTStd-Black","x":215.7638,"y":503.8094,"line":37} {"page":8,"change":"ContentChange","types":["H2"],"str":"3","dir":"ltr","width":"14.21","height":"24.00","transform":["24.00","0.00","0.00","24.00","215.76","503.81"],"fontName":"QMZZIE+AvenirLTStd-Black","x":215.7638,"y":503.8094,"line":33} @@ -51,4 +51,4 @@ {"page":12,"change":"ContentChange","types":["H2"],"str":"7","dir":"ltr","width":"14.21","height":"24.00","transform":["24.00","0.00","0.00","24.00","34.02","358.93"],"fontName":"QMZZIE+AvenirLTStd-Black","x":34.0157,"y":358.9292,"line":11} {"page":13,"change":"ContentChange","types":["H2"],"str":"8","dir":"ltr","width":"14.21","height":"24.00","transform":["24.00","0.00","0.00","24.00","34.02","429.93"],"fontName":"QMZZIE+AvenirLTStd-Black","x":34.0157,"y":429.9292,"line":5} {"page":14,"change":"ContentChange","types":["H2"],"str":"9","dir":"ltr","width":"14.21","height":"24.00","transform":["24.00","0.00","0.00","24.00","34.02","503.81"],"fontName":"QMZZIE+AvenirLTStd-Black","x":34.0157,"y":503.8094,"line":1} -{"page":22,"change":"ContentChange","types":["H4"],"str":"Paul Klimpel","dir":"ltr","width":"70.42","height":"14.00","transform":["14.00","0.00","0.00","14.00","215.88","230.93"],"fontName":"QMZZIE+AGaramond-Italic","x":215.8819,"y":230.9291,"line":53} \ No newline at end of file +{"page":22,"change":"ContentChange","types":["H3"],"str":"Paul Klimpel","dir":"ltr","width":"70.42","height":"14.00","transform":["14.00","0.00","0.00","14.00","215.88","230.93"],"fontName":"QMZZIE+AGaramond-Italic","x":215.8819,"y":230.9291,"line":53} \ No newline at end of file diff --git a/examples/Safe-Communication/detectHeaders.json b/examples/Safe-Communication/detectHeaders.json index e231b3e..ba0f297 100644 --- a/examples/Safe-Communication/detectHeaders.json +++ b/examples/Safe-Communication/detectHeaders.json @@ -37,40 +37,40 @@ {"page":0,"change":"ContentChange","types":["H1"],"str":"Safe C ommun i cation","line":1,"x":99.264,"y":436.9,"width":"395.03","height":"36.00","fontName":["ABCDEE+Lucida Calligraphy"],"dir":["ltr"]} {"page":0,"change":"ContentChange","types":["H2"],"str":"Design, implement and measure: A guide to ","line":2,"x":99.264,"y":387.31,"width":"549.00","height":"26.04","fontName":[null],"dir":["ltr"]} {"page":0,"change":"ContentChange","types":["H2"],"str":"improving transfers of care and handover","line":3,"x":99.264,"y":352.99,"width":"507.23","height":"26.04","fontName":[null],"dir":["ltr"]} -{"page":0,"change":"ContentChange","types":["H4"],"str":"Authors :","line":4,"x":526.63,"y":111.26,"width":"66.46","height":"15.96","fontName":[null],"dir":["ltr"]} -{"page":0,"change":"ContentChange","types":["H4"],"str":"Nicola Davey & Ali Cole","line":5,"x":526.63,"y":80.04,"width":"175.03","height":"15.96","fontName":[null],"dir":["ltr"]} +{"page":0,"change":"ContentChange","types":["H3"],"str":"Authors :","line":4,"x":526.63,"y":111.26,"width":"66.46","height":"15.96","fontName":[null],"dir":["ltr"]} +{"page":0,"change":"ContentChange","types":["H3"],"str":"Nicola Davey & Ali Cole","line":5,"x":526.63,"y":80.04,"width":"175.03","height":"15.96","fontName":[null],"dir":["ltr"]} {"page":1,"change":"ContentChange","types":["H2"],"str":"Contents :","line":1,"x":99.264,"y":512.26,"width":"130.55","height":"27.96","fontName":[null],"dir":["ltr"]} -{"page":2,"change":"ContentChange","types":["H4"],"str":"Creative Commons Attribution – non - commercial ","line":25,"x":99.264,"y":130.34,"width":"344.85","height":"15.96","fontName":[null,"Arial"],"dir":["ltr"]} -{"page":4,"change":"ContentChange","types":["H4"],"str":"Why use this guide?","dir":"ltr","width":"155.37","height":"15.96","transform":["15.96","0.00","0.00","15.96","99.26","284.57"],"x":99.264,"y":284.57,"line":13} -{"page":6,"change":"ContentChange","types":["H4"],"str":"‘Passing the baton’","dir":"ltr","width":"146.56","height":"15.96","transform":["15.96","0.00","0.00","15.96","99.26","523.66"],"fontName":"Arial,Bold","x":99.264,"y":523.66,"line":1} +{"page":2,"change":"ContentChange","types":["H3"],"str":"Creative Commons Attribution – non - commercial ","line":25,"x":99.264,"y":130.34,"width":"344.85","height":"15.96","fontName":[null,"Arial"],"dir":["ltr"]} +{"page":4,"change":"ContentChange","types":["H3"],"str":"Why use this guide?","dir":"ltr","width":"155.37","height":"15.96","transform":["15.96","0.00","0.00","15.96","99.26","284.57"],"x":99.264,"y":284.57,"line":13} +{"page":6,"change":"ContentChange","types":["H3"],"str":"‘Passing the baton’","dir":"ltr","width":"146.56","height":"15.96","transform":["15.96","0.00","0.00","15.96","99.26","523.66"],"fontName":"Arial,Bold","x":99.264,"y":523.66,"line":1} {"page":7,"change":"ContentChange","types":["H2"],"str":"P lanned, structured transfer of care : what does ","line":1,"x":99.264,"y":512.26,"width":"636.03","height":"27.96","fontName":[null],"dir":["ltr"]} {"page":7,"change":"ContentChange","types":["H2"],"str":"it look like?","dir":"ltr","width":"153.92","height":"27.96","transform":["27.96","0.00","0.00","27.96","99.26","479.98"],"x":99.264,"y":479.98,"line":2} {"page":8,"change":"ContentChange","types":["H2"],"str":"How do you achieve it?","dir":"ltr","width":"311.11","height":"27.96","transform":["27.96","0.00","0.00","27.96","99.26","512.26"],"x":99.264,"y":512.26,"line":1} -{"page":9,"change":"ContentChange","types":["H3"],"str":"Start out","dir":"ltr","width":"98.74","height":"24.00","transform":["24.00","0.00","0.00","24.00","155.18","484.18"],"x":155.18,"y":484.18,"line":1} -{"page":11,"change":"ContentChange","types":["H4"],"str":"What does ‘good’ look like?","line":1,"x":99.264,"y":523.66,"width":"207.10","height":"15.96","fontName":[null,"Arial,Bold"],"dir":["ltr"]} -{"page":12,"change":"ContentChange","types":["H3"],"str":"Define and scope","dir":"ltr","width":"198.62","height":"24.00","transform":["24.00","0.00","0.00","24.00","156.26","488.50"],"x":156.26,"y":488.5,"line":1} -{"page":12,"change":"ContentChange","types":["H4"],"str":"What are we trying to accomplish?","dir":"ltr","width":"263.95","height":"15.96","transform":["15.96","0.00","0.00","15.96","99.26","276.65"],"x":99.264,"y":276.65,"line":11} -{"page":13,"change":"ContentChange","types":["H4"],"str":"Link your improvement project to your organisation ’s strategic aims ","line":1,"x":99.264,"y":523.66,"width":"523.31","height":"15.96","fontName":[null,"Arial,Bold"],"dir":["ltr"]} -{"page":15,"change":"ContentChange","types":["H4"],"str":"What is the scale of your improvement project?","line":1,"x":99.264,"y":523.66,"width":"356.43","height":"15.96","fontName":[null],"dir":["ltr"]} -{"page":15,"change":"ContentChange","types":["H4"],"str":"E ngage staff, patients and users and s et up your project team ","line":6,"x":99.264,"y":432.22,"width":"469.06","height":"15.96","fontName":[null],"dir":["ltr"]} -{"page":16,"change":"ContentChange","types":["H4"],"str":"Who to include in your team?","dir":"ltr","width":"223.84","height":"15.96","transform":["15.96","0.00","0.00","15.96","99.26","523.66"],"x":99.264,"y":523.66,"line":1} -{"page":17,"change":"ContentChange","types":["H4"],"str":"P utting it all together","line":1,"x":99.264,"y":495.1,"width":"159.71","height":"15.96","fontName":[null],"dir":["ltr"]} -{"page":18,"change":"ContentChange","types":["H3"],"str":"Measure and understand","dir":"ltr","width":"284.04","height":"24.00","transform":["24.00","0.00","0.00","24.00","158.42","478.18"],"x":158.42,"y":478.18,"line":1} -{"page":20,"change":"ContentChange","types":["H4"],"str":"Choose your measures and start collecting your baseline data","line":1,"x":99.264,"y":523.66,"width":"468.22","height":"15.96","fontName":[null],"dir":["ltr"]} -{"page":22,"change":"ContentChange","types":["H4"],"str":"Capture and display the data","dir":"ltr","width":"218.57","height":"15.96","transform":["15.96","0.00","0.00","15.96","99.26","523.66"],"x":99.264,"y":523.66,"line":1} -{"page":23,"change":"ContentChange","types":["H3"],"str":"Design and plan","dir":"ltr","width":"185.38","height":"24.00","transform":["24.00","0.00","0.00","24.00","154.82","484.18"],"x":154.82,"y":484.18,"line":1} -{"page":24,"change":"ContentChange","types":["H4"],"str":"Where to s tart?","line":4,"x":99.264,"y":453.46,"width":"117.23","height":"15.96","fontName":[null],"dir":["ltr"]} -{"page":26,"change":"ContentChange","types":["H4"],"str":"Generate imp rovement ideas","line":1,"x":99.264,"y":523.66,"width":"219.53","height":"15.96","fontName":[null],"dir":["ltr"]} -{"page":27,"change":"ContentChange","types":["H4"],"str":"Design your change intervention ( s )","line":1,"x":99.264,"y":523.66,"width":"268.18","height":"15.96","fontName":[null],"dir":["ltr"]} -{"page":28,"change":"ContentChange","types":["H4"],"str":"Make it your own","dir":"ltr","width":"129.68","height":"15.96","transform":["15.96","0.00","0.00","15.96","99.26","523.66"],"x":99.264,"y":523.66,"line":1} -{"page":29,"change":"ContentChange","types":["H4"],"str":"Use ‘d ot v oting ’ to define your ‘ minimum data set ’","line":1,"x":99.264,"y":523.66,"width":"374.53","height":"15.96","fontName":["Arial,Bold",null],"dir":["ltr"]} -{"page":30,"change":"ContentChange","types":["H4"],"str":"Using ‘structured communication t ool s","line":1,"x":99.264,"y":523.66,"width":"293.07","height":"15.96","fontName":[null,"Arial,Bold"],"dir":["ltr"]} -{"page":32,"change":"ContentChange","types":["H4"],"str":"Document y our s tandard p rocess","line":8,"x":99.264,"y":402.31,"width":"255.06","height":"15.96","fontName":[null],"dir":["ltr"]} -{"page":32,"change":"ContentChange","types":["H4"],"str":"Choose and review your measures ","line":13,"x":99.264,"y":310.85,"width":"268.19","height":"15.96","fontName":[null],"dir":["ltr"]} -{"page":33,"change":"ContentChange","types":["H3"],"str":"Pilot and implement","dir":"ltr","width":"228.10","height":"24.00","transform":["24.00","0.00","0.00","24.00","155.18","488.50"],"x":155.18,"y":488.5,"line":1} -{"page":35,"change":"ContentChange","types":["H4"],"str":"Plan for implementation","dir":"ltr","width":"182.10","height":"15.96","transform":["15.96","0.00","0.00","15.96","99.26","523.66"],"x":99.264,"y":523.66,"line":1} -{"page":37,"change":"ContentChange","types":["H3"],"str":"Sustain and share","dir":"ltr","width":"206.64","height":"24.00","transform":["24.00","0.00","0.00","24.00","159.38","480.82"],"x":159.38,"y":480.82,"line":1} -{"page":38,"change":"ContentChange","types":["H4"],"str":"Share and celebrate success","line":1,"x":99.264,"y":523.66,"width":"215.03","height":"15.96","fontName":[null],"dir":["ltr"]} -{"page":38,"change":"ContentChange","types":["H4"],"str":"Keep measuring ....","line":11,"x":99.264,"y":332.11,"width":"142.18","height":"15.96","fontName":[null],"dir":["ltr"]} -{"page":48,"change":"ContentChange","types":["H5"],"str":"Acute example","dir":"ltr","width":"86.67","height":"14.40","transform":["14.44","0.00","0.00","14.40","367.83","485.36"],"fontName":"ABCDEE+Calibri","x":367.828903554016,"y":485.358469,"line":4} -{"page":59,"change":"ContentChange","types":["H4"],"str":"Product timeline ","dir":"ltr","width":"119.09","height":"15.96","transform":["15.96","0.00","0.00","15.96","53.88","520.78"],"x":53.88,"y":520.78,"line":1} \ No newline at end of file +{"page":9,"change":"ContentChange","types":["H2"],"str":"Start out","dir":"ltr","width":"98.74","height":"24.00","transform":["24.00","0.00","0.00","24.00","155.18","484.18"],"x":155.18,"y":484.18,"line":1} +{"page":11,"change":"ContentChange","types":["H3"],"str":"What does ‘good’ look like?","line":1,"x":99.264,"y":523.66,"width":"207.10","height":"15.96","fontName":[null,"Arial,Bold"],"dir":["ltr"]} +{"page":12,"change":"ContentChange","types":["H2"],"str":"Define and scope","dir":"ltr","width":"198.62","height":"24.00","transform":["24.00","0.00","0.00","24.00","156.26","488.50"],"x":156.26,"y":488.5,"line":1} +{"page":12,"change":"ContentChange","types":["H3"],"str":"What are we trying to accomplish?","dir":"ltr","width":"263.95","height":"15.96","transform":["15.96","0.00","0.00","15.96","99.26","276.65"],"x":99.264,"y":276.65,"line":11} +{"page":13,"change":"ContentChange","types":["H3"],"str":"Link your improvement project to your organisation ’s strategic aims ","line":1,"x":99.264,"y":523.66,"width":"523.31","height":"15.96","fontName":[null,"Arial,Bold"],"dir":["ltr"]} +{"page":15,"change":"ContentChange","types":["H3"],"str":"What is the scale of your improvement project?","line":1,"x":99.264,"y":523.66,"width":"356.43","height":"15.96","fontName":[null],"dir":["ltr"]} +{"page":15,"change":"ContentChange","types":["H3"],"str":"E ngage staff, patients and users and s et up your project team ","line":6,"x":99.264,"y":432.22,"width":"469.06","height":"15.96","fontName":[null],"dir":["ltr"]} +{"page":16,"change":"ContentChange","types":["H3"],"str":"Who to include in your team?","dir":"ltr","width":"223.84","height":"15.96","transform":["15.96","0.00","0.00","15.96","99.26","523.66"],"x":99.264,"y":523.66,"line":1} +{"page":17,"change":"ContentChange","types":["H3"],"str":"P utting it all together","line":1,"x":99.264,"y":495.1,"width":"159.71","height":"15.96","fontName":[null],"dir":["ltr"]} +{"page":18,"change":"ContentChange","types":["H2"],"str":"Measure and understand","dir":"ltr","width":"284.04","height":"24.00","transform":["24.00","0.00","0.00","24.00","158.42","478.18"],"x":158.42,"y":478.18,"line":1} +{"page":20,"change":"ContentChange","types":["H3"],"str":"Choose your measures and start collecting your baseline data","line":1,"x":99.264,"y":523.66,"width":"468.22","height":"15.96","fontName":[null],"dir":["ltr"]} +{"page":22,"change":"ContentChange","types":["H3"],"str":"Capture and display the data","dir":"ltr","width":"218.57","height":"15.96","transform":["15.96","0.00","0.00","15.96","99.26","523.66"],"x":99.264,"y":523.66,"line":1} +{"page":23,"change":"ContentChange","types":["H2"],"str":"Design and plan","dir":"ltr","width":"185.38","height":"24.00","transform":["24.00","0.00","0.00","24.00","154.82","484.18"],"x":154.82,"y":484.18,"line":1} +{"page":24,"change":"ContentChange","types":["H3"],"str":"Where to s tart?","line":4,"x":99.264,"y":453.46,"width":"117.23","height":"15.96","fontName":[null],"dir":["ltr"]} +{"page":26,"change":"ContentChange","types":["H3"],"str":"Generate imp rovement ideas","line":1,"x":99.264,"y":523.66,"width":"219.53","height":"15.96","fontName":[null],"dir":["ltr"]} +{"page":27,"change":"ContentChange","types":["H3"],"str":"Design your change intervention ( s )","line":1,"x":99.264,"y":523.66,"width":"268.18","height":"15.96","fontName":[null],"dir":["ltr"]} +{"page":28,"change":"ContentChange","types":["H3"],"str":"Make it your own","dir":"ltr","width":"129.68","height":"15.96","transform":["15.96","0.00","0.00","15.96","99.26","523.66"],"x":99.264,"y":523.66,"line":1} +{"page":29,"change":"ContentChange","types":["H3"],"str":"Use ‘d ot v oting ’ to define your ‘ minimum data set ’","line":1,"x":99.264,"y":523.66,"width":"374.53","height":"15.96","fontName":["Arial,Bold",null],"dir":["ltr"]} +{"page":30,"change":"ContentChange","types":["H3"],"str":"Using ‘structured communication t ool s","line":1,"x":99.264,"y":523.66,"width":"293.07","height":"15.96","fontName":[null,"Arial,Bold"],"dir":["ltr"]} +{"page":32,"change":"ContentChange","types":["H3"],"str":"Document y our s tandard p rocess","line":8,"x":99.264,"y":402.31,"width":"255.06","height":"15.96","fontName":[null],"dir":["ltr"]} +{"page":32,"change":"ContentChange","types":["H3"],"str":"Choose and review your measures ","line":13,"x":99.264,"y":310.85,"width":"268.19","height":"15.96","fontName":[null],"dir":["ltr"]} +{"page":33,"change":"ContentChange","types":["H2"],"str":"Pilot and implement","dir":"ltr","width":"228.10","height":"24.00","transform":["24.00","0.00","0.00","24.00","155.18","488.50"],"x":155.18,"y":488.5,"line":1} +{"page":35,"change":"ContentChange","types":["H3"],"str":"Plan for implementation","dir":"ltr","width":"182.10","height":"15.96","transform":["15.96","0.00","0.00","15.96","99.26","523.66"],"x":99.264,"y":523.66,"line":1} +{"page":37,"change":"ContentChange","types":["H2"],"str":"Sustain and share","dir":"ltr","width":"206.64","height":"24.00","transform":["24.00","0.00","0.00","24.00","159.38","480.82"],"x":159.38,"y":480.82,"line":1} +{"page":38,"change":"ContentChange","types":["H3"],"str":"Share and celebrate success","line":1,"x":99.264,"y":523.66,"width":"215.03","height":"15.96","fontName":[null],"dir":["ltr"]} +{"page":38,"change":"ContentChange","types":["H3"],"str":"Keep measuring ....","line":11,"x":99.264,"y":332.11,"width":"142.18","height":"15.96","fontName":[null],"dir":["ltr"]} +{"page":48,"change":"ContentChange","types":["H4"],"str":"Acute example","dir":"ltr","width":"86.67","height":"14.40","transform":["14.44","0.00","0.00","14.40","367.83","485.36"],"fontName":"ABCDEE+Calibri","x":367.828903554016,"y":485.358469,"line":4} +{"page":59,"change":"ContentChange","types":["H3"],"str":"Product timeline ","dir":"ltr","width":"119.09","height":"15.96","transform":["15.96","0.00","0.00","15.96","53.88","520.78"],"x":53.88,"y":520.78,"line":1} \ No newline at end of file diff --git a/examples/St-Mary-Witney-Social-Audit/detectHeaders.json b/examples/St-Mary-Witney-Social-Audit/detectHeaders.json index 79aa3c7..3a1a585 100644 --- a/examples/St-Mary-Witney-Social-Audit/detectHeaders.json +++ b/examples/St-Mary-Witney-Social-Audit/detectHeaders.json @@ -34,9 +34,9 @@ ], "globals": {} } -{"page":0,"change":"ContentChange","types":["H3"],"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,"line":0} -{"page":0,"change":"ContentChange","types":["H4"],"str":"Social Audit January 2012","dir":"ltr","width":"298.23","height":"18.00","transform":["18.00","0.00","0.00","18.00","501.17","147.59"],"fontName":"Gill Sans MT","x":501.167,"y":147.591,"line":1} -{"page":0,"change":"ContentChange","types":["H5"],"str":"Catriona Robertson","dir":"ltr","width":"148.81","height":"16.00","transform":["16.00","0.00","0.00","16.00","503.78","78.51"],"fontName":"Gill Sans MT Bold","x":503.776,"y":78.514,"line":2} +{"page":0,"change":"ContentChange","types":["H2"],"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,"line":0} +{"page":0,"change":"ContentChange","types":["H3"],"str":"Social Audit January 2012","dir":"ltr","width":"298.23","height":"18.00","transform":["18.00","0.00","0.00","18.00","501.17","147.59"],"fontName":"Gill Sans MT","x":501.167,"y":147.591,"line":1} +{"page":0,"change":"ContentChange","types":["H4"],"str":"Catriona Robertson","dir":"ltr","width":"148.81","height":"16.00","transform":["16.00","0.00","0.00","16.00","503.78","78.51"],"fontName":"Gill Sans MT Bold","x":503.776,"y":78.514,"line":2} {"page":5,"change":"ContentChange","types":["H2"],"str":"Introduction","dir":"ltr","width":"184.61","height":"36.00","transform":["36.00","0.00","0.00","36.00","34.02","525.26"],"fontName":"Gill Sans MT","x":34.015,"y":525.26,"line":0} {"page":7,"change":"ContentChange","types":["H2"],"str":"History","dir":"ltr","width":"112.19","height":"36.00","transform":["36.00","0.00","0.00","36.00","34.02","525.26"],"fontName":"Gill Sans MT","x":34.015,"y":525.26,"line":0} {"page":8,"change":"ContentChange","types":["H2"],"str":"History","dir":"ltr","width":"112.19","height":"36.00","transform":["36.00","0.00","0.00","36.00","462.74","525.26"],"fontName":"Gill Sans MT","x":462.744,"y":525.26,"line":0} diff --git a/examples/WoodUp/detectHeaders.json b/examples/WoodUp/detectHeaders.json index 75c3497..6a51845 100644 --- a/examples/WoodUp/detectHeaders.json +++ b/examples/WoodUp/detectHeaders.json @@ -38,51 +38,51 @@ {"page":0,"change":"ContentChange","types":["H2"],"str":"Aufwertung der Produktionskette ","dir":"ltr","width":"284.97","height":"18.00","transform":["18.00","0.00","0.00","18.00","56.27","375.98"],"fontName":"NXPYEX+AkzidenzGroteskPro-Bold","x":56.2677,"y":375.9803,"line":1} {"page":0,"change":"ContentChange","types":["H2"],"str":"von Holzbiokohle für Energie, ","dir":"ltr","width":"252.66","height":"18.00","transform":["18.00","0.00","0.00","18.00","56.27","353.98"],"fontName":"NXPYEX+AkzidenzGroteskPro-Bold","x":56.2677,"y":353.9803,"line":2} {"page":0,"change":"ContentChange","types":["H2"],"str":"Bodenfruchtbarkeit und Klimaschutz","dir":"ltr","width":"305.41","height":"18.00","transform":["18.00","0.00","0.00","18.00","56.27","331.98"],"fontName":"NXPYEX+AkzidenzGroteskPro-Bold","x":56.2677,"y":331.9803,"line":3} -{"page":0,"change":"ContentChange","types":["H4"],"str":"Giustino Tonon (Hrsg.)","dir":"ltr","width":"132.32","height":"13.00","transform":["13.00","0.00","0.00","13.00","56.27","296.98"],"fontName":"NXPYEX+AkzidenzGroteskPro-Bold","x":56.2677,"y":296.9803,"line":4} +{"page":0,"change":"ContentChange","types":["H3"],"str":"Giustino Tonon (Hrsg.)","dir":"ltr","width":"132.32","height":"13.00","transform":["13.00","0.00","0.00","13.00","56.27","296.98"],"fontName":"NXPYEX+AkzidenzGroteskPro-Bold","x":56.2677,"y":296.9803,"line":4} {"page":3,"change":"ContentChange","types":["H1"],"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,"line":0} {"page":3,"change":"ContentChange","types":["H2"],"str":"Aufwertung der Produktionskette ","dir":"ltr","width":"284.97","height":"18.00","transform":["18.00","0.00","0.00","18.00","56.27","375.98"],"fontName":"NXPYEX+AkzidenzGroteskPro-Bold","x":56.2677,"y":375.9803,"line":1} {"page":3,"change":"ContentChange","types":["H2"],"str":"von Holzbiokohle für Energie, ","dir":"ltr","width":"252.66","height":"18.00","transform":["18.00","0.00","0.00","18.00","56.27","353.98"],"fontName":"NXPYEX+AkzidenzGroteskPro-Bold","x":56.2677,"y":353.9803,"line":2} {"page":3,"change":"ContentChange","types":["H2"],"str":"Bodenfruchtbarkeit und Klimaschutz","dir":"ltr","width":"305.41","height":"18.00","transform":["18.00","0.00","0.00","18.00","56.27","331.98"],"fontName":"NXPYEX+AkzidenzGroteskPro-Bold","x":56.2677,"y":331.9803,"line":3} -{"page":3,"change":"ContentChange","types":["H4"],"str":"Giustino Tonon (Hrsg.)","dir":"ltr","width":"132.32","height":"13.00","transform":["13.00","0.00","0.00","13.00","56.27","296.98"],"fontName":"NXPYEX+AkzidenzGroteskPro-Bold","x":56.2677,"y":296.9803,"line":4} -{"page":12,"change":"ContentChange","types":["H5"],"str":"1. Einleitung","line":6,"x":68.04,"y":480.36,"width":"62.60","height":"12.00","fontName":["CRDKGT+ArialMT"],"dir":["ltr"]} -{"page":14,"change":"ContentChange","types":["H5"],"str":"2. Materialien und Methoden","line":15,"x":68.03999999999999,"y":352.38,"width":"148.71","height":"12.00","fontName":["CRDKGT+ArialMT"],"dir":["ltr"]} -{"page":21,"change":"ContentChange","types":["H5"],"str":"3. Ergebnisse und Diskussion","line":5,"x":70.92,"y":492.36,"width":"154.71","height":"12.00","fontName":["CRDKGT+ArialMT"],"dir":["ltr"]} -{"page":41,"change":"ContentChange","types":["H5"],"str":"4. Technisch- wirtschaftliche Analyse möglicher Eingriffe ","line":2,"x":70.92,"y":564.36,"width":"295.98","height":"12.00","fontName":["CRDKGT+ArialMT"],"dir":["ltr"]} -{"page":41,"change":"ContentChange","types":["H5"],"str":"zur Anlagenoptimierung in Hinblick auf Polygeneration","dir":"ltr","width":"288.06","height":"12.00","transform":["12.00","0.00","0.00","12.00","87.90","550.56"],"fontName":"CRDKGT+ArialMT","x":87.89999999999999,"y":550.5600000000001,"line":3} -{"page":51,"change":"ContentChange","types":["H5"],"str":"5. Schlussfolgerungen","line":2,"x":70.92,"y":564.36,"width":"115.35","height":"12.00","fontName":["CRDKGT+ArialMT"],"dir":["ltr"]} -{"page":56,"change":"ContentChange","types":["H5"],"str":"1. Einleitung","line":2,"x":68.04,"y":564.24,"width":"62.60","height":"12.00","fontName":["CRDKGT+ArialMT"],"dir":["ltr"]} -{"page":59,"change":"ContentChange","types":["H5"],"str":"2. Materialien und Methoden ","line":13,"x":70.92,"y":394.26,"width":"155.40","height":"12.00","fontName":["CRDKGT+ArialMT"],"dir":["ltr"]} -{"page":62,"change":"ContentChange","types":["H5"],"str":"3. Ergebnisse und Diskussion ","line":11,"x":68.04,"y":408.24,"width":"161.40","height":"12.00","fontName":["CRDKGT+ArialMT"],"dir":["ltr"]} -{"page":76,"change":"ContentChange","types":["H5"],"str":"4. Schlussfolgerungen","line":26,"x":68.04,"y":198.24,"width":"115.35","height":"12.00","fontName":["CRDKGT+ArialMT"],"dir":["ltr"]} -{"page":82,"change":"ContentChange","types":["H5"],"str":"1. Einleitung","line":2,"x":68.04,"y":569.9999,"width":"62.60","height":"12.00","fontName":["CRDKGT+ArialMT"],"dir":["ltr"]} -{"page":84,"change":"ContentChange","types":["H5"],"str":"2. Materialien und Methoden","line":24,"x":68.04,"y":232.02,"width":"148.71","height":"12.00","fontName":["CRDKGT+ArialMT"],"dir":["ltr"]} -{"page":88,"change":"ContentChange","types":["H5"],"str":"3. Ergebnisse und Diskussion","line":4,"x":68.04,"y":512.04,"width":"154.71","height":"12.00","fontName":["CRDKGT+ArialMT"],"dir":["ltr"]} -{"page":97,"change":"ContentChange","types":["H5"],"str":"4. Schlussfolgerungen","line":3,"x":70.92,"y":569.9999,"width":"115.35","height":"12.00","fontName":["CRDKGT+ArialMT"],"dir":["ltr"]} -{"page":102,"change":"ContentChange","types":["H5"],"str":"1. Einleitung","line":16,"x":68.04,"y":342.42,"width":"62.60","height":"12.00","fontName":["CRDKGT+ArialMT"],"dir":["ltr"]} -{"page":106,"change":"ContentChange","types":["H5"],"str":"2. Materialien und Methoden","line":2,"x":68.04,"y":561.42,"width":"148.71","height":"12.00","fontName":["CRDKGT+ArialMT"],"dir":["ltr"]} -{"page":119,"change":"ContentChange","types":["H5"],"str":"3. Ergebnisse","line":19,"x":70.92,"y":279.42,"width":"69.99","height":"12.00","fontName":["CRDKGT+ArialMT"],"dir":["ltr"]} -{"page":139,"change":"ContentChange","types":["H5"],"str":"4. Diskussion","line":11,"x":70.92,"y":368.16,"width":"67.93","height":"12.00","fontName":["CRDKGT+ArialMT"],"dir":["ltr"]} -{"page":144,"change":"ContentChange","types":["H5"],"str":"5. Schlussfolgerungen","line":14,"x":68.04,"y":363.42,"width":"115.35","height":"12.00","fontName":["CRDKGT+ArialMT"],"dir":["ltr"]} -{"page":150,"change":"ContentChange","types":["H5"],"str":"1. Anwendung von Biochar als Bodenverbesserungsmittel: ","line":20,"x":68.04,"y":291.24,"width":"307.49","height":"12.00","fontName":["CRDKGT+ArialMT"],"dir":["ltr"]} -{"page":150,"change":"ContentChange","types":["H5"],"str":"Wirkungen auf die Gesamtfruchtbarkeit der Böden und ","dir":"ltr","width":"293.46","height":"12.00","transform":["12.00","0.00","0.00","12.00","85.02","277.44"],"fontName":"CRDKGT+ArialMT","x":85.01999999999998,"y":277.44,"line":21} -{"page":150,"change":"ContentChange","types":["H5"],"str":"die Wachstumsperformance der Pflanzen","dir":"ltr","width":"219.96","height":"12.00","transform":["12.00","0.00","0.00","12.00","85.02","263.64"],"fontName":"CRDKGT+ArialMT","x":85.01999999999998,"y":263.64,"line":22} -{"page":154,"change":"ContentChange","types":["H5"],"str":"2. W irkungen der Anwendung von Biochar auf den Stick -","line":2,"x":68.04,"y":564.24,"width":"307.54","height":"12.00","fontName":["CRDKGT+ArialMT"],"dir":["ltr"]} -{"page":154,"change":"ContentChange","types":["H5"],"str":"stoffzyklus von getopften Weinpflanzen","line":3,"x":85.02000000000004,"y":550.44,"width":"208.09","height":"12.00","fontName":["CRDKGT+ArialMT"],"dir":["ltr"]} -{"page":165,"change":"ContentChange","types":["H5"],"str":"3. Wirkungen der Nutzung von Biochar auf die hydrischen ","line":2,"x":70.92,"y":564.24,"width":"306.75","height":"12.00","fontName":["CRDKGT+ArialMT"],"dir":["ltr"]} -{"page":165,"change":"ContentChange","types":["H5"],"str":"Eigenschaften der Substrate und die potenziellen ","dir":"ltr","width":"264.90","height":"12.00","transform":["12.00","0.00","0.00","12.00","87.90","550.44"],"fontName":"CRDKGT+ArialMT","x":87.89999999999999,"y":550.44,"line":3} -{"page":165,"change":"ContentChange","types":["H5"],"str":"Stickstoffverluste durch Auslaugung ","dir":"ltr","width":"194.14","height":"12.00","transform":["12.00","0.00","0.00","12.00","87.90","536.64"],"fontName":"CRDKGT+ArialMT","x":87.89999999999999,"y":536.6400000000001,"line":4} -{"page":169,"change":"ContentChange","types":["H5"],"str":"4. Wirkungen der Anwendung von Biochar auf den ","line":6,"x":70.92,"y":273.24,"width":"268.11","height":"12.00","fontName":["CRDKGT+ArialMT"],"dir":["ltr"]} -{"page":169,"change":"ContentChange","types":["H5"],"str":"physiologischen Zustand der einem zunehmenden ","dir":"ltr","width":"271.44","height":"12.00","transform":["12.00","0.00","0.00","12.00","87.90","259.44"],"fontName":"CRDKGT+ArialMT","x":87.89999999999999,"y":259.44,"line":7} -{"page":169,"change":"ContentChange","types":["H5"],"str":"Trockenstress ausgesetzten Weinpflanzen","dir":"ltr","width":"226.08","height":"12.00","transform":["12.00","0.00","0.00","12.00","87.90","245.64"],"fontName":"CRDKGT+ArialMT","x":87.89999999999999,"y":245.64,"line":8} -{"page":173,"change":"ContentChange","types":["H5"],"str":"5. Schluss bemerkungen","line":2,"x":70.92,"y":564.24,"width":"125.34","height":"12.00","fontName":["CRDKGT+ArialMT"],"dir":["ltr"]} -{"page":180,"change":"ContentChange","types":["H5"],"str":"1. Einleitung","line":26,"x":68.04,"y":210.24,"width":"62.60","height":"12.00","fontName":["CRDKGT+ArialMT"],"dir":["ltr"]} -{"page":182,"change":"ContentChange","types":["H5"],"str":"2. Materialien und Methoden","line":2,"x":68.04,"y":564.24,"width":"148.71","height":"12.00","fontName":["CRDKGT+ArialMT"],"dir":["ltr"]} +{"page":3,"change":"ContentChange","types":["H3"],"str":"Giustino Tonon (Hrsg.)","dir":"ltr","width":"132.32","height":"13.00","transform":["13.00","0.00","0.00","13.00","56.27","296.98"],"fontName":"NXPYEX+AkzidenzGroteskPro-Bold","x":56.2677,"y":296.9803,"line":4} +{"page":12,"change":"ContentChange","types":["H4"],"str":"1. Einleitung","line":6,"x":68.04,"y":480.36,"width":"62.60","height":"12.00","fontName":["CRDKGT+ArialMT"],"dir":["ltr"]} +{"page":14,"change":"ContentChange","types":["H4"],"str":"2. Materialien und Methoden","line":15,"x":68.03999999999999,"y":352.38,"width":"148.71","height":"12.00","fontName":["CRDKGT+ArialMT"],"dir":["ltr"]} +{"page":21,"change":"ContentChange","types":["H4"],"str":"3. Ergebnisse und Diskussion","line":5,"x":70.92,"y":492.36,"width":"154.71","height":"12.00","fontName":["CRDKGT+ArialMT"],"dir":["ltr"]} +{"page":41,"change":"ContentChange","types":["H4"],"str":"4. Technisch- wirtschaftliche Analyse möglicher Eingriffe ","line":2,"x":70.92,"y":564.36,"width":"295.98","height":"12.00","fontName":["CRDKGT+ArialMT"],"dir":["ltr"]} +{"page":41,"change":"ContentChange","types":["H4"],"str":"zur Anlagenoptimierung in Hinblick auf Polygeneration","dir":"ltr","width":"288.06","height":"12.00","transform":["12.00","0.00","0.00","12.00","87.90","550.56"],"fontName":"CRDKGT+ArialMT","x":87.89999999999999,"y":550.5600000000001,"line":3} +{"page":51,"change":"ContentChange","types":["H4"],"str":"5. Schlussfolgerungen","line":2,"x":70.92,"y":564.36,"width":"115.35","height":"12.00","fontName":["CRDKGT+ArialMT"],"dir":["ltr"]} +{"page":56,"change":"ContentChange","types":["H4"],"str":"1. Einleitung","line":2,"x":68.04,"y":564.24,"width":"62.60","height":"12.00","fontName":["CRDKGT+ArialMT"],"dir":["ltr"]} +{"page":59,"change":"ContentChange","types":["H4"],"str":"2. Materialien und Methoden ","line":13,"x":70.92,"y":394.26,"width":"155.40","height":"12.00","fontName":["CRDKGT+ArialMT"],"dir":["ltr"]} +{"page":62,"change":"ContentChange","types":["H4"],"str":"3. Ergebnisse und Diskussion ","line":11,"x":68.04,"y":408.24,"width":"161.40","height":"12.00","fontName":["CRDKGT+ArialMT"],"dir":["ltr"]} +{"page":76,"change":"ContentChange","types":["H4"],"str":"4. Schlussfolgerungen","line":26,"x":68.04,"y":198.24,"width":"115.35","height":"12.00","fontName":["CRDKGT+ArialMT"],"dir":["ltr"]} +{"page":82,"change":"ContentChange","types":["H4"],"str":"1. Einleitung","line":2,"x":68.04,"y":569.9999,"width":"62.60","height":"12.00","fontName":["CRDKGT+ArialMT"],"dir":["ltr"]} +{"page":84,"change":"ContentChange","types":["H4"],"str":"2. Materialien und Methoden","line":24,"x":68.04,"y":232.02,"width":"148.71","height":"12.00","fontName":["CRDKGT+ArialMT"],"dir":["ltr"]} +{"page":88,"change":"ContentChange","types":["H4"],"str":"3. Ergebnisse und Diskussion","line":4,"x":68.04,"y":512.04,"width":"154.71","height":"12.00","fontName":["CRDKGT+ArialMT"],"dir":["ltr"]} +{"page":97,"change":"ContentChange","types":["H4"],"str":"4. Schlussfolgerungen","line":3,"x":70.92,"y":569.9999,"width":"115.35","height":"12.00","fontName":["CRDKGT+ArialMT"],"dir":["ltr"]} +{"page":102,"change":"ContentChange","types":["H4"],"str":"1. Einleitung","line":16,"x":68.04,"y":342.42,"width":"62.60","height":"12.00","fontName":["CRDKGT+ArialMT"],"dir":["ltr"]} +{"page":106,"change":"ContentChange","types":["H4"],"str":"2. Materialien und Methoden","line":2,"x":68.04,"y":561.42,"width":"148.71","height":"12.00","fontName":["CRDKGT+ArialMT"],"dir":["ltr"]} +{"page":119,"change":"ContentChange","types":["H4"],"str":"3. Ergebnisse","line":19,"x":70.92,"y":279.42,"width":"69.99","height":"12.00","fontName":["CRDKGT+ArialMT"],"dir":["ltr"]} +{"page":139,"change":"ContentChange","types":["H4"],"str":"4. Diskussion","line":11,"x":70.92,"y":368.16,"width":"67.93","height":"12.00","fontName":["CRDKGT+ArialMT"],"dir":["ltr"]} +{"page":144,"change":"ContentChange","types":["H4"],"str":"5. Schlussfolgerungen","line":14,"x":68.04,"y":363.42,"width":"115.35","height":"12.00","fontName":["CRDKGT+ArialMT"],"dir":["ltr"]} +{"page":150,"change":"ContentChange","types":["H4"],"str":"1. Anwendung von Biochar als Bodenverbesserungsmittel: ","line":20,"x":68.04,"y":291.24,"width":"307.49","height":"12.00","fontName":["CRDKGT+ArialMT"],"dir":["ltr"]} +{"page":150,"change":"ContentChange","types":["H4"],"str":"Wirkungen auf die Gesamtfruchtbarkeit der Böden und ","dir":"ltr","width":"293.46","height":"12.00","transform":["12.00","0.00","0.00","12.00","85.02","277.44"],"fontName":"CRDKGT+ArialMT","x":85.01999999999998,"y":277.44,"line":21} +{"page":150,"change":"ContentChange","types":["H4"],"str":"die Wachstumsperformance der Pflanzen","dir":"ltr","width":"219.96","height":"12.00","transform":["12.00","0.00","0.00","12.00","85.02","263.64"],"fontName":"CRDKGT+ArialMT","x":85.01999999999998,"y":263.64,"line":22} +{"page":154,"change":"ContentChange","types":["H4"],"str":"2. W irkungen der Anwendung von Biochar auf den Stick -","line":2,"x":68.04,"y":564.24,"width":"307.54","height":"12.00","fontName":["CRDKGT+ArialMT"],"dir":["ltr"]} +{"page":154,"change":"ContentChange","types":["H4"],"str":"stoffzyklus von getopften Weinpflanzen","line":3,"x":85.02000000000004,"y":550.44,"width":"208.09","height":"12.00","fontName":["CRDKGT+ArialMT"],"dir":["ltr"]} +{"page":165,"change":"ContentChange","types":["H4"],"str":"3. Wirkungen der Nutzung von Biochar auf die hydrischen ","line":2,"x":70.92,"y":564.24,"width":"306.75","height":"12.00","fontName":["CRDKGT+ArialMT"],"dir":["ltr"]} +{"page":165,"change":"ContentChange","types":["H4"],"str":"Eigenschaften der Substrate und die potenziellen ","dir":"ltr","width":"264.90","height":"12.00","transform":["12.00","0.00","0.00","12.00","87.90","550.44"],"fontName":"CRDKGT+ArialMT","x":87.89999999999999,"y":550.44,"line":3} +{"page":165,"change":"ContentChange","types":["H4"],"str":"Stickstoffverluste durch Auslaugung ","dir":"ltr","width":"194.14","height":"12.00","transform":["12.00","0.00","0.00","12.00","87.90","536.64"],"fontName":"CRDKGT+ArialMT","x":87.89999999999999,"y":536.6400000000001,"line":4} +{"page":169,"change":"ContentChange","types":["H4"],"str":"4. Wirkungen der Anwendung von Biochar auf den ","line":6,"x":70.92,"y":273.24,"width":"268.11","height":"12.00","fontName":["CRDKGT+ArialMT"],"dir":["ltr"]} +{"page":169,"change":"ContentChange","types":["H4"],"str":"physiologischen Zustand der einem zunehmenden ","dir":"ltr","width":"271.44","height":"12.00","transform":["12.00","0.00","0.00","12.00","87.90","259.44"],"fontName":"CRDKGT+ArialMT","x":87.89999999999999,"y":259.44,"line":7} +{"page":169,"change":"ContentChange","types":["H4"],"str":"Trockenstress ausgesetzten Weinpflanzen","dir":"ltr","width":"226.08","height":"12.00","transform":["12.00","0.00","0.00","12.00","87.90","245.64"],"fontName":"CRDKGT+ArialMT","x":87.89999999999999,"y":245.64,"line":8} +{"page":173,"change":"ContentChange","types":["H4"],"str":"5. Schluss bemerkungen","line":2,"x":70.92,"y":564.24,"width":"125.34","height":"12.00","fontName":["CRDKGT+ArialMT"],"dir":["ltr"]} +{"page":180,"change":"ContentChange","types":["H4"],"str":"1. Einleitung","line":26,"x":68.04,"y":210.24,"width":"62.60","height":"12.00","fontName":["CRDKGT+ArialMT"],"dir":["ltr"]} +{"page":182,"change":"ContentChange","types":["H4"],"str":"2. Materialien und Methoden","line":2,"x":68.04,"y":564.24,"width":"148.71","height":"12.00","fontName":["CRDKGT+ArialMT"],"dir":["ltr"]} {"page":187,"change":"ContentChange","types":["H2"],"str":"𝑓𝑓 =","line":3,"x":70.92,"y":539.7,"width":"18.13","height":"13.98","fontName":["CJUSQJ+CambriaMath","WASIKV+CambriaMath"],"dir":["ltr"]} -{"page":190,"change":"ContentChange","types":["H5"],"str":"3. Ergebnisse ","line":20,"x":68.04,"y":279.24,"width":"73.38","height":"12.00","fontName":["CRDKGT+ArialMT"],"dir":["ltr"]} -{"page":200,"change":"ContentChange","types":["H5"],"str":"4. Diskussion","line":28,"x":68.04,"y":278.94,"width":"67.93","height":"12.00","fontName":["CRDKGT+ArialMT"],"dir":["ltr"]} -{"page":207,"change":"ContentChange","types":["H5"],"str":"5. Schlussfolgerungen","line":13,"x":70.92,"y":394.62,"width":"115.35","height":"12.00","fontName":["CRDKGT+ArialMT"],"dir":["ltr"]} -{"page":214,"change":"ContentChange","types":["H5"],"str":"1. Einleitung","line":16,"x":68.04,"y":345.24,"width":"62.60","height":"12.00","fontName":["CRDKGT+ArialMT"],"dir":["ltr"]} -{"page":216,"change":"ContentChange","types":["H5"],"str":"2. Mate rialien und Methoden","line":19,"x":68.04,"y":296.22,"width":"148.74","height":"12.00","fontName":["CRDKGT+ArialMT"],"dir":["ltr"]} -{"page":235,"change":"ContentChange","types":["H5"],"str":"3. Ergebnisse und Diskussion","dir":"ltr","width":"158.04","height":"12.00","transform":["12.00","0.00","0.00","12.00","70.92","564.24"],"fontName":"CRDKGT+ArialMT","x":70.92,"y":564.24,"line":2} -{"page":249,"change":"ContentChange","types":["H5"],"str":"4. Perspektiven","dir":"ltr","width":"82.68","height":"12.00","transform":["12.00","0.00","0.00","12.00","70.92","564.24"],"fontName":"CRDKGT+ArialMT","x":70.92,"y":564.24,"line":2} -{"page":251,"change":"ContentChange","types":["H5"],"str":"5. Schlussfolgerungen","dir":"ltr","width":"118.68","height":"12.00","transform":["12.00","0.00","0.00","12.00","70.92","506.22"],"fontName":"CRDKGT+ArialMT","x":70.92,"y":506.22,"line":4} \ No newline at end of file +{"page":190,"change":"ContentChange","types":["H4"],"str":"3. Ergebnisse ","line":20,"x":68.04,"y":279.24,"width":"73.38","height":"12.00","fontName":["CRDKGT+ArialMT"],"dir":["ltr"]} +{"page":200,"change":"ContentChange","types":["H4"],"str":"4. Diskussion","line":28,"x":68.04,"y":278.94,"width":"67.93","height":"12.00","fontName":["CRDKGT+ArialMT"],"dir":["ltr"]} +{"page":207,"change":"ContentChange","types":["H4"],"str":"5. Schlussfolgerungen","line":13,"x":70.92,"y":394.62,"width":"115.35","height":"12.00","fontName":["CRDKGT+ArialMT"],"dir":["ltr"]} +{"page":214,"change":"ContentChange","types":["H4"],"str":"1. Einleitung","line":16,"x":68.04,"y":345.24,"width":"62.60","height":"12.00","fontName":["CRDKGT+ArialMT"],"dir":["ltr"]} +{"page":216,"change":"ContentChange","types":["H4"],"str":"2. Mate rialien und Methoden","line":19,"x":68.04,"y":296.22,"width":"148.74","height":"12.00","fontName":["CRDKGT+ArialMT"],"dir":["ltr"]} +{"page":235,"change":"ContentChange","types":["H4"],"str":"3. Ergebnisse und Diskussion","dir":"ltr","width":"158.04","height":"12.00","transform":["12.00","0.00","0.00","12.00","70.92","564.24"],"fontName":"CRDKGT+ArialMT","x":70.92,"y":564.24,"line":2} +{"page":249,"change":"ContentChange","types":["H4"],"str":"4. Perspektiven","dir":"ltr","width":"82.68","height":"12.00","transform":["12.00","0.00","0.00","12.00","70.92","564.24"],"fontName":"CRDKGT+ArialMT","x":70.92,"y":564.24,"line":2} +{"page":251,"change":"ContentChange","types":["H4"],"str":"5. Schlussfolgerungen","dir":"ltr","width":"118.68","height":"12.00","transform":["12.00","0.00","0.00","12.00","70.92","506.22"],"fontName":"CRDKGT+ArialMT","x":70.92,"y":506.22,"line":4} \ No newline at end of file diff --git a/examples/dict/detectHeaders.json b/examples/dict/detectHeaders.json index 451d7d5..48dd3c7 100644 --- a/examples/dict/detectHeaders.json +++ b/examples/dict/detectHeaders.json @@ -2,7 +2,7 @@ "pages": 218, "items": 51104, "groupedItems": 8481, - "changes": 2, + "changes": 5, "schema": [ { "name": "line" @@ -35,4 +35,7 @@ "globals": {} } {"page":0,"change":"ContentChange","types":["H1"],"str":"A Course in Combinatorial Optimization","dir":"ltr","width":"407.49","height":"24.79","transform":["24.79","0.00","0.00","24.79","112.60","584.96"],"fontName":"HVHZFT+CMR17","x":112.599,"y":584.959,"line":0} -{"page":0,"change":"ContentChange","types":["H2"],"str":"Alexander Schrijver","dir":"ltr","width":"162.77","height":"20.66","transform":["20.66","0.00","0.00","20.66","234.96","508.10"],"fontName":"HVHZFT+CMR17","x":234.96300000000002,"y":508.09919999999994,"line":1} \ No newline at end of file +{"page":0,"change":"ContentChange","types":["H2"],"str":"Alexander Schrijver","dir":"ltr","width":"162.77","height":"20.66","transform":["20.66","0.00","0.00","20.66","234.96","508.10"],"fontName":"HVHZFT+CMR17","x":234.96300000000002,"y":508.09919999999994,"line":1} +{"page":198,"change":"ContentChange","types":["H2","H3"],"str":"References","dir":"ltr","width":"90.64","height":"17.22","transform":["17.22","0.00","0.00","17.22","100.35","701.16"],"fontName":"KXBFBK+CMBX12","x":100.34999999999997,"y":701.1583,"line":1} +{"page":209,"change":"ContentChange","types":["H2","H3"],"str":"Name index","dir":"ltr","width":"101.96","height":"17.22","transform":["17.22","0.00","0.00","17.22","233.80","685.71"],"fontName":"KXBFBK+CMBX12","x":233.80200000000002,"y":685.7142,"line":1} +{"page":211,"change":"ContentChange","types":["H2","H3"],"str":"Subject index","dir":"ltr","width":"116.68","height":"17.22","transform":["17.22","0.00","0.00","17.22","226.44","685.71"],"fontName":"KXBFBK+CMBX12","x":226.44,"y":685.7142,"line":1} \ No newline at end of file diff --git a/src/ItemType.ts b/src/ItemType.ts deleted file mode 100644 index b9584f8..0000000 --- a/src/ItemType.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { assertDefined } from './assert'; - -enum ItemType { - H1 = 'H1', - H2 = 'H2', - H3 = 'H3', - H4 = 'H4', - H5 = 'H5', - H6 = 'H6', -} - -export default ItemType; - -namespace ItemType { - /** - * @param level 1-6 - * @returns - */ - export function header(level: number): ItemType { - const type = ItemType[`H${level}`]; - assertDefined(type, `No header for level '${level}' defined`); - return type; - } -} diff --git a/src/TOC.ts b/src/TOC.ts index 3b2cbb3..0c03d38 100644 --- a/src/TOC.ts +++ b/src/TOC.ts @@ -1,11 +1,15 @@ import Item from './Item'; -import ItemType from './ItemType'; +import { HeadlineType } from './text-types'; /** * Table of contents usually parsed by `DetectToc.ts`. */ export default class TOC { - constructor(public tocHeadlineItems: Item[], public pages: number[], public detectedHeadlineLevels: Set) {} + constructor( + public tocHeadlineItems: Item[], + public pages: number[], + public detectedHeadlineLevels: Set, + ) {} startPage(): number { return Math.min(...this.pages); diff --git a/src/debug/LineItemMerger.ts b/src/debug/LineItemMerger.ts index 8bfe929..6d4933c 100644 --- a/src/debug/LineItemMerger.ts +++ b/src/debug/LineItemMerger.ts @@ -12,6 +12,7 @@ export default class LineItemMerger extends ItemMerger { merge(evaluationTracker: EvaluationTracker, changeTracker: ChangeTracker, schema: string[], items: Item[]): Item { const page = items[0].page; + const block = items[0].data['block']; const line = items[0].data['line']; const str = items.map((item) => item.data['str']).join(' '); const x = Math.min(...items.map((item) => item.data['x'])); @@ -23,6 +24,7 @@ export default class LineItemMerger extends ItemMerger { const newItem = new Item(page, { str, + block, line, x, y, diff --git a/src/support/groupingUtils.ts b/src/support/groupingUtils.ts index a5d3a3d..b0997b2 100644 --- a/src/support/groupingUtils.ts +++ b/src/support/groupingUtils.ts @@ -16,6 +16,24 @@ export function descending(a: number, b: number): number { return b - a; } +export function min(array: number[], prevMin?: number): number { + return array.reduce((prev, curr) => { + if (prev === undefined || curr < prev) { + return curr; + } + return prev; + }, prevMin); +} + +export function max(array: number[], prevMin?: number): number { + return array.reduce((prev, curr) => { + if (prev === undefined || curr > prev) { + return curr; + } + return prev; + }, prevMin); +} + export function count(array: T[], find: (entry: T) => boolean): number { return array.reduce((count, entry) => (find(entry) ? count + 1 : count), 0); } diff --git a/src/support/items.ts b/src/support/items.ts index 04ebea5..6b345fa 100644 --- a/src/support/items.ts +++ b/src/support/items.ts @@ -1,6 +1,7 @@ +import { TextType } from 'src/text-types'; import { assertDefined } from '../assert'; import Item from '../Item'; -import ItemType from '../ItemType'; +import { onlyUniques } from './groupingUtils'; function get(item: Item, name: string): any { const value = item.data[name]; @@ -28,7 +29,7 @@ export function getFontName(fontMap: Map, item: Item): string { return assertDefined(fontObject['name'], `No 'name' found in ${JSON.stringify(fontObject)}`); } -export function itemWithType(item: Item, type: ItemType): Item { +export function itemWithType(item: Item, type: TextType): Item { const existingTypes = item.data['types'] || []; - return item.withDataAddition({ types: [...existingTypes, type] }); + return item.withDataAddition({ types: [...existingTypes, type].filter(onlyUniques) }); } diff --git a/src/support/stringFunctions.ts b/src/support/stringFunctions.ts index 292dc8d..fcacae6 100644 --- a/src/support/stringFunctions.ts +++ b/src/support/stringFunctions.ts @@ -43,3 +43,19 @@ export function extractEndingNumber(text: string): number | undefined { } return undefined; } + +export function isListItemCharacter(string) { + if (string.length > 1) { + return false; + } + const char = string.charAt(0); + return char === '-' || char === '•' || char === '–'; +} + +export function isListItem(value: string) { + return /^[\s]*[-•–][\s].*$/g.test(value); +} + +export function isNumberedListItem(value: string) { + return /^[\s]*\d*\.(?:\s|$)/g.test(value); +} diff --git a/src/text-types.ts b/src/text-types.ts new file mode 100644 index 0000000..1b71509 --- /dev/null +++ b/src/text-types.ts @@ -0,0 +1,38 @@ +import { assert } from './assert'; + +export type HeadlineType = 'H1' | 'H2' | 'H3' | 'H4' | 'H5' | 'H6'; + +export type ListType = 'LIST' | 'NUMBERED_LIST'; + +export type TextType = HeadlineType | 'TOC' | 'FOOTNOTES' | 'CODE' | ListType | 'PARAGRAPH'; + +function types(...types: TextType[]) { + return types; +} + +export function isHeadline(type: TextType) { + return types('H1', 'H2', 'H3', 'H4', 'H5', 'H6').includes(type); +} + +export function toHeadlineType(number: 1 | 2 | 3 | 4 | 5 | 6 | number): HeadlineType { + assert(number > 0 && number < 7, `Expected headline level between 1 and 6 but was ${number}`); + return `H${number.toString()}` as HeadlineType; +} + +export function headlineLevel(type: TextType) { + const level = parseInt(type[1]); + assert(level > 0 && level < 7, `Expected headline level between 1 and 6 but was ${level} (from '${type}')`); + return level; +} + +export function mergeToBlock(type: TextType) { + return types('FOOTNOTES', 'CODE', 'LIST', 'NUMBERED_LIST').includes(type); +} + +export function mergeFollowingNonTypedItems(type: TextType) { + return types('FOOTNOTES').includes(type); +} + +export function mergeFollowingNonTypedItemsWithSmallDistance(type: TextType) { + return types('LIST', 'NUMBERED_LIST').includes(type); +} diff --git a/src/transformer/DetectHeaders.ts b/src/transformer/DetectHeaders.ts index 56ea0da..afd04ec 100644 --- a/src/transformer/DetectHeaders.ts +++ b/src/transformer/DetectHeaders.ts @@ -4,11 +4,11 @@ import ItemTransformer from './ItemTransformer'; import TransformContext from './TransformContext'; import LineItemMerger from '../debug/LineItemMerger'; import { groupByLine, onlyUniques } from '../support/groupingUtils'; -import { MAX_HEIGHT, MOST_USED_DISTANCE, MOST_USED_FONT, MOST_USED_HEIGHT } from './CacluclateStatistics'; +import { MAX_HEIGHT, MOST_USED_HEIGHT } from './CacluclateStatistics'; import { HEADLINE_TYPE_TO_HEIGHT_RANGE, TOC_GLOBAL } from './DetectToc'; -import ItemType from '../ItemType'; import { flatten } from '../support/functional'; import { itemWithType } from '../support/items'; +import { HeadlineType, TextType, isHeadline, toHeadlineType } from '../text-types'; const config = { // How much taller a text must be to be a headline (relative to mostUsedHeight) @@ -30,13 +30,14 @@ export default class DetectHeaders extends ItemTransformer { transform(context: TransformContext, inputItems: Item[]): ItemResult { const maxHeight = context.getGlobal(MAX_HEIGHT); const mostUsedHeight = context.getGlobal(MOST_USED_HEIGHT); - const mostUsedDistance = context.getGlobal(MOST_USED_DISTANCE); - const mostUsedFont = context.getGlobal(MOST_USED_FONT); + // const mostUsedDistance = context.getGlobal(MOST_USED_DISTANCE); + // const mostUsedFont = context.getGlobal(MOST_USED_FONT); const toc = context.getGlobalOptionally(TOC_GLOBAL); const headlineTypeToHeightRange = context.getGlobalOptionally(HEADLINE_TYPE_TO_HEIGHT_RANGE); const itemsByLine = groupByLine(inputItems); - const itemToLevel: Map = new Map(); + const itemToLevel: Map = new Map(); + // Handle title pages: Title pages often have multiple lines of extraordinary height. // Starting the leveling here would already consume most of the available headline levels. @@ -51,24 +52,19 @@ export default class DetectHeaders extends ItemTransformer { itemToLevel, ); - const hasHeaderType = (types: ItemType[]) => - types.includes(ItemType.H1) || - types.includes(ItemType.H2) || - types.includes(ItemType.H3) || - types.includes(ItemType.H4) || - types.includes(ItemType.H5) || - types.includes(ItemType.H6); + const hasHeaderType = (types: TextType[]) => types.find((t) => isHeadline(t)); if (toc && headlineTypeToHeightRange) { // Use existing headline heights to find additional headlines - const headlineTypes = Object.keys(headlineTypeToHeightRange) as ItemType[]; + const headlineTypes = Object.keys(headlineTypeToHeightRange) as HeadlineType[]; headlineTypes.forEach((headlineType) => { const range = headlineTypeToHeightRange[headlineType]; if (range.max > mostUsedHeight) { // use only very clear headlines, only use max inputItems.forEach((item) => { const itemHeight = item.data['height']; - const types: ItemType[] = item.data['types'] || itemToLevel.get(item.uuid) || []; + const types: TextType[] = + item.data['types'] || itemToLevel.has(item.uuid) ? [itemToLevel.get(item.uuid)] : []; const isHeader = hasHeaderType(types); if (!isHeader && itemHeight === range.max) { itemToLevel.set(item.uuid, headlineType); @@ -89,12 +85,12 @@ export default class DetectHeaders extends ItemTransformer { heights.push(maxHeight); } }); - const heightToHeadline: Map = new Map(); + const heightToHeadline: Map = new Map(); heights.sort((a, b) => b - a); heights.forEach((height, i) => { const headlineLevel = i + 2; if (headlineLevel <= 6) { - const headlineType = ItemType.header(2 + i); + const headlineType = toHeadlineType(2 + i); heightToHeadline.set(height, headlineType); } }); @@ -103,10 +99,10 @@ export default class DetectHeaders extends ItemTransformer { .filter((lineItems) => !itemToLevel.has(lineItems[0].uuid)) .forEach((lineItems) => { const maxHeight = Math.max(...lineItems.map((item) => item.data['height'])); - const types = flatten(lineItems.map((item) => item.data['types'] || [])).filter(onlyUniques) as ItemType[]; + const types = flatten(lineItems.map((item) => item.data['types'] || [])).filter(onlyUniques) as TextType[]; if (!hasHeaderType(types) && !itemToLevel.has(lineItems[0].uuid)) { const headlineType = heightToHeadline.get(maxHeight); - if (headlineType && !types.includes(ItemType.H1) && !types.includes(ItemType.H2)) { + if (headlineType && !types.includes('H1') && !types.includes('H2')) { lineItems.forEach((item) => itemToLevel.set(item.uuid, headlineType)); detectedHeaders++; } @@ -147,7 +143,7 @@ export default class DetectHeaders extends ItemTransformer { // } return { - items: inputItems.map((item, i) => { + items: inputItems.map((item) => { const headerType = itemToLevel.get(item.uuid); if (headerType) { return itemWithType(item, headerType); @@ -165,7 +161,7 @@ function detectTitlePageHeaders( maxTitlePage: number, mostUsedHeight: number, maxHeight: number, - itemToLevel: Map, + itemToLevel: Map, ): number { const min2ndLevelHeaderHeigthOnMaxPage = mostUsedHeight + (maxHeight - mostUsedHeight) / 4; const pagesHavingMaxHeightItems = inputItems @@ -180,9 +176,9 @@ function detectTitlePageHeaders( const height = Math.max(...lineItems.map((item) => item.data['height'])); if (height > min2ndLevelHeaderHeigthOnMaxPage) { if (height == maxHeight) { - lineItems.forEach((item) => itemToLevel.set(item.uuid, ItemType.H1)); + lineItems.forEach((item) => itemToLevel.set(item.uuid, 'H1')); } else { - lineItems.forEach((item) => itemToLevel.set(item.uuid, ItemType.H2)); + lineItems.forEach((item) => itemToLevel.set(item.uuid, 'H2')); } detectedHeaders++; } diff --git a/src/transformer/DetectToc.ts b/src/transformer/DetectToc.ts index a2de9f3..1539b3d 100644 --- a/src/transformer/DetectToc.ts +++ b/src/transformer/DetectToc.ts @@ -16,12 +16,12 @@ import { WHITESPACE_CHAR_CODE, PERIOD_CHAR_CODES, } from '../support/stringFunctions'; -import ItemType from '../ItemType'; import { numbersAreConsecutive } from '../support/numberFunctions'; import TOC from '../TOC'; import FontType, { declaredFontTypes } from '../FontType'; import { flatten, groupBy } from '../support/functional'; import { getHeight, getText, getFontName, itemWithType } from '../support/items'; +import { HeadlineType, toHeadlineType } from '../text-types'; export interface HeadlineRange { min: number; @@ -129,12 +129,12 @@ export default class DetectToc extends ItemTransformer { uidToLevel.set(uuid, headline.level); }); return uidToLevel; - }, new Map()); + }, new Map()); const headlineTypes = foundHeadlines.reduce((allLevels, headline) => { allLevels.add(headline.level); return allLevels; - }, new Set()); + }, new Set()); const tocHeadlineUuids = new Set(tocHeadline.map((item) => item.uuid)); return { @@ -327,7 +327,7 @@ function findTocHeadline( return itemsGroupedByLine[itemsGroupedByLine.length - 1]; } -function findTocEntryHeadlineLevels(rawTocEntries: RawTocEntry[]): ItemType[] { +function findTocEntryHeadlineLevels(rawTocEntries: RawTocEntry[]): HeadlineType[] { // We focus on heights since it seems the most consistent metric to determining levels so far. //Other options would be looking at X-coordinates (per page), or at leading numbering (e.g. /^(\d)+.(\d)+.(\d)+/). const height = (entry: RawTocEntry) => Math.round(getHeight(entry.entryLines[0][0])); @@ -335,12 +335,12 @@ function findTocEntryHeadlineLevels(rawTocEntries: RawTocEntry[]): ItemType[] { // we start with H2 (H1 is reserved for the document title) if (allHeights.length > 3) { - return rawTocEntries.map(() => ItemType.H2); + return rawTocEntries.map(() => 'H2'); } return rawTocEntries.map((entry) => { const index = allHeights.indexOf(height(entry)); - return ItemType.header(index + 2); + return toHeadlineType(index + 2); }); } @@ -465,7 +465,7 @@ interface RawTocEntry { } interface Headline { - level: ItemType; + level: HeadlineType; uuids: Set; } diff --git a/test/ItemType.test.ts b/test/ItemType.test.ts deleted file mode 100644 index 7b396ba..0000000 --- a/test/ItemType.test.ts +++ /dev/null @@ -1,13 +0,0 @@ -import ItemType from 'src/ItemType'; - -test('headers', async () => { - expect(ItemType.header(1)).toEqual(ItemType.H1); - expect(ItemType.header(2)).toEqual(ItemType.H2); - expect(ItemType.header(3)).toEqual(ItemType.H3); - expect(ItemType.header(4)).toEqual(ItemType.H4); - expect(ItemType.header(5)).toEqual(ItemType.H5); - expect(ItemType.header(6)).toEqual(ItemType.H6); - - expect(() => ItemType.header(0)).toThrow("No header for level '0' defined"); - expect(() => ItemType.header(7)).toThrow("No header for level '7' defined"); -}); diff --git a/test/support/groupingUtils.test.ts b/test/support/groupingUtils.test.ts index 28d3d06..886fbf8 100644 --- a/test/support/groupingUtils.test.ts +++ b/test/support/groupingUtils.test.ts @@ -9,11 +9,13 @@ import { flatMap, onlyUniques, count, + min, + max, } from 'src/support/groupingUtils'; import { items } from 'test/testItems'; test('count', async () => { - expect(count([], (_) => true)).toEqual(0); + expect(count([], () => true)).toEqual(0); expect(count([1, 2, 3, 4, 5, 6], (e) => e % 2 == 0)).toEqual(3); expect(count(['A', 'B', 'c'], (e) => e === e.toUpperCase())).toEqual(2); }); @@ -30,6 +32,28 @@ test('onlyUniques', async () => { expect([1, 2, 3, 3, 2, 1].filter(onlyUniques)).toEqual([1, 2, 3]); }); +test('min', async () => { + expect(min([])).toBeUndefined(); + expect(min([1])).toEqual(1); + expect(min([1, 2])).toEqual(1); + expect(min([2, 1])).toEqual(1); + expect(min([1, 4, -3, 5])).toEqual(-3); + + expect(min([2, 3], 1)).toEqual(1); + expect(min([2, 3], 4)).toEqual(2); +}); + +test('max', async () => { + expect(max([])).toBeUndefined(); + expect(max([1])).toEqual(1); + expect(max([1, 2])).toEqual(2); + expect(max([2, 1])).toEqual(2); + expect(max([1, 4, -3, 5])).toEqual(5); + + expect(max([2, 3], 1)).toEqual(3); + expect(max([2, 3], 4)).toEqual(4); +}); + describe('groupByPage', () => { test('empty', async () => { expect(groupByPage([])).toEqual([]); diff --git a/test/support/stringFunctions.test.ts b/test/support/stringFunctions.test.ts index e478aa3..70fbcee 100644 --- a/test/support/stringFunctions.test.ts +++ b/test/support/stringFunctions.test.ts @@ -3,6 +3,8 @@ import { filterOutWhitespaces, extractNumbers, extractEndingNumber, + isListItem, + isNumberedListItem, } from 'src/support/stringFunctions'; test('filterOutDigits', async () => { @@ -31,3 +33,45 @@ test('extractEndingNumbers', async () => { expect(extractEndingNumber('a12 21 304')).toEqual(304); expect(extractEndingNumber('abc ... 304')).toEqual(304); }); + +describe('functions: isListItem', () => { + it('Match', () => { + expect(isListItem('- my text')).toEqual(true); + expect(isListItem('- my text -')).toEqual(true); + expect(isListItem(' - my text')).toEqual(true); + expect(isListItem(' - my text')).toEqual(true); + expect(isListItem(' - my text')).toEqual(true); + + expect(isListItem('• my text')).toEqual(true); + expect(isListItem(' • my text')).toEqual(true); + expect(isListItem(' • my text')).toEqual(true); + + expect(isListItem('– my text')).toEqual(true); + expect(isListItem(' – my text')).toEqual(true); + }); + + it('No Match', () => { + expect(isListItem('my text')).toEqual(false); + expect(isListItem('-my text')).toEqual(false); + expect(isListItem('•my text')).toEqual(false); + expect(isListItem(' -my text')).toEqual(false); + }); +}); + +describe('functions: isNumberedListItem', () => { + it('Match', () => { + expect(isNumberedListItem('1.')).toEqual(true); + expect(isNumberedListItem('1. my text')).toEqual(true); + expect(isNumberedListItem('2. my text')).toEqual(true); + expect(isNumberedListItem('23. my text')).toEqual(true); + expect(isNumberedListItem('23. my text')).toEqual(true); + expect(isNumberedListItem(' 23. my text')).toEqual(true); + expect(isNumberedListItem(' 23. my text')).toEqual(true); + }); + + it('No Match', () => { + expect(isNumberedListItem('1two')).toEqual(false); + expect(isNumberedListItem('1 two')).toEqual(false); + expect(isNumberedListItem('1.two')).toEqual(false); + }); +}); diff --git a/test/text-types.test.ts b/test/text-types.test.ts new file mode 100644 index 0000000..80d8bf9 --- /dev/null +++ b/test/text-types.test.ts @@ -0,0 +1,40 @@ +import { TextType, isHeadline, headlineLevel, toHeadlineType } from 'src/text-types'; + +describe('headline', () => { + test('isHeadline', async () => { + expect(isHeadline('H0' as TextType)).toBe(false); + expect(isHeadline('H1')).toBe(true); + expect(isHeadline('H2')).toBe(true); + expect(isHeadline('H3')).toBe(true); + expect(isHeadline('H4')).toBe(true); + expect(isHeadline('H5')).toBe(true); + expect(isHeadline('H6')).toBe(true); + expect(isHeadline('H7' as TextType)).toBe(false); + }); + + test('headlineLevel', async () => { + expect(headlineLevel('H1')).toBe(1); + expect(headlineLevel('H2')).toBe(2); + expect(headlineLevel('H3')).toBe(3); + expect(headlineLevel('H4')).toBe(4); + expect(headlineLevel('H5')).toBe(5); + expect(headlineLevel('H6')).toBe(6); + expect(() => headlineLevel('H0' as TextType)).toThrow( + Error("Expected headline level between 1 and 6 but was 0 (from 'H0')"), + ); + expect(() => headlineLevel('H7' as TextType)).toThrow( + Error("Expected headline level between 1 and 6 but was 7 (from 'H7')"), + ); + }); + + test('toHeadlineType', async () => { + expect(toHeadlineType(1)).toEqual('H1'); + expect(toHeadlineType(2)).toEqual('H2'); + expect(toHeadlineType(3)).toEqual('H3'); + expect(toHeadlineType(4)).toEqual('H4'); + expect(toHeadlineType(5)).toEqual('H5'); + expect(toHeadlineType(6)).toEqual('H6'); + expect(() => toHeadlineType(1 - 1)).toThrow(Error('Expected headline level between 1 and 6 but was 0')); + expect(() => toHeadlineType(6 + 1)).toThrow(Error('Expected headline level between 1 and 6 but was 7')); + }); +});