Commit ec400954 authored by Bernard Stephan's avatar Bernard Stephan
Browse files

fix #4 #5

parent c30ea88f
......@@ -644,3 +644,16 @@ classes de blocs :
Ceci n'a pas été fait mais peut être envisagé, les algorithmes
d'identification des lignes et colonnes étant relativement similaires
à des traitements mis en oeuvre dans le reste du document.
- Pour les en-têtes et les pieds de page de plusieurs lignes, les retour
à la ligne sont préservés par le biais de balises \<br\>.
- Les puces ne sont pas restituées au sein de balises \<ul\> et \<li\>.
S'il est aisé d'identifier une ligne qui ne commence pas par un caractère
alphanumérique et d'en déduire que ce caractère est une puce, il y a une
ambiguïté sur la fin de la puce. Il est difficile de distinguer le texte qui
est dans la puce du texte qui est après la puce.
D'autre part le *html* n'accepte pas les balises \<ul\> à l'intérieur des
balises \<p\>. Le découpage puces/paragraphe doit donc être très précis.
Parce que ce niveau de précision n'était pas envisageable, les puces sont
signalées par un retour à la ligne et un tiret.
Les descriptions (lignes contenant deux points ':') sont aussi précédées
d'un retour à la ligne.
......@@ -593,7 +593,7 @@ def get_columns(blocks, default_font_size):
def expand_blocks(page_blocks, default_font_size):
pb = page_blocks # for shorter writing
max_x = max([b['x_max'] for b in pb])
min_x = max([b['x_min'] for b in pb])
min_x = min([b['x_min'] for b in pb])
for b in pb:
if b['font']['size'] > default_font_size:
b['xx_max'] = max_x
......@@ -604,14 +604,14 @@ def expand_blocks(page_blocks, default_font_size):
for b in pb:
if b['y_min'] < block['y_max'] and b['y_max'] > block['y_min']:
if b['x_min'] >= block['x_max'] and block['xx_max'] > b['x_min']:
block['xx_max'] = b['x_min']
block['xx_max'] = max(block['x_max'], b['x_min'] - (VERTICAL_ALIGMENT_THRESHOLD/2))
if b['x_max'] <= block['x_min'] and block['xx_min'] < b['x_max']:
block['xx_min'] = b['x_max']
for b in pb:
if b['font']['size'] > default_font_size:
b['x_max'] = b['xx_max']
b['x_min'] = b['xx_min']
#b['x_min'] = b['xx_min']
del b['xx_max']
del b['xx_min']
......@@ -678,8 +678,6 @@ def sort_blocks(blocks, columns, default_font_size):
y_min = min([b['y_min'] for b in bl_top])
y_max = max([b['y_max'] for b in bl_top if b['y_min'] == y_min])
#&& print("----- %d %f %f" % (len(bl_top), y_min, y_max))
## y a-t-il plusieurs blocs alignés ? Si oui, on prend le plus à gauche.
aligned_bl = [b for b in blocks if not b['treat'] and \
b['temp_left'] >= curr_col_min and \
......@@ -716,7 +714,8 @@ def sort_blocks(blocks, columns, default_font_size):
# &&& À tester : col_max à 1 ?
curr_col_min = 0
curr_col_max = len(columns) - 1
curr_col_max = 1
# curr_col_max = len(columns) - 1
elif selected_bl['col_max'] > curr_col_max : # ← Case 3
#&& print("→ Case 3 : %s" % selected_bl['lines'][0]['text'])
......@@ -946,9 +945,9 @@ def guess_structure(blocks, fontspec, def_size):
if c > max_center: max_center = c
last_character = l['text'].strip()[-1]
if len(l['text'].split(':')) > 1 and \
len(re.sub(r'[A-ZÀÇÉÈÊÂÔÛ]','', l['text'][0])) == 0:
len(re.sub(r'[A-ZÀÇÉÈÊÂÔÛ0-9]','', l['text'][0])) == 0:
l['flags'] |= IS_DESCRIPTION
if len(re.sub(r'\W','', l['text'][0:1]).strip()) == 0:
if len(re.sub(r'[]\W\(\[\{]','', l['text'][0:1]).strip()) == 0:
l['flags'] |= HAS_BULLET
has_bullets = True
# - End loop on lines
......@@ -1058,7 +1057,7 @@ def guess_structure(blocks, fontspec, def_size):
expand_blocks(p['blocks'], default_font['size'])
col = get_columns(p['blocks'], default_font['size'])
col.append(max(b['x_max'] for b in p['blocks']))
#print("================================================== %s" % col)
#&& print("================================================== %s" % col)
p['blocks'] = sort_blocks(p['blocks'], col, default_font['size'])
#print(col)
if not first_block_tagged:
......@@ -1283,16 +1282,10 @@ def guess_structure(blocks, fontspec, def_size):
prev_block['class'] = BL_MISC
prev_table = 0
prev_block = b
# &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
# &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
# &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
return pages
# +--------------------------------------------------------------+
# | print_pages |
# | print_html |
# +--------------------------------------------------------------+
def print_html(pages, fontspec):
blocks = []
......@@ -1322,20 +1315,22 @@ def print_html(pages, fontspec):
doc_title = [b for b in blocks if b['class'] == BL_DOCUMENT_TITLE]
if len(doc_title) > 0:
print(" <title>")
txt = ' <title>'
for b in doc_title:
for l in b['lines']:
print(l['text'])
print(" </title>")
txt = '%s%s ' % (txt, l['text'])
if txt[-1] == ' ':
txt = txt[:-1]
print("%s</title>" % txt)
print("</head>")
print("<body>")
BLOCK_TAGS = ['div', 'p', 'footer', 'header', 'figcaption', 'table',
'a', 'h1', 'h1', 'h2', 'h3', 'h4', 'h5',
'div', 'div', 'div', 'p', '']
BLOCK_ENDLINES = ['<br />', '', '<br />', '<br />', '<br />', '',
'', '', '', '', '', '', '', '<br />', '<br />', '<br />', '<br />',
'<br />']
BLOCK_ENDLINES = ['<br />', '', '<br />', '<br />', '', '',
'', '', '', '', '', '', '', '<br />', '<br />', '<br />', '',
'']
i = 0
last_page = 1
......@@ -1363,7 +1358,7 @@ def print_html(pages, fontspec):
i -= 1
elif cl != BL_IGNORE:
pre = post = ''
txt = pre = post = ''
if PRINT_CSS:
id_cl = ' class="%s"' % BLOCKS_CLASSES[cl]
else:
......@@ -1372,27 +1367,36 @@ def print_html(pages, fontspec):
pre = '<figure>'
post = '</figure>'
if not DEBUG_PRINT:
print('%s<%s%s>' % (pre, BLOCK_TAGS[cl], id_cl))
txt = '%s%s<%s%s>' % (txt, pre, BLOCK_TAGS[cl], id_cl)
#&& txt = '%s%s<%s%s>(%s, %s)' % (txt, pre, BLOCK_TAGS[cl], id_cl, blocks[i]['x_min'],blocks[i]['x_max'])
elif blocks[i]['score'] is None:
print('%s<%s%s font="%d">' % (
pre, BLOCK_TAGS[cl], id_cl, blocks[i]['font']['id']))
txt = '%s%s<%s%s font="%d">' % (txt, pre, LOCK_TAGS[cl],
id_cl, blocks[i]['font']['id'])
else:
print('%s<%s%s font="%d" score="%f">' % (pre,
txt = '%s%s<%s%s font="%d" score="%f">' % (txt, pre,
BLOCK_TAGS[cl], id_cl,
blocks[i]['font']['id'], blocks[i]['score']))
blocks[i]['font']['id'], blocks[i]['score'])
for l in blocks[i]['lines']:
if (l['flags'] & (HAS_BULLET | IS_DESCRIPTION)) != 0 and \
BLOCK_ENDLINES[cl] == '' and \
l != blocks[i]['lines'][0]:
print(" <br />%s" % l['text'])
txt = "%s<br />%s" % (txt, l['text'])
else:
print(" %s%s" % (l['text'], BLOCK_ENDLINES[cl]))
print("</%s>%s" % (BLOCK_TAGS[cl], post))
if l == blocks[i]['lines'][-1]:
txt = "%s%s" % (txt, l['text'])
elif BLOCK_ENDLINES[cl] == '':
txt = "%s%s " % (txt, l['text'])
else:
txt = "%s%s%s" % (txt, l['text'], BLOCK_ENDLINES[cl])
if txt[-1] == ' ':
txt = txt[:-1]
print("%s</%s>%s" % (txt, BLOCK_TAGS[cl], post))
else: # cl == BL_IGNORE:
print("<!--")
[print(" %s" % l['text']) for l in blocks[i]['lines']]
print("-->")
txt = "<!-- "
for l in blocks[i]['lines']:
txt = "%s%s " % (txt, l['text'])
print("%s-->" % txt)
i += 1
......@@ -1400,24 +1404,6 @@ def print_html(pages, fontspec):
print("</html>")
def print_pages(pages):
for p in pages.keys():
print('----------- ')
print('*Page %d* ' % p)
print("")
for b in pages[p]['blocks']:
print("[%s - %s - %s]" % (BLOCKS_CLASSES[b['class']],
FONT_CLASSES[b['font_class']],
ALIGN_CLASSES[b['alignment']],
# b['col_min'], b['col_max'],
# b['font']['id'], b['font']['nb_blocks'],
# b['font']
))
for l in b['lines']:
print(" %s" % (l['text']))
print("")
# +--------------------------------------------------------------+
# | main |
......@@ -1431,13 +1417,7 @@ p2h = get_pdftohtml(sys.argv[1])
fontspec = p2h['fonts']
segments = p2h['segments']
#print_segments(segments)
#exit(0)
default_font_size = get_default_font_size(fontspec)
# mark_small_fonts(blocks, default_font_size)
guess_fonts(blocks, segments, fontspec)
#replace_block_fonts(blocks, fontspec, default_font_size)
pages = guess_structure(blocks, fontspec, default_font_size)
print_html(pages, fontspec)
#print_pages(pages)
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment