Devo, necessariamente, premettere che in questo periodo, e per qualche mese, non dispongo della rete internet, probabilmente non avrei neanche posto la domanda, avendola.
Un problema che mi è dato da detta carenza è la non comprensione della documentazione in inglese reperita (nello specifico quella di "0MQ") che di solito uso affrontare con l'ausilio del traduttore di google e la redazione di maccheronici documenti con libreoffice writer secondo modelli a me comodi.
Marcando il passo per il problema "inglese" (da me mai studiato e che non comprendo ) mi son messo a studiare la fattibilità di realizzare un traduttore off-line a mio consumo che "dovrebbe" acquisire font e testo tramite pdfminer, tradurre parti del testo tramite argos-translate (le parti di codice ovviamente no) ed infine inserire il testo in un template libreoffice writer, che definirò, oppure con l'utilizzo della formattazione testo originale.
Al momento sto studiandomi i sorgenti di pdfminer e, per quanto riesco a capirla, la scarna documentazione trovata al fine di estrarre i singoli caratteri corredati dal font utilizzato e le loro coordinate nel documento per poi organizzarli per i successivi trattamenti, cosa che mi è riuscito di fare ... ma qui mi sorge un primo problema, probabilmente banale : in alcuni casi, il font-name ha un tipo di indicazione che non so bene come trattare in seguito.
Vi pongo, ad esempio, uno dei codici "di studio" realizzati che tramite il modulo "layout" di pdfminer estrae e stampa i dati interessati del testo:
Codice: Seleziona tutto
# -*- coding: utf-8 -*-
import sys
from io import StringIO
from pdfminer.pdfparser import PDFParser
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdfpage import PDFPage
from pdfminer.pdfinterp import PDFResourceManager
from pdfminer.pdfinterp import PDFPageInterpreter
from pdfminer.layout import LAParams
from pdfminer.converter import PDFPageAggregator
import pdfminer
def createPDFDoc(f_name):
fp = open(f_name, 'rb')
parser = PDFParser(fp)
document = PDFDocument(parser, password='')
# check if the document allow text extraction. If not abort
if not document.is_extractable:
raise "Not extractable"
else:
return document
def createDeviceInterpreter():
rsrcmgr = PDFResourceManager()
laparams = LAParams()
device = PDFPageAggregator(rsrcmgr, laparams=laparams)
interpreter = PDFPageInterpreter(rsrcmgr, device)
return device, interpreter
# Bisogna procedere ad una migliore assegnazione dei fonts al testo
def parse_obj(objs):
old_name = ""
old_size = 0
for obj in objs:
if isinstance(obj, pdfminer.layout.LTTextBox):
for o in obj._objs:
if isinstance(o, pdfminer.layout.LTTextLine):
print()
for c in o._objs:
if isinstance(c, pdfminer.layout.LTChar):
if c.fontname != old_name or c.size != old_size:
old_name = c.fontname
old_size = c.size
print('\nfontname %s %d x = %d, y = %d' % (c.fontname, c.size, c.bbox[0], c.bbox[1]))
print(c.get_text(), end=' - ')
coords = [x for x in c.bbox]
for c in coords:
print(c, end=', ')
print()
else:
pass
if __name__ == '__main__':
arg = sys.argv
if len(arg) < 2:
text = 'Utilizzo : python pdfm_get_fonts_var_03.py file_name [start_page] [end_page]'
print(text)
exit()
f_name = arg[1]
try:
start_page = None if len(arg) < 3 else int(arg[2])
end_page = None if len(arg) < 4 else int(arg[3])
except ValueError:
print('Valori di pagina non validi, esco')
exit()
if not start_page is None:
if end_page is None:
sel_pages = range(start_page-1, start_page)
else:
self_pages = range(start_page-1, end_page)
document = createPDFDoc(f_name)
device, interpreter = createDeviceInterpreter()
pages = list(PDFPage.create_pages(document))
for p in sel_pages:
interpreter.process_page(pages[p])
layout = device.get_result()
print(repr(layout))
parse_obj(layout._objs)
Applicando tale codice su questo semplice pdf realizzato con libreoffice writer
ho l'output come nello stralcio che segue
Codice: Seleziona tutto
Python 3.8.0 (default, Dec 9 2021, 17:53:27)
[GCC 8.4.0] on linux
Type "help", "copyright", "credits" or "license()" for more information.
>>>
==== RESTART: /media/nuzzo/STORE N GO/pdf/prove/pdfm_get_fonts_01_var_04.py ====
<LTPage(1) 0.000,0.000,595.276,841.861 rotate=0>
fontname BAAAAA+LiberationSerif 15 x = 56, y = 771
A - 56.8, 771.308, 65.464, 786.716,
p - 65.488, 771.308, 71.488, 786.716,
e - 71.488, 771.308, 76.804, 786.716,
l - 76.792, 771.308, 80.116, 786.716,
...
Qualcuno saprebbe darmi consigli in merito? Sarebbero graditi.
Grazie dell'attenzione.