Guía
Qué confirmaciones de reserva en PDF lee Kokai y cómo
Kokai lee en el propio dispositivo, con pdf.js y sin IA ni servidor, el texto de las 6 primeras páginas de un PDF de reserva de hasta 20 MB. Reconoce 65 marcas y 8 clases de reserva (alojamiento, vuelo, tren, autobús, barco, actividad, coche y seguro), y busca el localizador, las fechas y horas, el titular, el precio y la cancelación gratis por sus etiquetas en siete idiomas. Rellena solo lo vacío y, si es un alojamiento, añade sus noches al viaje; no lee fotos ni PDF escaneados.
En pocas palabras
- Dónde se lee
- En tu dispositivo, con pdf.js de Mozilla. Sin IA y sin mandar el fichero a ningún servidor.
- Qué parte del PDF
- El texto de las 6 primeras páginas, en ficheros de hasta 20 MB.
- Clases de reserva
- 8: alojamiento, vuelo, tren, autobús, barco, actividad, coche de alquiler y seguro de viaje.
- Marcas reconocidas
- 65, de Booking.com y Airbnb a Ryanair, Renfe, FlixBus, GetYourGuide o Europcar.
- Idiomas de las etiquetas
- Castellano, inglés, francés, italiano, portugués, catalán y alemán.
- Monedas
- 37 códigos ISO 4217 y 8 símbolos (€, £, $, US$, ¥, R$, C$, A$).
- Lo que no lee
- Fotos y PDF escaneados (no tienen texto) y PDF protegidos con contraseña.
- Única salida a la red
- La dirección de un alojamiento que no está en tu mapa, a Nominatim de OpenStreetMap, para situarlo.
Cómo funciona: texto, no imagen
Una confirmación de reserva en PDF casi siempre lleva texto de verdad dentro: el que puedes seleccionar y copiar. Kokai lo saca con pdf.js, la librería de Mozilla (licencia Apache-2.0) que usa Firefox para enseñar los PDF, y la carga solo cuando añades un PDF. Todo ocurre en el dispositivo:
- Si el fichero pasa de 20 MB, se guarda sin leer.
- pdf.js saca el texto de las 6 primeras páginas: las confirmaciones dicen lo importante arriba, y veinte páginas de condiciones no aportan nada.
- Kokai reconstruye las líneas: pdf.js da trozos de texto con su posición, y una línea termina cuando el trozo siguiente baja más de media altura de letra.
- El texto se pasa a minúsculas y sin tildes para buscar etiquetas («Número de confirmación» y «numero de confirmacion» son lo mismo), pero lo encontrado se recorta del original, así el localizador sale con sus mayúsculas.
- Se decide qué es y de quién, y se buscan los datos por sus etiquetas. No hay plantillas por proveedor, que cambian cada pocos meses.
- Si no se reconoce la clase y salen menos de dos datos, se da por no leído: «No he encontrado los datos de una reserva en el PDF. Rellénalos a mano.»
No hay reconocimiento de letras en imágenes (OCR). Una foto del billete, una captura de pantalla o un PDF escaneado se guardan y se abren sin conexión, pero no se leen. Un PDF protegido con contraseña, tampoco.
Dónde se lee un PDF en la app
| Dónde | Qué pasa |
|---|---|
| Documentos del viaje → «Añadir documento» | Al elegir el fichero se lee el primer PDF. El tipo y el título se proponen solos, salvo que ya los hayas tocado. Al pulsar «Guardar» se aplican el localizador, las fechas, el titular y las etiquetas. |
| Ficha de un documento → «Añadir» | Se lee el PDF añadido y se rellena lo que esté vacío. La ficha dice qué ha rellenado y pide «Revisa que esté bien.» |
| Alojamiento → «Desde el PDF de la reserva» | Crea el documento, lo lee y, si es un alojamiento con fechas, añade sus noches. Si es otra cosa, lo deja en Documentos con su tipo. |
| Cartera | No se lee: la cartera guarda pasaporte, DNI o seguro anual, no reservas. |
En Documentos, mientras lee, la app dice «Leyendo el PDF en este dispositivo…» (en Alojamiento, «Leyendo el PDF…»). Lo que ha entendido sale en una línea que empieza por «Leído en este dispositivo:». Más sobre los documentos en Documentos de viaje sin conexión.
Las 8 clases de reserva
Cada clase decide el tipo de documento, la etiqueta que se pone y qué etiquetas se buscan para las fechas. Para reconocerla cuentan palabras típicas, cada una una sola vez aunque se repita:
| Clase | Tipo de documento | Etiqueta | Palabras que cuentan (ejemplos) |
|---|---|---|---|
| Alojamiento | Reserva | «Alojamiento» | check-in, check-out, «3 noches» (nights, nuits, notti, noites, nits, Nächte), habitación, huésped, hotel, hostal, apartamento, anfitrión (8 grupos) |
| Vuelo | Billete | «Vuelo» | boarding o embarque, gate, asiento o seat, vuelo o flight, aeropuerto, equipaje, «Terminal 2» (7 grupos) |
| Tren | Billete | «Tren» | tren, train o Zug; estación, stazione o Bahnhof; «coche 5», vagón, carriage; andén, platform, quai, binario, Gleis (4 grupos) |
| Autobús | Billete | «Autobús» | autobús, bus, autocarro; estación de autobuses; dársena (3 grupos) |
| Barco | Billete | «Barco» | ferry, barco, naviera; camarote o cabin; «puerto de»; vehículo embarcado (4 grupos) |
| Actividad | Entrada | «Actividad» | entradas o tickets; tour, visita guiada, excursión; voucher, bono, código QR; punto de encuentro (4 grupos) |
| Coche | Coche y conducción | «Coche de alquiler» | recogida o pick-up; devolución o drop-off; vehículo; alquiler o rental; conductor o driver; fianza, franquicia o deposit (6 grupos) |
| Seguro | Seguro | «Seguro de viaje» | póliza o policy; asegurado o insured; cobertura o coverage; seguro de viaje o travel insurance (4 grupos) |
Las 65 marcas que reconoce
Una marca reconocida pone su etiqueta en el documento («Booking.com», «Renfe») y pesa mucho al decidir la clase. Si la tuya no está, la reserva puede leerse igual por sus palabras y sus etiquetas: solo falta la etiqueta del proveedor.
| Clase | Marcas | Cuántas |
|---|---|---|
| Alojamiento | Booking.com, Airbnb, Expedia, Hotels.com, Vrbo, Agoda, Trip.com, Hostelworld, Marriott, Hilton, Accor, Meliá, NH Hotels, Paradores | 14 |
| Vuelo | Ryanair, Vueling, Iberia, Air Europa, easyJet, TAP Air Portugal, Volotea, Binter, Lufthansa, Air France, KLM, British Airways, Wizz Air, Transavia, ITA Airways | 15 |
| Tren | Renfe, Iryo, Ouigo, SNCF, Trenitalia, Italo, Deutsche Bahn, Eurostar, Comboios de Portugal | 9 |
| Autobús | FlixBus, ALSA, BlaBlaCar | 3 |
| Barco | Baleària, Trasmed, Naviera Armas | 3 |
| Actividad | GetYourGuide, Tiqets, Civitatis, Viator, Klook, Musement, Ticketmaster | 7 |
| Coche | Hertz, Avis, Europcar, Sixt, Enterprise, Goldcar, Rentalcars.com, Discover Cars, Cicar | 9 |
| Seguro | IATI Seguros, Heymondo, InterMundial, Mondial Assistance, Allianz Travel | 5 |
Algunas marcas solo cuentan con su forma completa, porque su nombre suelto es una palabra corriente: «Booking.com» o «Booking B.V.» (booking es «reserva» en inglés), «Italo Treno», «Enterprise Rent-A-Car», «Avis Budget» o «alsa.es». El nombre suelto («booking», «alsa», «avis») es una mención débil.
Cómo decide qué es y de quién
La clase y el proveedor salen de una cuenta de puntos, la misma para todos los PDF:
| Qué suma | Puntos |
|---|---|
| Cada vez que sale el nombre completo de una marca (cuentan hasta 3) | 5 |
| Cada mención débil además del nombre completo (hasta 3) | 1 |
| La marca en el nombre del fichero («Airbnb_reserva.pdf») | 5 |
| Cada grupo distinto de palabras típicas de la clase | 2 |
- La puntuación de una clase es la de sus palabras más la de su mejor marca.
- Gana la clase con más puntos, y solo si tiene al menos 4: dos palabras típicas bastan (un hotel sin plataforma se reconoce como alojamiento), un «hotel» suelto no.
- El proveedor se nombra si su marca, de esa clase, tiene al menos 5 puntos: tiene que salir su nombre completo, o llevarlo el nombre del fichero. Tres menciones débiles suman 3 y no bastan.
Qué datos saca
| Dato | Cómo lo encuentra | Dónde acaba |
|---|---|---|
| Localizador | Lo que va tras una etiqueta de localizador: de 4 a 25 letras, cifras, puntos o guiones, sin minúsculas y con alguna cifra, o de 5 a 8 mayúsculas (un PNR). | «Referencia o localizador» |
| Titular | Una línea que empieza por una etiqueta de titular. Solo letras, espacios, puntos, guiones y apóstrofos, de 2 a 60 caracteres. | «A nombre de» |
| Fecha y hora de inicio | La primera fecha en los 90 caracteres tras la etiqueta de entrada, recogida, ida o inicio de la clase. | «Desde», y en la estancia la hora de entrada |
| Fecha y hora de fin | Igual, con la etiqueta de salida, devolución, vuelta o fin. Tiene que ser posterior al inicio. | «Hasta», y en la estancia la hora de salida |
| Precio y moneda | El importe en los 45 caracteres tras «Precio total» y sus variantes; si no hay, tras «Total»; y si no, tras «Precio». | La estancia del alojamiento |
| Cancelación gratis | La primera fecha en los 110 caracteres tras «Cancelación gratuita» o sus variantes. | La estancia, con sus recordatorios |
| No reembolsable | La expresión en cualquier parte, si no hay cancelación gratis. | Las notas: «No reembolsable.» |
| Nombre del alojamiento | Tras «Nombre del alojamiento» y variantes; si no, la línea sobre la dirección (así lo pone Booking.com); si no, la primera línea de varias palabras y sin cifras de las 10 primeras. | El título y el sitio del mapa |
| Dirección | Tras «Dirección» y variantes; si no, una línea de las 60 primeras con al menos dos comas, alguna cifra y sin fechas, precios ni enlaces. | El sitio del mapa |
| Teléfono | Tras «Teléfono», «Phone», «Tel» o «Telefon». | El sitio del mapa |
| Número de vuelo | Dos caracteres de aerolínea y 3 o 4 cifras («FR 1234»). | El título: «Vuelo FR1234» |
El título se compone según la clase: el nombre del hotel (o «Alojamiento de Booking.com» si no sale), «Vuelo» con su número, o la clase y el proveedor («Tren · Renfe»).
Las etiquetas que reconoce, idioma por idioma
Se buscan sin distinguir mayúsculas ni tildes. Un guion significa que ese idioma no tiene una forma propia en la lista (a menudo coincide con otro: el catalán «número de reserva» es la forma castellana).
| Dato | Castellano | Inglés | Francés | Italiano | Portugués | Catalán | Alemán |
|---|---|---|---|---|---|---|---|
| Entrada (alojamiento) | check-in, entrada, llegada | check-in, arrival | arrivée | arrivo | chegada | entrada | Anreise |
| Salida (alojamiento) | check-out, salida | check-out, departure | départ | partenza | saída | sortida | Abreise |
| Ida (billetes) | salida, ida, fecha, fecha de viaje, de vuelo o de salida | departure, outbound, date | départ | partenza, data | data | data | — |
| Vuelta (billetes) | vuelta, regreso | return | retour | ritorno | — | tornada | — |
| Recogida (coche) | recogida | pick-up | prise en charge | ritiro | retirada | — | Abholung |
| Devolución (coche) | devolución, entrega | drop-off, return | restitution | riconsegna | entrega | — | Rückgabe |
| Inicio y fin (seguro) | desde, inicio, fecha de efecto / hasta, fin, vencimiento | from, start date, effective / to, end date, valid until, expiry | — | — | — | — | — |
| Día (actividad) | fecha, día, válido para | date, day, valid on, valid for | — | data | data | data | — |
| Localizador | localizador, referencia, número o código de reserva, número de confirmación, número de pedido | booking number, booking reference, confirmation number, confirmation code, reservation number, order number, PNR, record locator | numéro de réservation, code de réservation | codice prenotazione | número da reserva, código da reserva | — | Reservierungsnummer, Buchungsnummer |
| Precio total | precio total, importe total, total a pagar, total pagado | total price, total amount, amount paid, grand total | montant total, prix total | prezzo totale | preço total | preu total | Gesamtpreis, Gesamtbetrag |
| Cancelación gratis | cancelación gratuita, cancelar gratis, cancelar sin coste, sin cargo o sin gastos | free cancellation, cancel for free, cancel free of charge, cancel without charge | annulation gratuite, annuler gratuitement | cancellazione gratuita | cancelamento gratuito | cancel·lació gratuïta | kostenlose Stornierung, kostenlos stornieren |
| No reembolsable | no reembolsable | non-refundable | non remboursable | non rimborsabile | não reembolsável | no reemborsable | nicht erstattungsfähig |
| Dirección | dirección, dirección del alojamiento, ubicación | address, property address | adresse | indirizzo | morada, endereço | adreça | Anschrift |
| Nombre del alojamiento | nombre del alojamiento, alojamiento, establecimiento, anuncio, hotel | property name, hotel name, property, accommodation, listing | hébergement, établissement | struttura | alojamento | allotjament | Unterkunft |
| Titular | nombre del cliente, del huésped o del titular, huésped principal, reservado por, pasajero, conductor principal, asegurado | guest name, lead guest, booked by, passenger, main driver, insured | nom du client | — | nome do hóspede | nom del client | — |
El precio, además, se busca por último tras la palabra suelta en cualquiera de los siete idiomas: precio, price, importe, amount, montant, prix, prezzo, preço, preu.
Fechas y horas
| Formato | Ejemplos que lee | Regla |
|---|---|---|
| ISO 8601 | 2026-10-09 | Año, mes y día. |
| Numérico | 09/10/2026, 9.10.26, 09-10-2026 | Día y mes, como en casi todo el mundo. Mes y día solo si no puede ser otra cosa: 10/25/2026 es el 25 de octubre. |
| Con palabras | 9 de octubre de 2026, October 9, 2026, 9. Oktober 2026, 9 d'octubre de 2026, vie, 9 oct | Meses y sus abreviaturas en los siete idiomas, con ordinales («3rd», «1er», «1º»). |
| Sin año | vie, 9 oct | Se elige el año (el anterior, el mismo o el siguiente) que deja la fecha más cerca del inicio del viaje, o de hoy si el viaje aún no tiene fechas. |
- Las abreviaturas que también son palabras (out, des, set, gen, mag, lug, ott, mai, mar) solo cuentan como mes si llevan año detrás: «3 out of 5 guests» no es el 3 de octubre.
- En una tabla con «Check-in Check-out» en una línea y las dos fechas debajo, la primera fecha tras «Check-out» es la de entrada, y se salta.
- Si no hay etiqueta, se usa la primera fecha que no vaya detrás de «fecha de reserva», «emitido», «booked on», «fecha de nacimiento» o «caduca». En un seguro, no se adivina.
- Un alojamiento con «3 noches» y sin fecha de salida legible: la salida se calcula sumando las noches a la entrada.
- Una fecha de fin a más de 62 días del inicio se descarta: es otra fecha que se ha colado.
- Horas: 15:00, 15h00, 3:00 PM o 3 PM. En la hora de inicio gana la que va con «desde», «from» o «a partir de»; en la salida de un alojamiento, la última con «hasta», «until» o «before»: «de 07:00 a 11:00» es salida hasta las 11:00.
Precio y moneda
La moneda sale del símbolo o del código junto al importe, delante o detrás («€ 390,00», «390,00 EUR»), o del código entre paréntesis tras «Total (EUR)». Reconoce 37 códigos ISO 4217:
EUR USD GBP JPY CHF CAD AUD MXN ARS COP CLP PEN BRL DKK SEK NOK PLN CZK HUF
RON BGN TRY MAD THB CNY HKD SGD NZD ZAR INR KRW ISK IDR VND EGP AED ILS| Símbolo | Se lee como |
|---|---|
| € | EUR |
| £ | GBP |
| $ y US$ | USD |
| ¥ | JPY |
| R$ | BRL |
| C$ | CAD |
| A$ | AUD |
Los separadores se interpretan como en cada país: 1.234,56 y 1,234.56 son lo mismo, 1 234,56 también, «1.234» son mil doscientos treinta y cuatro y «12,50» son doce con cincuenta.
Un «$» suelto se lee siempre como dólar estadounidense y un «¥», como yen. Si reservas en pesos mexicanos o en yuanes y el PDF solo pone el símbolo, corrige la moneda en la estancia. Si no hay moneda, la estancia toma la del viaje.
Qué hace con lo que lee
La regla es una: nunca pisa lo que alguien ha escrito.
- En un documento nuevo, si cambias el tipo o el título mientras se lee, se queda lo tuyo. Si cambias el tipo que se leyó (una «Reserva» que pasas a «Entrada»), no se ponen las etiquetas de la lectura.
- En un documento que ya existe, solo se rellenan el localizador, el titular y las fechas si están vacíos, y el tipo solo si era «Otro». Si el tipo leído es distinto, la ficha ofrece «Cambiar el tipo a…» sin cambiarlo.
- Se añaden dos etiquetas, la del proveedor y la de la clase («Booking.com» y «Alojamiento»), sin quitar las que tenía.
Si es un alojamiento con entrada y salida, y el documento es una reserva, se asocia a una estancia, las noches de ese hotel en el viaje:
- Si ya hay una estancia enlazada a ese documento, se completa (horas, precio, cancelación) sin tocar lo que tenga.
- Si no, se busca el hotel: el sitio relacionado del documento o un alojamiento del mapa con el mismo nombre (al menos el 60 % de las palabras en común, sin contar «hotel», «apartamento», «de» o «the»).
- Si ese hotel tiene una opción sin documento enlazado que coincide con esas noches, pasa a reservada, con el documento enlazado y las fechas del PDF.
- Si el hotel no está en el mapa, su dirección va a Nominatim (el buscador de OpenStreetMap), o su nombre dentro de la zona del destino. Si ya tienes un alojamiento a menos de 150 m de lo encontrado, es ese; si no, se crea el sitio con su dirección y su teléfono, y se buscan sus fotos.
- Si no había opción, se crea una estancia reservada nueva, en ese sitio si se ha encontrado. Sin red, o si Nominatim no encuentra nada, queda sin situar, con su nombre, y se sitúa luego a mano.
Con la estancia llegan los recordatorios del alojamiento: cancelar gratis, «Mañana duermes en…» y «Hoy dejas…» (tabla completa en Documentos). Si un documento de reserva tiene fechas pero no se asoció, su ficha ofrece «Es un alojamiento: añadir estas noches».
Nominatim recibe solo el texto de la dirección (o el nombre del hotel y la zona), con un mínimo de 1,1 segundos entre peticiones, como pide su política de uso. Nunca el localizador, el titular ni el precio.
Ejemplo: una confirmación de Booking.com para Lisboa
Limitaciones
- Fotos y escaneados, no. Solo se lee texto; no hay OCR.
- Probado con textos de ejemplo, no con confirmaciones reales de cada proveedor. Las pruebas imitan lo que pdf.js saca de Booking.com (en castellano y en inglés, con tabla), Airbnb (en los dos idiomas), un hotel sin plataforma, Ryanair, Renfe y Europcar, y un PDF generado se lee de principio a fin. Con cada una de las 65 marcas, no se ha probado.
- Un PDF con el texto desordenado (columnas que pdf.js entrega en otro orden) puede dejar las etiquetas lejos de sus valores, y el dato no sale.
- Solo un billete por documento. Un PDF de ida y vuelta da la fecha de ida y la de vuelta, pero no dos documentos, ni escalas.
- Solo el primer PDF cuando eliges varios ficheros a la vez al crear un documento.
- Todo lo leído se puede corregir. Mira siempre la ficha: la app lo pide con «Revisa que esté bien.»
Si tu reserva no se ha leído bien
Corrige los datos a mano en la ficha: se guardan solos y la lectura no vuelve a pisarlos. Y si quieres que la próxima versión la lea mejor, cuéntalo en el formulario de contacto con el motivo «Una reserva en PDF que no se ha leído bien». Ayuda decir:
- El proveedor y el idioma de la confirmación.
- Qué dato ha fallado (la fecha de salida, el precio, el nombre del hotel) y qué ponía el PDF junto a ese dato, con la etiqueta tal cual.
- Si el PDF es un correo impreso, una descarga de la web del proveedor o una tarjeta de embarque.
No pegues localizadores, nombres, direcciones ni números de tarjeta reales: cámbialos por datos inventados antes de enviarlo («XXXX1234», «Ana Ejemplo»). El formulario no admite adjuntos, y no hace falta el PDF: basta con las líneas que fallan.
Preguntas frecuentes
¿Se sube el PDF a algún servidor para leerlo?
No. Se lee en tu dispositivo con pdf.js, sin IA y sin conexión. Lo único que puede salir es la dirección de un alojamiento que no está en tu mapa, hacia Nominatim de OpenStreetMap, para situarlo; el fichero, el localizador y el titular no salen.
Mi proveedor no está entre las 65 marcas. ¿Se lee igual?
Puede. La clase se reconoce también por sus palabras (dos grupos bastan, como «check-in» y «habitación»), y los datos se buscan por sus etiquetas, no por el proveedor. Lo que falta es la etiqueta con el nombre de la marca.
¿Lee billetes de avión y tren, o solo hoteles?
Las 8 clases: alojamiento, vuelo, tren, autobús, barco, actividad, coche y seguro. Solo los alojamientos crean noches en el viaje; un billete se queda como documento con su fecha, su hora, su localizador y, si tiene número de vuelo, el título «Vuelo FR1234».
¿Por qué ha puesto un año equivocado?
Si la confirmación no escribe el año («vie, 9 oct»), se elige el que deja la fecha más cerca del inicio del viaje, o de hoy si el viaje no tiene fechas. Pon las fechas del viaje antes de añadir las reservas, o corrige la fecha en la ficha.
¿Puedo leer un PDF protegido con contraseña?
No. Se guarda igual y se abre en el visor si tu dispositivo lo permite, pero los datos se rellenan a mano.
Fuentes y referencias
La documentación original de lo que se cita aquí, consultada en la fecha de revisión de esta página.
- PDF.js Mozilla
- Repositorio de PDF.js (código y licencia Apache-2.0) Mozilla, en GitHub
- ISO 4217, códigos de moneda (agencia de mantenimiento) SIX Group
- Nominatim Usage Policy OpenStreetMap Foundation
- Nominatim: Search API Nominatim
Sigue leyendo
- DocumentosCómo guarda Kokai billetes, reservas y pasaporte con su PDF o foto para abrirlos sin red, qué avisa antes de que caduquen y qué no sale del dispositivo.
- AlojamientoCómo Kokai organiza el alojamiento por noches: reservas, opciones sin decidir, huecos y dobles reservas, avisos de cancelación y la dirección del hotel sin red.
- Buscar alojamientoCómo construir el enlace de búsqueda de Booking.com, Airbnb, Expedia, Vrbo, Agoda, Trip.com, Kayak y Google Hoteles con destino, fechas y viajeros, y ejemplos.
- GlosarioQué es una geovalla, una estancia, un localizador, la histéresis del GPS o un PMTiles: 35 términos de viajes y mapas, con las cifras que usa Kokai.