Feda /dev/ - No Javascript allowed

Normas
spoiler
Personas non gratas
Memes feda dev




desu

#46650 los hahas van en mayúscula.

Así

HAHAHAHAHAHAHAAH

HAHAHAHAHAHAHHAHAHAHA

De nada

6
TMZ

#46648 Me sorprende que Desu no odie a éste más que a Midu. Midu es cáncer, pero aún siendo malo al menos programa algo... El mono éste directamente no sabe programar.

Pero te vende un curso de nosequé y otro de nosecuantos para trabajar en silicon valley en 2 semanas. Es el timo de la estampita pero con indígenas.

1
aren-pulid0

@TheBrotha

1
isvidal

Hago bizum de 500 euros, si alguien me da el codigo para sacar los QR de un pdf y validamos que funcione para mi problema.

Los pdfs son facturas de luz, y todas por ley tienen un QR que lleva a la pagina de la CNMC.

Esta mierda es una chorrada de 20 lineas pero no consigo dar con la solucion, no de 50 horas ni nada, pero no doy con la tecla.

Keypoints:

  • Cada pdf tiene el qr en un sitio diferente
  • Los pdfs son multi paginas
  • Si bien hablo de PHP estoy tirando comandos directamente sobre terminal utilizando ghostscript para hacer las conversiones (osea, no hace falta ni que sepais php).
  • La conversion es el primer pain point, pues los qr se pasan con lineas blancas verticales y horizontales que hacen que muchos lectores no lo reconozcan.
  • Despues de intentar esto durante unas 8 horas, la solucion creo que pasa, primero, por identificar el area del pdf donde esta el QR, extraer toda esa zona, no hace falta que sea muy preciso, ese cacho del pdf ya funcionaria, y luego intentar la conversion que no genere esos artefactos ( he conseguido eso, pero con muchos hacks).
  • Para pillar coordenadas del pdf se puede usar esta frase o palabras de esta frase que siempre estan cerca del QR: "Código QR y enlace https://comparador.cnmc.gob.es para acceder al Comparador de Ofertas de la CNMC:"

Aqui os pego una foto que si funciona:

TLDR: 500 euros de recompensa para quien me de la chorri solucion para dado un pdf, buscar las coordenadas (Quizas buscando por keywords) donde cortar que mas o menos incluyan el QR, esto a poder ser en PHP, y luego usar esas coordenadas para cortar ese trozo de pdf y pasarlo a un formato de imagen que no tenga artefactos y el qr sea legible en el 90% de los casos ya lo compro.

Si alguno esta interesado y no tiene factura de luz a mano le puedo pasar por mp.

1 respuesta
Wei-Yu

en vez de buscar palabras convierte el pdf a una imagen y navega la imagen por coordenadas haciendo scans con la utilidad de qr de turno que uses

imagino que lo peor aquí sería pillarle el punto a las dimensiones del qr+cuadrante en la que lees el qr, pero fuera de eso debería ser fácil

edit* puedes hacer mocks en imágenes rápido para buscar cuándo es irreconocible el qr y tener los corner case de empresa julian poniendo el qr en 3 pixels

1
Slowbro

#46654 Lo que dice el vegano parece sencillo

https://github.com/yakovmeister/pdf2image
https://github.com/MikhailGordeev/QR-Code-Extractor
Algo para leer el QR

isvidal

Tengo algo ultra hack que esta funcionando

He conseguido convertir el pdf a png sin que se joda el QR, para ello tengo que pasarla a png con fondo transparente con un codigo que ni entiendo, os prometo que la tipica conversion como la de pdf2image de @46656 por alguna puta razon jode el qr (Genera como lineas blancas) (El iphone lo pilla, pero la mayoria de scaneres que he probado no).
Luego la convierto a png y le meto un fondo blanco de vuelta
Luego la corto la imagen por rows, aqui hay mucho riesgo, pues puedo estar cortando justo el qr por la mitad, lo que puedo hacer es si una falla cortar con otras dimensiones de fallback hasta que alguna me de, 0 optimo, pura mierda, pero whatever.

Aqui el ejemplo del qr jodido que estoy diciendo:

1 1 respuesta
Dr_Manhattan

#46657 lo tengo hecho en python, le metes un pdf entero, detecta el qr esté donde esté y te saca lo que quieras. Lo he hecho usando OpenCV

Te paso mi cuenta?

1 1 respuesta
Wei-Yu

creo que ya lo puse pero como es relevante y está guay

cómo se lee un QR

https://typefully.com/DanHollick/qr-codes-T7tLlNi

1
isvidal

#46658 Me mata un poco en python porque no tengo la infra montada, pero creo que tarde o temprano voy a tener que montar infra en python para hacer scrapping, asi que lo vemos y si es optimo y me funciona sin problema te hago bizum

1 respuesta
Dr_Manhattan

#46660 con un server linux de 3 euros vas que te matas

1 respuesta
isvidal

#46661 No es eso, lo quiero hacer bien, montar el repo, prod/dev con sus pipelines a las maquinas de digital ocean que despleguen, y luego meterle cron, pues sera en su mayoria trabajos behind de scenes lo de python, ya meter un script.py es un segundo

isvidal

Esto funciona xd, a los monstruos no mirar

$dir = __DIR__;

    $pdfFilePath = __DIR__ . '/endesa.pdf';

    $imagick = new Imagick();
    $imagick->setResolution(200, 200);
    $imagick->setOption('pdf:use-cropbox', 'true');
    $imagick->setOption('pdf:use-trimbox', 'true');
    $imagick->setOption('pdf:use-cropbox', 'true');
    $imagick->setOption('pdf:use-transparency', 'true');
    $imagick->setOption('pdf:fit-page', '595x842');

    $imagick->readImage($pdfFilePath);
    $imagick->setImageFormat('png');
    $imagick->setImageCompressionQuality(50);

    foreach ($imagick as $pageNumber => $page) {
        $p = ($pageNumber + 1);
        $outputFilePath = __DIR__ . '/test/output_' . $p . '.png';
        $page->writeImage($outputFilePath);

        exec("convert $dir/test/output_$p.png -background white -alpha remove -alpha off $dir/test/output_w_$p.png");

        exec("convert $dir/test/output_w_$p.png -crop 2480x800 $dir/cut/cut_$p%03d.png");
        foreach (scandir("$dir/cut") as $value) {
            if (str_contains($value, 'cut')) {
                $qrcode = new QrReader("$dir/cut/$value");
                $text = $qrcode->text();
                if ($text) {
                    return $text;
                }
            }

        }
    }

Ahora es jugar con el 2480x800 para cambiar ese valor en caso de que el primer tiro al pdf no te pille nada, es un poco una gran mierda porque estamos hablando de 5-8 segundos de request, y si va de primeras xd

1 respuesta
Dr_Manhattan

Yo he estado haciendo pruebas, me funciona con facturas de la luz, con el impuesto de suma de circulación del coche, te lo dejo barato

desu

#46663 usa libvips que es mejor que esa libreria que usas, puedes tirarlo por cli. tienes un pdf, vectoriza el pdf lo guardas en png y luego lee el qr. no necesitas recortar y no perderas calidad del qr.

ya tienes mi bizum para los 500 euros.

literalmente son 3 lineas en la cli.

para cosas con pdfs y otros formatos de documentos usa unipdf.

1 1 respuesta
isvidal

#46665 Pasame las tres lineas, si me funciona te hago el bizum, lo de php que he compartido antes no me funciona lo suficientemente bien

1 respuesta
Wei-Yu

esos 30 minutos de toque certificado valen mucho más que 500e

Yekale7

#46666 Pasa PDF, tengo curiosidad porque no debe ser dificil

TheBrotha

Pago un kebab al que me encuentre curro, menú si me llevo algo por el referral

1 respuesta
laZAr0

Por 500€ no me levanto del sofá, si tuviese que hacerlo gratis y con un par de insultos o menosprecios mediante, me sentiría más cómodo.

_Rpv

#46669 Empiezas el lunes, camarero de eventos en Irlanda.
11.5e/h más 15% del service charge.

No has especificado de que tiene que ser el curro ni dónde, manda kebab

isvidal

Pues lo he sacado xd. + 15 horas con esta mierda, hacia tiempo que no me daba tantas ostias con algo, gracias a @desu por ponerme sobre la pista de Vips la verdad es que lo desconocia, al final el proceso es similar que usando ghostscript + imagick, la diferencia es que es vips es muchisimo mas performant, asi que si la primera pasada falla, puedes hacer otra y aun asi en el peor pdf no pasas de los 10 segundos max, y sin comer espacio ni tantisima memoria.

Lo que hago, convierto el pdf a jpg, usando:

 exec("vipsthumbnail -s 4000 -o output.jpg factura.pdf[page=$page]"); 

Esto me seguia dando problemas con artefactos en el qr, pero poniendo una resolucion de 4000 pixeles parece que ya todos se lo comen.

Luego parto esta imagen del pdf en rows:

                exec("vips extract_area $tempDir/$tempName.jpg $tempDir/$height.1.$tempName.cut.jpg 0 1000 2800 $height");
                exec("vips extract_area $tempDir/$tempName.jpg $tempDir/$height.2.$tempName.cut.jpg 0 2000 2800 $height");
                exec("vips extract_area $tempDir/$tempName.jpg $tempDir/$height.3.$tempName.cut.jpg 0 3000 2800 $height");

Aqui primero pruebo con 1200 de height, si no pillo nada, vuelvo a probar con 1000 de height, asi todos los pdfs que he probado (iberdrola, endesa, holaluz, totalenergy, energiaxiii) los pasa, la mayoria con 1200 pero alguno que con 1000.

Esto antes no podia hacerlo pues imagick + ghostcript es lentisimo de cojones y necesitaba millones de ram + me tiraba timeout por +30s, pero ahora si puedo, y incluso cabe como para meter otro tercero en caso de que algun pdf de alguna compañia falle.

El mierdi codigo entero:

NSFW

No le importa a nadie, pero aqui estamos de sabado JAJAJA

frekaice

Suerte que @desu es nuestro Ingeniero de verdad

1 respuesta
isvidal

La documentacion es horrible, lo peor y lo mejor de esto, es que es mejor usar chat gpt que intentar buscar en la docu oficial de vips,

lo peor de chat gpt es cuando se inventa un metodo, y vuelves a decirle que es subnormal que ese metodo no existe:

1 respuesta
JuAn4k4

#46674 Si lees el PDF como PDF lo más seguro es que el QR sea una imagen dentro del mismo separada. Seguramente sea más performant leer el PDF y probar una a una las imágenes contenidas en el, y sacar la imagen del QR en su formato original, decodificarla y guardar no el QR sino la URL, y ya con la URL puedes generar tu el QR, y así se leen en cualquier dispositivo.

La última idea de decodificar tú el QR en el código te vale para ti solución con rallitas también

Note: Es posible que la imagen tenga metadata en el PDF con el nombre con QR, yo probaría esas primero y lo mismo te sacas el QR en <1s

1 respuesta
isvidal

#46675 ya probe lo de sacar las imagenes, y no, en muchos pdfs no es una imagen :(

1 respuesta
RomanAbrazos

la pregunta real es como ayuda eso a la arquitectura hexagonal

1
desu

#46673 obviamente que soy el mejor

tan obvio como los 500 euros esos no iban a llegar a mi cuenta

todas estas librerías de imágenes y documentos son una porquería

da igual el formato el encoding la gran mayoria hacen múltiples copias de buffer intérnamente y múltiples compresiones

lo mejor para el rendimiento es coger libvips en c y hacer tu la función exacta de lo que quieres dentro de la librería

1 respuesta
JuAn4k4

#46676 Vaya castaña, si estáis dispuestos a pagar licencia de aspose te hacen todo ellos: https://blog.aspose.com/barcode/python-qr-code-reader/

Aunque yo creo que en vez de cortar por filas el pdf le pasas el png de la página entera al QR reader te valdría, y la resolución la calculas para que sea suficiente para leer el QR a tu lector y luego ya generas un QR a mano tú con el valor.

1 respuesta
isvidal

#46679 lo de un png de pagina entera fue lo primero que probe obvio, pero con la libreria de mierda que manejo en php no lo lee