> ## Documentation Index
> Fetch the complete documentation index at: https://docs.doconda.com/llms.txt
> Use this file to discover all available pages before exploring further.

# ¿Cómo revisar un PDF por código antes de enviarlo?

> Pasa el PDF con operation review: sin IA, Doconda devuelve el PDF arreglado y un informe con cada problema y su página.

Para revisar un PDF por código, súbelo y pide `operation: "review"`. Sin IA, Doconda devuelve el mismo PDF con los
arreglos seguros aplicados (por ejemplo, una capa de texto en las páginas escaneadas) y un informe con cada problema
que queda y en qué página está.

## Pasos

1. Guarda tu API key en `DOCONDA_API_KEY` e instala el SDK (`pip install doconda` o `npm install @doconda/sdk`).
2. Sube el PDF con `files.upload`.
3. Pide la revisión, lee el informe y descarga el PDF arreglado.

<CodeGroup>
  ```python Python theme={"theme":{"light":"github-light","dark":"github-dark-dimmed"}}
  from pathlib import Path
  from doconda import Doconda

  doconda = Doconda()  # lee la key de DOCONDA_API_KEY
  file = doconda.files.upload("propuesta.pdf")
  reviewed = doconda.documents.create(operation="review", file=file["id"])
  report = doconda.documents.report(reviewed["id"])

  for issue in report["issues"]:
      print(issue["severity"], issue["code"], issue["message"], issue["location"].get("pages"))
  if reviewed["status"] in ("ready", "ready_with_warnings"):
      Path("propuesta-revisada.pdf").write_bytes(doconda.documents.download(reviewed["id"], "pdf"))
  ```

  ```ts TypeScript theme={"theme":{"light":"github-light","dark":"github-dark-dimmed"}}
  import { readFile, writeFile } from "node:fs/promises"
  import { Doconda } from "@doconda/sdk"

  const doconda = new Doconda()
  const file = await doconda.files.upload(await readFile("propuesta.pdf"), "propuesta.pdf")
  const reviewed = await doconda.documents.create({ operation: "review", file: file.id })
  const report = await doconda.documents.report(reviewed.id)

  for (const issue of report.issues) console.log(issue.severity, issue.code, issue.message, issue.location.pages)
  if (reviewed.status === "ready" || reviewed.status === "ready_with_warnings") {
    await writeFile("propuesta-revisada.pdf", await doconda.documents.download(reviewed.id, "pdf"))
  }
  ```
</CodeGroup>

## Qué revisa en un PDF

* **Se arregla solo**: páginas escaneadas sin texto (`pdf.no_text_layer`, se añade una capa de texto invisible para
  buscar y copiar), falta de título (`pdf.title_missing`) y de idioma (`pdf.language_missing`).
* **Se informa**: fuentes no incrustadas, páginas en blanco, tamaños de página distintos, texto de lado, imágenes de
  menos de 150 ppp, PDF sin etiquetas de accesibilidad, enlaces internos rotos, campos de formulario vacíos y
  comentarios olvidados.
* En todos los formatos, un importe en letra que no cuadra con la cifra (`money.words_mismatch`).

## Qué devuelve

* `status`: `ready` (sin problemas o todos arreglados), `ready_with_warnings` (avisos menores) o `needs_review` (queda
  algo que no se puede arreglar sin cambiar tu contenido).
* El informe: `ledger` con cada arreglo (aplicado o rechazado, y por qué) e `issues` con lo que queda, con sus páginas en
  `location.pages`.
* Nunca cambia tu texto ni tus valores: un importe mal escrito se señala, no se corrige.

## Límites

* Se rechazan PDF con contraseña y archivos que no son del formato que dicen.
* Lo que se quita por seguridad (acciones automáticas al abrir, ficheros incrustados…) aparece en `sanitized.removed`.

## Preguntas frecuentes

<AccordionGroup>
  <Accordion title="¿Usa IA?">
    No. La revisión no usa IA.
  </Accordion>

  <Accordion title="¿Sirve para Word, PowerPoint y Excel?">
    Sí, con la misma llamada. Cada formato tiene su lista de comprobaciones en [Revisar](/guides/review).
  </Accordion>

  <Accordion title="¿Y si solo quiero el texto del PDF?">
    Usa [`extract`](/guides/extract): devuelve el PDF en Markdown, con OCR para las páginas escaneadas.
  </Accordion>
</AccordionGroup>

## Sigue leyendo

* [Revisar](/guides/review) y [Revisar y arreglar un Word](/tutorials/review-word).
* [Quickstart](/quickstart).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.