# 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.

- Dirección: https://kokai.app/pdf-de-reservas/
- Revisado el: 2026-09-17
- Idioma: es-ES

## 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:

1. Si el fichero pasa de 20 MB, se guarda sin leer.
2. 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.
3. 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.
4. 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.
5. 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.
6. 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](https://kokai.app/documentos/).

## 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.

### Ejemplo: Una tarjeta de embarque de Ryanair con un anuncio de Booking.com

Al pie de la tarjeta de embarque sale «Need a hotel? Book with Booking.com and save». Por marcas, Booking.com gana: 5 puntos por su nombre y 1 por «Booking reference», contra 5 de Ryanair. Pero las clases suman también las palabras:

| Clase | Palabras | Mejor marca | Total |
| --- | --- | --- | --- |
| Vuelo | 3 grupos (boarding, seat, flight) × 2 = 6 | Ryanair, 5 | **11** |
| Alojamiento | 1 grupo (hotel) × 2 = 2 | Booking.com, 6 | 8 |

Sale **vuelo**, con Ryanair como proveedor, las etiquetas «Ryanair» y «Vuelo», y el título «Vuelo FR1234» sacado del número de vuelo.

## 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](https://kokai.app/glosario/), las noches de ese hotel en el viaje:

1. Si ya hay una estancia enlazada a ese documento, se completa (horas, precio, cancelación) sin tocar lo que tenga.
2. 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»).
3. 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.
4. 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.
5. 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](https://kokai.app/documentos/#caducidad-y-avisos)). 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

### Ejemplo: Tres noches en Alfama, del 9 al 12 de octubre de 2026

Este es el texto que pdf.js sacaría de una confirmación de Booking.com en castellano. El hotel, la dirección, el teléfono, el localizador y la persona son **inventados**:

```
Booking.com
Confirmación de la reserva
Hotel Ejemplo do Tejo
Rua do Exemplo 10, Alfama, 1100-000 Lisboa, Portugal
Teléfono: +351 000 000 000
Número de confirmación: 0000.111.222
Entrada
viernes, 9 de octubre de 2026
desde las 15:00
Salida
lunes, 12 de octubre de 2026
hasta las 11:00
Tu reserva
3 noches, 1 habitación
Precio total
€ 390,00
Cancelación gratuita hasta el 7 de octubre de 2026 23:59
Nombre del cliente: Ana Ejemplo
```

Y esto es lo que devuelve el reconocedor de Kokai con ese texto (comprobado ejecutándolo):

- **Proveedor y clase:** Booking.com · Alojamiento (tipo «Reserva»). Alojamiento suma 11 puntos: 5 por «Booking.com» y 3 grupos de palabras (3 noches, habitación, hotel) × 2. Actividad solo suma 2, por la palabra «Entrada».
- **Etiquetas:** «Booking.com» y «Alojamiento»
- **Título:** Hotel Ejemplo do Tejo (la línea sobre la dirección)
- **Localizador:** 0000.111.222
- **Titular:** Ana Ejemplo
- **Entrada:** 2026-10-09, desde las 15:00
- **Salida:** 2026-10-12, hasta las 11:00
- **Precio:** 390 EUR (130 € por noche en Alojamiento)
- **Cancelación gratis hasta:** 2026-10-07
- **Alojamiento:** Rua do Exemplo 10, Alfama, 1100-000 Lisboa, Portugal · +351 000 000 000

Al guardarlo, se crea la estancia reservada de las noches del 9, el 10 y el 11. Como la dirección es inventada, Nominatim no la encontraría y la estancia quedaría sin situar; con una dirección real, el hotel aparece en el mapa. Los recordatorios quedarían así:

- 5 de octubre, 10:00: «Puedes cancelar gratis «Hotel Ejemplo do Tejo» hasta el…»
- 7 de octubre, 10:00: «Hoy es el último día para cancelar gratis…»
- 8 de octubre, 18:00: «Mañana duermes en «Hotel Ejemplo do Tejo»», con la hora de entrada y el localizador.
- 12 de octubre, 9:00 (dos horas antes de las 11:00): «Hoy dejas «Hotel Ejemplo do Tejo»».

## 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](https://kokai.app/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.

## Cómo comprobarlo tú

1. Abre un viaje con fechas y entra en «Alojamiento».
2. Pulsa «Desde el PDF de la reserva» y elige la confirmación en PDF de un hotel. Mientras lee sale «Leyendo el PDF…».
3. Si es un alojamiento, sale «Leído en este dispositivo:» con el nombre y las noches, y la estancia aparece en la franja de noches.
4. Ve a «Documentos» y abre el documento creado: el localizador, las fechas y las etiquetas del proveedor y la clase ya están puestos.
5. Prueba en «Documentos» con «Añadir documento» y un billete de tren o avión: el tipo pasa a «Billete» y el título se propone solo.

## 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

- [PDF.js](https://mozilla.github.io/pdf.js/) — Mozilla
- [Repositorio de PDF.js (código y licencia Apache-2.0)](https://github.com/mozilla/pdf.js) — Mozilla, en GitHub
- [ISO 4217, códigos de moneda (agencia de mantenimiento)](https://www.six-group.com/en/products-services/financial-information/market-reference-data/data-standards.html) — SIX Group
- [Nominatim Usage Policy](https://operations.osmfoundation.org/policies/nominatim/) — OpenStreetMap Foundation
- [Nominatim: Search API](https://nominatim.org/release-docs/latest/api/Search/) — Nominatim

