Python - Error al ejecutar mi script en otro ordenador

 
Vista:
sin imagen de perfil

Error al ejecutar mi script en otro ordenador

Publicado por Alberto (8 intervenciones) el 29/06/2023 01:58:42
Buenas a todos, soy nuevo en este foro y no quiero hacerles perder mucho el tiempo así que seré breve.

Tengo un script basado en python que es este codigo de aquí:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
import subprocess
import fitz
import ocrmypdf
import io
import glob
import re
import os
import msvcrt
from tqdm import tqdm
import sys
import time
 
# Ruta absoluta del archivo "EXTRACCION EXCEL.PY"
ruta_extraccion_excel = r"C:\Users\Alberto Urdiales\Desktop\prueba de renombre python\app_seracargo_av\extraccion_excel.PY"
 
# Ruta absoluta del archivo "renombrar2.py"
ruta_renombrar2 = r"C:\Users\Alberto Urdiales\Desktop\prueba de renombre python\app_seracargo_av\carpetas.py"
 
# Ejecutar "EXTRACCION EXCEL.PY" antes de continuar
subprocess.run(["python", ruta_extraccion_excel])
 
print("A continuacion se renombrarán los pdf")
time.sleep(4) # espera en segundos
 
def escanear_pagina_ocr(page, language):
    src = page.parent
    doc = fitz.open()
    doc.insert_pdf(src, from_page=page.number, to_page=page.number)
    pdfbytes = doc.tobytes()
    inbytes = io.BytesIO(pdfbytes)
    outbytes = io.BytesIO()
    sys.stdout = open(os.devnull, "w")  # Redirigir la salida estándar a os.devnull
    sys.stderr = open(os.devnull, "w")  # Redirigir la salida de error a os.devnull
    ocrmypdf.ocr(
        inbytes,
        outbytes,
        language=language,
        output_type="pdf",
        force_ocr=True
    )
    sys.stdout = sys.__stdout__  # Restaurar la salida estándar
    sys.stderr = sys.__stderr__  # Restaurar la salida de error
    ocr_pdf = fitz.open("pdf", outbytes.getvalue())
    text = ocr_pdf[0].get_text()
    return text
 
if __name__ == "__main__":
    # Directorio que contiene los archivos PDF
    directorio_pdf = r"C:\Users\Alberto Urdiales\Desktop\prueba de renombre python"
 
    # Obtener la lista de archivos PDF en el directorio
    archivos_pdf = glob.glob(os.path.join(directorio_pdf, "*.pdf"))
    regex = r"N740[-\s]*([^\s-]+)"
 
    archivos_renombrados = []  # Lista para almacenar los nombres de los archivos renombrados y sus nombres anteriores
 
    archivos_totales = len(archivos_pdf)  # Variable para almacenar el número total de documentos
    archivos_completados = 0  # Variable para almacenar el número de documentos completados con éxito
 
    with tqdm(total=len(archivos_pdf), desc="Procesando archivos") as pbar:
        for archivo_pdf in archivos_pdf:
            # Abrir el documento
            doc = fitz.open(archivo_pdf)
 
            try:
                # Cargar solo la primera página
                pagina = doc.load_page(1)
            except:
                # Crear una variable con el nombre del archivo e indicar que hay un error por falta de documentación
                archivo_original = os.path.basename(archivo_pdf)
                print("\nERROR, el documento:", archivo_original, "no es correcto o está incompleto.\nCompruebe que su documentación contenga todas las hojas necesarias para extraer la información")
                break
 
            # Obtener el texto de la página con OCR
            texto = escanear_pagina_ocr(pagina, "spa")
 
            try:
                # Buscar la cadena "Cliente:" y obtener la siguiente palabra
                matches = re.findall(regex, texto)
            except:
                print("No se ha encontrado el número de conocimiento")
                break
 
            if matches:
                archivo_nombre = os.path.basename(archivo_pdf)  # Obtener solo el nombre del archivo de la ruta absoluta
                pbar.set_description(f"Procesando {archivo_nombre}")
                pbar.update(1)
                palabra_despues_cliente = matches[0]
 
                # Cerrar el documento antes de renombrar el archivo
                doc.close()
 
                # Renombrar el archivo PDF
                nuevo_nombre = palabra_despues_cliente + ".pdf"
                nuevo_nombre = nuevo_nombre.replace("/", "_")  # Reemplazar "/" por "_" para evitar problemas en el nombre del archivo
                nuevo_nombre = nuevo_nombre.replace("\\", "_")  # Reemplazar "\" por "_" para evitar problemas en el nombre del archivo
 
                # Obtener la ruta absoluta del archivo PDF
                ruta_absoluta = os.path.abspath(archivo_pdf)
 
                # Obtener el directorio y el nombre original del archivo PDF
                directorio, nombre_original = os.path.split(ruta_absoluta)
 
                # Construir la nueva ruta y nombre del archivo PDF
                nueva_ruta = os.path.join(directorio, nuevo_nombre)
 
                # Renombrar el archivo
                os.rename(archivo_pdf, nueva_ruta)
 
                archivos_renombrados.append((nombre_original, nuevo_nombre))  # Agregar el nombre anterior y el nombre actual a la lista de archivos renombrados
                archivos_completados += 1  # Incrementar el contador de documentos completados con éxito
 
    os.system("cls")  # Limpiar la terminal en Windows
    print("El proceso ha finalizado con",archivos_completados,"/",archivos_totales)
    print("\nArchivos renombrados:")
    for archivo in archivos_renombrados:
        nombre_anterior, nombre_actual = archivo
        print("Original:", nombre_anterior, ">>> Modificado:", nombre_actual)
        break
print("")
 
# Ejecutar "renombrar2.py"
subprocess.run(["python", ruta_renombrar2])
 
print("\nPresione una tecla para finalizar...")
msvcrt.getch()

(El codigo está escrito con ayuda de chatgpt ya que no soy un experto en programacion)
Lo que hace es coger un texto especifico del pdf para después renombrar el pdf con este nombre. Luego ya podeis ver que hago menciones a otro codigos python como el de renombre2 o el de excel, pero el unico que me falla es este de aquí.
El error que tiene es que cuando me voy al ordenador del trabajo el programa no termina de ejecutar el codigo completo, como si se saltase todas las lineas que quedan y finalizase.

Llevo tiempo haciendo busquedas de cual es el problema, que si paquetes, que si la version de python, etc. Pero nada.
A continuación adjunto imágenes de la terminal para que veais como deberia funcionar y como lo hace:

En casa
Captura-de-pantalla-2023-06-29-015311

En el trabajo
Captura-de-pantalla-2023-06-29-015434

Cualquier sugerencia, que necesiteis más datos o lo que sea estaré lo más atento posible para poder contestaros cuanto antes y no haceros perder el tiempo.
Muchas gracias!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Ghira

Error al ejecutar mi script en otro ordenador

Publicado por Ghira (1 intervención) el 29/06/2023 07:04:24
Tengo algunas sugerencias para que puedas ir viendo el error:

Ejecuta desde la consola de comando Python.exe

Un vez dentro de la interfaz interactiva, prueba que las librerías se logran importar una por una:

1
2
3
4
5
6
7
8
9
10
11
import subprocess
import fitz
import ocrmypdf
import io
import glob
import re
import os
import msvcrt
from tqdm import tqdm
import sys
import time

Si te genera algún error alguna de las librerias, deberas instalarla con el comando 'pip install <nombre_libreria>'


En segundo término, te pido disculpas si suena muy evidente:

Los Path que usas en la oficina y en casa, los ajustas para cada caso?

Me refiero a:

1
2
3
4
5
# Ruta absoluta del archivo "EXTRACCION EXCEL.PY"
ruta_extraccion_excel = r"C:\Users\Alberto Urdiales\Desktop\prueba de renombre python\app_seracargo_av\extraccion_excel.PY"
 
# Ruta absoluta del archivo "renombrar2.py"
ruta_renombrar2 = r"C:\Users\Alberto Urdiales\Desktop\prueba de renombre python\app_seracargo_av\carpetas.py"

Saludos y espero que salga todo bien.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Error al ejecutar mi script en otro ordenador

Publicado por Alberto (8 intervenciones) el 29/06/2023 12:11:59
Buenos días, lo primero de todo, gracias por ofrecer ayuda.
He probado importando como dices todas las bibliotecas en la consola de python y está todo correcto:

1
2
3
4
5
6
7
8
9
10
11
12
13
Python 3.11.3 (tags/v3.11.3:f3909b8, Apr  4 2023, 23:49:59) [MSC v.1934 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import subprocess
>>> import fitz
>>> import ocrmypdf
>>> import io
>>> import glob
>>> import re
>>> import os
>>> import msvcrt
>>> from tqdm import tqdm
>>> import sys
>>> import time

En cuanto a lo segundo, los path estás ajustado correctamente porque sino lo estuviesen debería dar un error con que no encuentra la ruta definida, pero no lo hace.
De todas formas adjunto algunas fotos de como tengo los archivos estructurados:
La carpeta
Captura-de-pantalla-2023-06-29-120422

El codigo de la oficina
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
import subprocess
import fitz
import ocrmypdf
import io
import glob
import re
import os
import msvcrt
from tqdm import tqdm
import sys
import time
 
# Ruta absoluta del archivo "EXTRACCION EXCEL.PY"
ruta_extraccion_excel = r"C:\Users\user\Desktop\carpeta_escaner\app_seracargo_av\extraccion_excel.py"
 
# Ruta absoluta del archivo "renombrar2.py"
ruta_renombrar2 = r"C:\Users\user\Desktop\carpeta_escaner\app_seracargo_av\carpetas.py"
 
# Ejecutar "EXTRACCION EXCEL.PY" antes de continuar
subprocess.run(["python", ruta_extraccion_excel])
 
print("A continuacion se renombrarán los pdf")
time.sleep(4) # espera en segundos
 
def escanear_pagina_ocr(page, language):
    src = page.parent
    doc = fitz.open()
    doc.insert_pdf(src, from_page=page.number, to_page=page.number)
    pdfbytes = doc.tobytes()
    inbytes = io.BytesIO(pdfbytes)
    outbytes = io.BytesIO()
    sys.stdout = open(os.devnull, "w")  # Redirigir la salida estándar a os.devnull
    sys.stderr = open(os.devnull, "w")  # Redirigir la salida de error a os.devnull
    ocrmypdf.ocr(
        inbytes,
        outbytes,
        language=language,
        output_type="pdf",
        force_ocr=True
    )
    sys.stdout = sys.__stdout__  # Restaurar la salida estándar
    sys.stderr = sys.__stderr__  # Restaurar la salida de error
    ocr_pdf = fitz.open("pdf", outbytes.getvalue())
    text = ocr_pdf[0].get_text()
    return text
 
if __name__ == "__main__":
    # Directorio que contiene los archivos PDF
    directorio_pdf = r"C:\Users\user\Desktop\carpeta_escaner"
 
    # Obtener la lista de archivos PDF en el directorio
    archivos_pdf = glob.glob(os.path.join(directorio_pdf, "*.pdf"))
    regex = r"N740[-\s]*([^\s-]+)"
 
    archivos_renombrados = []  # Lista para almacenar los nombres de los archivos renombrados y sus nombres anteriores
 
    archivos_totales = len(archivos_pdf)  # Variable para almacenar el número total de documentos
    archivos_completados = 0  # Variable para almacenar el número de documentos completados con éxito
 
    with tqdm(total=len(archivos_pdf), desc="Procesando archivos") as pbar:
        for archivo_pdf in archivos_pdf:
            # Abrir el documento
            doc = fitz.open(archivo_pdf)
 
            try:
                # Cargar solo la primera página
                pagina = doc.load_page(1)
            except:
                # Crear una variable con el nombre del archivo e indicar que hay un error por falta de documentación
                archivo_original = os.path.basename(archivo_pdf)
                print("\nERROR, el documento:", archivo_original, "no es correcto o está incompleto.\nCompruebe que su documentación contenga todas las hojas necesarias para extraer la información")
                break
 
            # Obtener el texto de la página con OCR
            texto = escanear_pagina_ocr(pagina, "spa")
 
            try:
                # Buscar la cadena "Cliente:" y obtener la siguiente palabra
                matches = re.findall(regex, texto)
            except:
                print("No se ha encontrado el número de conocimiento")
                break
 
            if matches:
                archivo_nombre = os.path.basename(archivo_pdf)  # Obtener solo el nombre del archivo de la ruta absoluta
                pbar.set_description(f"Procesando {archivo_nombre}")
                pbar.update(1)
                palabra_despues_cliente = matches[0]
 
                # Cerrar el documento antes de renombrar el archivo
                doc.close()
 
                # Renombrar el archivo PDF
                nuevo_nombre = palabra_despues_cliente + ".pdf"
                nuevo_nombre = nuevo_nombre.replace("/", "_")  # Reemplazar "/" por "_" para evitar problemas en el nombre del archivo
                nuevo_nombre = nuevo_nombre.replace("\\", "_")  # Reemplazar "\" por "_" para evitar problemas en el nombre del archivo
 
                # Obtener la ruta absoluta del archivo PDF
                ruta_absoluta = os.path.abspath(archivo_pdf)
 
                # Obtener el directorio y el nombre original del archivo PDF
                directorio, nombre_original = os.path.split(ruta_absoluta)
 
                # Construir la nueva ruta y nombre del archivo PDF
                nueva_ruta = os.path.join(directorio, nuevo_nombre)
 
                # Renombrar el archivo
                os.rename(archivo_pdf, nueva_ruta)
 
                archivos_renombrados.append((nombre_original, nuevo_nombre))  # Agregar el nombre anterior y el nombre actual a la lista de archivos renombrados
                archivos_completados += 1  # Incrementar el contador de documentos completados con éxito
 
    os.system("cls")  # Limpiar la terminal en Windows
    print("El proceso ha finalizado con",archivos_completados,"/",archivos_totales)
    print("\nArchivos renombrados:")
    for archivo in archivos_renombrados:
        nombre_anterior, nombre_actual = archivo
        print("Original:", nombre_anterior, ">>> Modificado:", nombre_actual)
        break
print("")
 
# Ejecutar "renombrar2.py"
subprocess.run(["python", ruta_renombrar2])
 
print("\nPresione una tecla para finalizar...")
msvcrt.getch()

Y ayer encontré un fallo que quizás pueda servir de ayuda para averiguar el error. El archivo que se puede ver en la foto, "launcher.bat" se ejecuta correctamente en mi ordenador de casa pero en el ordenador del trabajo se abre y se cierra sin ejecutar nada.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Error al ejecutar mi script en otro ordenador

Publicado por Costero (92 intervenciones) el 30/06/2023 04:12:13
El problema esta aqui:

1
2
# Directorio que contiene los archivos PDF
    directorio_pdf = r"C:\Users\user\Desktop\carpeta_escaner"

El programa no esta encontrad PDFs en ese directorio. Checquea bien y pon el directorio correcto.

Suerte
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Error al ejecutar mi script en otro ordenador

Publicado por Alberto (8 intervenciones) el 30/06/2023 13:16:16
Buenas, gracias pero creo que ese no es el error ya que cuando el programa ejecuta el script lee perfectamente los archivos de la ruta.
Este es el resultado de la terminal al ejecutar el script:
1
2
3
4
5
PS C:\Users\user\Desktop\carpeta_escaner> & C:/Python311/python.exe c:/Users/user/Desktop/carpeta_escaner/app_seracargo_av/renombrar.py
Los números y los símbolos se han guardado en el archivo de texto.
A continuacion se renombrarán los pdf
Procesando archivos:   0%|                         | 0/4 [00:00<?, ?it/s]
PS C:\Users\user\Desktop\carpeta_escaner>

La barra de carga indica 4 archivos que son exactamente los que tengo en la carpeta donde se ubican los pdf.

Adjunto imagen:
Captura-de-pantalla-2023-06-30-131516

Por eso digo que tendrá que ser algún error de paquetes o de estar instalado mal python, porque el codigo ha sido copiado del otro ordenador adaptando las rutas a este.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Error al ejecutar mi script en otro ordenador

Publicado por Costero (92 intervenciones) el 30/06/2023 19:09:18
Ok, esta encontrando los files.

Hay que hacer un poco de debugging, poniendo print en lugares estrategicos para ver que lo que esta pasando.


1
2
texto = escanear_pagina_ocr(pagina, "spa")
print(f"El texto es: {texto}"

Recuerda que estas utilizando Regex contra el texto. De acuerdo a tu regex ese texto tiene que tener algo como "Blah blah N740-.... blah blah" sino no va hacer procesado. Que es que creo lo que esta pasando.

Esto no es correcto:
1
2
3
4
5
6
7
8
9
10
11
try:
 
                # Buscar la cadena "Cliente:" y obtener la siguiente palabra
 
                matches = re.findall(regex, texto)
 
            except:
 
                print("No se ha encontrado el número de conocimiento")
 
                break

De acuerdo a la documentation no tira exception. Si no encuentra nada simplemente retorna una lista empty. Asi que ese print nunca va a funcionar. Quita esa try/except en ponlo solo asi:

1
matches = re.findall(regex, texto)

El bar solo avanza si hay un match:

1
2
3
4
5
6
7
if matches:
 
                archivo_nombre = os.path.basename(archivo_pdf)  # Obtener solo el nombre del archivo de la ruta absoluta
 
                pbar.set_description(f"Procesando {archivo_nombre}")
 
                pbar.update(1)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Error al ejecutar mi script en otro ordenador

Publicado por Alberto (8 intervenciones) el 03/07/2023 16:22:50
Buenas tardes, lamento la tardanza pero no podía acceder al ordenador de la oficina en remoto.
Haciendo lo primero que has comentado con el debugging, lo he hecho justo en la linea que has dicho y no escribe nada. He probado dentro del "if matches" y tan poco retorna nada.

Después he retirado el try/except que me dijiste y sigue sin funcionar.

Y por último he revisado el apartado del bar, pero no se puede hacer ninguna configuracion porque luego lo he ido probando en mi ordenador personal y tampoco funciona.

Sigo diciendo que no creo que sea error del codigo porque en mi ordenador personal funciona correctamente. Si puedo buscar otra alternativa como pasar el programa a un .exe también seria valido.
Muchas gracias Costero por tu ayuda
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Error al ejecutar mi script en otro ordenador

Publicado por Costero (92 intervenciones) el 03/07/2023 18:49:41
Ok. Parece que si es un problema de libreria. Trate de installar ocrmypdf en mi Linux y requiere installation the libraries en es systema operativo. Y leyendo la documentacion asi es.

Asi que decidi encontrar una libreria que sea puro python. Asi que uso pypdf2.

1
pip install PyPDF2

Y escribi este codigo parecido al tuyo, para que renombrara los files (solo cambia la ruta a tus files). Y mira a ver si funciona.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import glob
import os
from tqdm import tqdm
import time
import PyPDF2
import re
 
 
def extract_text(file_path, page_number):
    with open(file_path, mode='rb') as f:
        reader = PyPDF2.PdfReader(f)
        page = reader.pages[page_number]
        return page.extract_text()
 
 
def new_file_name_route(archivo_pdf, new_file_name):
    absolute_route = os.path.abspath(archivo_pdf)
    directory, _ = os.path.split(absolute_route)
    return os.path.join(directory, new_file_name)
 
 
if __name__ == "__main__":
 
    regex = r"N740[-\s]*([^\s-]+)"
    archivos_renombrados = []
 
    archivos_pdf = glob.glob(os.path.join(r"./pdf_files", "*.pdf"))
    archivos_totales = len(archivos_pdf)
 
    with tqdm(total=archivos_totales, desc="Processing files...") as pbar:
        for archivo_pdf in archivos_pdf:
            print(f"===> Processing file: [{archivo_pdf}]")
            text = extract_text(archivo_pdf, 0)
            print(f"===> Text is: [{text}]")
            matches = re.findall(regex, text)
 
            if matches:
                print(f"+++ Matches found: [{matches[0]}]")
                new_file_name = matches[0] + ".pdf"
 
                new_file_name = new_file_name.replace(
                    "/", "_").replace("\\", "_")
                new_route = new_file_name_route(archivo_pdf, new_file_name)
                os.rename(archivo_pdf, new_route)
 
            time.sleep(1)
            pbar.update(1)

Un bono es que el codigo es mas simple.


Suerte.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Error al ejecutar mi script en otro ordenador

Publicado por Alberto (8 intervenciones) el 04/07/2023 02:46:17
El problema de esa libreria es que no lee los pdf escaneados. Ya lo probé a hacerlo así pero cuando leí que con imagenes pdf no funcionaba lo descarté. Después use tesseract, e instalé sus archivos, pero no era del todo acertado con el texto que devolvia.
Así que opté finalmente por ocrmypdf.
Por lo que leo ocrmypdf creo que usa tesseract, y por eso en mi ordenador principal funciona ya que lo instalé anteriormente y en el de la oficina no. Crees que tiene algo que ver?
Un saludo y de nuevo gracias por tu ayuda y seguir intentandolo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Error al ejecutar mi script en otro ordenador

Publicado por Costero (92 intervenciones) el 04/07/2023 05:24:52
Si, ya probe con un scanned pdf in PyPdf no funciona.

Creo que te falta libreria in la PC del trabajo. El problema que tienes que ser administrador para instalarlos de acuerdo a la documentation.

1
2
3
4
5
6
7
8
9
10
Native Windows¶
 
Note
 
Administrator privileges will be required for some of these steps.
 
You must install the following for Windows:
    Python 3.8 (64-bit) or later
    Tesseract 4.1.1 (64-bit) or later
    Ghostscript 9.50 (64-bit) or later

Si tienes Docker en la PC entonces se puede hacer un truco. Me avisa y te digo

Suerte
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Error al ejecutar mi script en otro ordenador

Publicado por Alberto (8 intervenciones) el 06/07/2023 14:08:20
BUA, después de nose cuantos días porfin puedo decir que funciona correctamente siiiiii!!

Captura-de-pantalla-2023-07-06-140324


Captura-de-pantalla-2023-07-06-140359

Pues tenias toda la razón, el error parece ser que venia de alguno de esos 3 paquetes que no estaba instalado en administrador.
Ahora tengo que hacer esto con todos los ordenadores de la oficina, algún consejo para no tener que hacer este procedimiento o hacerlo de alguna manera más rapida?

Muchísimas gracias Costero, me estás sirviendo de gran ayuda.
PD: Déjame tu paypal para hacerte alguna donación por la ayuda.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Error al ejecutar mi script en otro ordenador

Publicado por Costero (92 intervenciones) el 07/07/2023 00:39:51
Que bueno que funciono. No te preocupes por la donacion. Lo hago para aprender y ayudar a la misma vez.

Si hacer en cada maquina seria un dolor de cabeza.

Esto lo que yo propongo. Instalas an ftp server en las otra maquinas. Entonces la maquina que hace el processo de procesar los files se conecta a estas maquinas tomando los files, processandolos y cambiando el file name.

No es dificil. El ftp server es en puro Python. Claro que Python tiene que estar instalado en las otras maquinas.

Asi que comenzamos. Escoge una maquina in instalas:


1
pip install pyftpdlib

Y corres este codigo para comenzar el servidor:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import logging
from pyftpdlib.authorizers import DummyAuthorizer
from pyftpdlib.handlers import FTPHandler
from pyftpdlib.servers import FTPServer
 
# pip install pyftpdlib
 
# cambia este directorio a donde se encuentran los files ...
file_dir = "/home/zensei/Projects/Python/miscelleneous/pdf_files"
 
authorizer = DummyAuthorizer()
authorizer.add_user(
    "user", "12345", file_dir, perm="elradfmwMT")
# authorizer.add_anonymous("/home/nobody")
 
handler = FTPHandler
handler.authorizer = authorizer
 
logging.basicConfig(filename='./pyftpd.log', level=logging.DEBUG)
 
# cambia este ip al de la maquina
server = FTPServer(("127.0.0.1", 1025), handler)
server.serve_forever()


Ahora en la maquina que tienes ocrmypdf corres el codigo similar a este...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
from ftplib import FTP
import glob
from os import path
import os
import time
 
from click import Path
 
from pdf_processor import rename_file
 
# cambia este host ip a la maquina que esta corriendo el ftp server
# En tu caso como varias vas a tener que crear un loop, para ir por cada maquina
host = "127.0.0.1"
username = "user"
password = "12345"
maximum_block_size = 18192
 
# tienes que crear este folder, sino tira error que no existe
UPLOAD_FOLDER = 'upload_files'
 
regex = r"N740[-\s]*([^\s-]+)"
 
ftp = FTP()
ftp.connect(host, 1025)
ftp.login(username, password)
files = ftp.nlst()
ftp.dir()
 
for file in files:
    full_path = f"{UPLOAD_FOLDER}/{file}"
    handle = open(full_path, 'wb')
    ftp.retrbinary('RETR %s' % file, handle.write,
                   blocksize=maximum_block_size)
 
    archivos_pdf = glob.glob(full_path)
 
    for archivo_pdf in archivos_pdf:
        f = open(archivo_pdf, "rb")
        print(len(f.read()))
 
        # aqui el rename_file(...) debe llamar a tu codigo para rename el file
        result = rename_file(archivo_pdf, regex)
        new_name = result[result.rindex("/") + 1:]
        print(new_name)
 
        # y este llama al servidor y rename el file
        ftp.rename(file, new_name)

Si te trabas me avisa.

Suerted
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Error al ejecutar mi script en otro ordenador

Publicado por Rolando José (44 intervenciones) el 27/07/2023 01:27:52
Bueno no se prompt usaste con chatgpt, pero es mas evidente que el programa no funciona, como estoy haciendo un OCR, me acuerdo bien de esa librerpia OCRmyPDF, porque es una libreria desarrollada para invitar a incautos a usar tesseract sin que lo sepan:

En el manual de ayuda de la libreria dice porque no deberia ser usada de forma manual para modificar información de pdfs protegidos o con derechos de autor.
https://buildmedia.readthedocs.org/media/pdf/ocrmypdf/latest/ocrmypdf.pdf pg 4
muchos tienen marcas de agua que retrasan y paran la libreria.

OCRmyPDF analiza cada página de un PDF para determinar el espacio de color y la resolución (DPI) necesarios para capturar todos
la información de esa página sin perder contenido. Utiliza Ghostscript para rasterizar la página y luego realiza OCR
en la imagen rasterizada para crear una "capa" de OCR. Luego, la capa se vuelve a injertar en el PDF original.
Si bien uno puede usar un programa como Ghostscript o ImageMagick para obtener una imagen y pasar la imagen a través de Tesseract,
que en realidad crea un nuevo PDF y se pueden perder muchos detalles. OCRmyPDF puede producir un PDF con cambios mínimos como
producción.
OCRmyPDF también proporciona algunas opciones de procesamiento de imágenes, como enderezar, que mejora la apariencia de los archivos y calidad de OCR. Cuando se utilizan, la capa de OCR se injerta en la imagen procesada.
De forma predeterminada, OCRmyPDF produce archivos PDF (PDF/A), que son un subconjunto más estricto de funciones de PDF diseñadas para archivos a largo plazo. Si se desean archivos PDF regulares, esto se puede desactivar con --output-type pdf.

esta biblioteca se hizo no para renombrar los pdfs sino para robar los pdfs protegidos por derechos de autor, trata de capturarlos como imagen luego lo convierten a ppm con imagemagick y de ahi tesseract los lee y trata de regenerarlos.

Logicamente implica que debes tener la licencia de tesseract funcionando y image magick o ghostscript para que funcionen bien, de lo contrario el script se va a parar y no terminara nunca.

Si tu intencion es buena y no tratar de copiar el contenido protegido, todo pfd tiene un summary que son las palabras mas comunes del pdf y te lo permite ver con pdf2html.

otra cosa que puedes hacer es tu mismo usar pdf2html pdf2html no desbloquea el pdf pero si tiene sumario te lo puede mostrar para saber las palabras mas comunes en el pdf.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Error al ejecutar mi script en otro ordenador

Publicado por Alberto (8 intervenciones) el 27/07/2023 01:59:18
Buenas noches, agradezco tu aportación, la verdad que desconocia por completo el uso que se le daba realmente a esta biblioteca me ha sorprendido.

En cuanto a lo que es el programa en si ya solucionamos el problema que tenia, faltaba instalar las aplicaciones en el nuevo ordenador con el administrador.
El programa en si funciona correctamente y me ayuda a reducir tiempos de 30 minutos en la empresa así que no veo necesario cambiar el codigo otra vez, nuevamente agradezco tu aportación.

Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar