Repository: interlegis/sapl

Issue:
Avaliar outras libs para extração de texto de PDF para indexação
Atualmente estamos usando o `textract`, mas essa lib é bem "gorda" (várias dependências que não precisamos) e tem um bug com PDFs sem extensão que dão pau no parsing. Seria interessante vermos a possibilidade de substituir por outra lib python pura que nos permita extrair o texto do PDF. Sugestões

* slate (imatura?)
* PDFMiner
* pyPdf (abandonware?)

/cc @eduardocalil @LeandroRoberto 


Discussion:
Obs: o textract não suporta arquivos do tipo .xml
Isso abre uma discussão sobre os arquivos que estão no SAPL. Na migração foram encontrados arquivos em formatos que não fazem sentido para documentos, como por exemplo Normas com arquivos no formato **.c**

Resolving patch:
diff --git a/sapl/base/search_indexes.py b/sapl/base/search_indexes.py
--- a/sapl/base/search_indexes.py
+++ b/sapl/base/search_indexes.py
@@ -1,17 +1,20 @@
 import logging
 import os.path
+import re
+import string
 
 import textract
-from django.template import Context, loader
+from django.template import loader
 from haystack import indexes
 from textract.exceptions import ExtensionNotSupported
 
 from sapl.materia.models import DocumentoAcessorio, MateriaLegislativa
 from sapl.norma.models import NormaJuridica
-from sapl.settings import BASE_DIR
+from sapl.settings import BASE_DIR, SOLR_URL
 
 logger = logging.getLogger(BASE_DIR.name)
 
+
 class DocumentoAcessorioIndex(indexes.SearchIndex, indexes.Indexable):
     text = indexes.CharField(document=True, use_template=True)
 
@@ -40,19 +43,38 @@ def prepare(self, obj):
             if not os.path.splitext(arquivo.path)[1][:1]:
                 return self.prepared_data
 
-            try:
-                extracted_data = textract.process(
-                    arquivo.path,
-                    language='pt-br').decode('utf-8').replace('\n', ' ')
-            except ExtensionNotSupported:
-                return self.prepared_data
-            except Exception:
-                msg = 'Erro inesperado processando arquivo: %s' % arquivo.path
-                print(msg)
-                logger.error(msg)
-                return self.prepared_data
-
-            extracted_data = extracted_data.replace('\t', ' ')
+            # Em ambiente de produção utiliza-se o SOLR
+            if SOLR_URL:
+                extracted_data = self._get_backend(None).extract_file_contents(
+                    arquivo)['contents']
+                # Remove as tags xml
+                extracted_data = re.sub('<[^>]*>', '', extracted_data)
+                # Remove tags \t e \n
+                extracted_data = extracted_data.replace(
+                    '\n', ' ').replace('\t', ' ')
+                # Remove sinais de pontuação
+                extracted_data = re.sub('[' + string.punctuation + ']',
+                                        ' ', extracted_data)
+                # Remove espaços múltiplos
+                extracted_data = " ".join(extracted_data.split())
+
+            # Em ambiente de DEV utiliza-se o Whoosh
+            # Como ele não possui extração, faz-se uso do textract
+            else:
+                try:
+                    extracted_data = textract.process(
+                        arquivo.path,
+                        language='pt-br').decode('utf-8').replace('\n', ' ')
+                except ExtensionNotSupported:
+                    return self.prepared_data
+                except Exception:
+                    msg = 'Erro inesperado processando arquivo: %s' % (
+                        arquivo.path)
+                    print(msg)
+                    logger.error(msg)
+                    return self.prepared_data
+
+                extracted_data = extracted_data.replace('\t', ' ')
 
             # Now we'll finally perform the template processing to render the
             # text field with *all* of our metadata visible for templating:


Test patch: