Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,28 @@

Todos los cambios relevantes de este proyecto se documentan aquí.

## 0.0.8 - 2026-09-09

### Cambiado

- La extensión pasa a ser un visor de PDF estrictamente de solo lectura.
- El proveedor personalizado deja de registrar el ciclo editable de VS Code: no hay cambios, guardado, Guardar como, copias de seguridad, deshacer ni rehacer.
- La interfaz conserva miniaturas, navegación, zoom, búsqueda y apertura mediante contraseña.
- Se muestra de forma permanente el indicador `Solo lectura` junto a `v0.0.8`.

### Eliminado

- Edición, inserción y eliminación de texto, imágenes, tablas, anotaciones y páginas.
- Botones Guardar, Deshacer y Rehacer, barra de herramientas de edición y atajos modificadores.
- Exportación, serialización PDF, diario de operaciones de MuPDF y mensajes de actualización del webview.
- Fabric.js y la configuración `pdfViewerEditor.defaultSaveMode`.

### Seguridad y pruebas

- El protocolo entre webview y extensión usa una lista explícita de mensajes permitidos y rechaza cualquier orden desconocida.
- Las pruebas verifican que el proveedor no puede escribir archivos y que el motor público no expone operaciones mutables.
- El pipeline continúa validando lint, tipos, pruebas y el paquete `pdf-viewer-editor-0.0.8.vsix`.

## 0.0.7 - 2026-08-24

### Corregido
Expand Down
4 changes: 2 additions & 2 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
# Contribuir

Gracias por ayudar a mejorar PDF Viewer & Editor.
Gracias por ayudar a mejorar PDF Viewer.

1. Crea una rama desde `main`.
2. Instala dependencias con `npm install`.
3. Implementa un cambio acotado en JavaScript.
3. Implementa un cambio acotado en JavaScript sin añadir operaciones que modifiquen o escriban PDFs.
4. Añade o actualiza pruebas.
5. Ejecuta `npm run check` y `npm run package`.
6. Abre un pull request explicando el comportamiento y cómo se verificó.
Expand Down
142 changes: 45 additions & 97 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,101 +1,53 @@
# PDF Viewer & Editor

Editor visual de PDF gratuito para Visual Studio Code, construido en JavaScript con MuPDF.js y Fabric.js.

La versión `0.0.7` se concentra en una tarea: **hacer que el marco azul sea el área real del objeto editable, con geometría alineada al PDF**. Abre el PDF como una pestaña editable de VS Code y participa en el ciclo normal de Guardar, Guardar como, Deshacer, Rehacer, recuperación y copias de seguridad.

> Conserva una copia del documento original cuando trabajes con archivos importantes. Un PDF describe objetos colocados en coordenadas y no siempre contiene párrafos equivalentes a los de Word; esta extensión reconstruye bloques editables a partir de la estructura visual detectada por MuPDF.

## Edición de texto con reflujo

- Hacer clic sobre una línea selecciona solo esa línea; arrastrar selecciona exactamente palabras o frases, sin rectángulos gigantes.
- La selección visual usa los rectángulos de caracteres extraídos del PDF para ajustarse al contenido real.
- Arrastrar sobre una palabra o frase y editar, borrar, copiar o cambiar su formato.
- Editar un párrafo completo con `Editar contenido`; el marco azul coincide con el área real y se puede redimensionar.
- Mover o redimensionar un bloque de texto con `Mover / redimensionar bloque`.
- Al cambiar la anchura de un bloque, el texto se recompone dentro del nuevo ancho.
- El editor azul conserva inicialmente la geometría exacta de la selección y permite redimensionar anchura y altura; la anchura controla el reflow y la altura final se calcula según el contenido.
- Añadir texto en cualquier punto de la página.
- Cambiar o borrar el contenido real de un bloque.
- Cambiar Helvetica/Times/Courier, tamaño, color, negrita, cursiva y alineación.
- Ajustar automáticamente las líneas al ancho del bloque.
- Desplazar hacia abajo o arriba los bloques posteriores cuando cambia la altura.
- Mantener separado el flujo de columnas mediante solapamiento geométrico.
- Ampliar la página verticalmente si el nuevo contenido necesita más espacio.
- Guardar el reemplazo como texto PDF estático, seleccionable y buscable; no como una caja blanca que oculta el original.
- Usar los puntos `+` entre párrafos para insertar texto, una imagen o una tabla en el flujo.

Al aplicar una edición, MuPDF elimina físicamente el texto anterior, calcula las nuevas líneas, escribe el bloque y vuelve a colocar los bloques inferiores en sus nuevas coordenadas. Si se borra el bloque, el contenido posterior sube para conservar el espacio lógico.

## Imágenes

- Insertar PNG, JPEG, WebP, BMP, GIF o TIFF en cualquier posición.
- Insertar una imagen entre párrafos y desplazar automáticamente el texto inferior.
- Mover y redimensionar imágenes insertadas.
- El marco de una imagen insertada usa la misma transformación exacta que el píxel renderizado del PDF.
- Eliminar imágenes insertadas.
- Seleccionar y eliminar permanentemente una imagen original del PDF.

## Tablas simples

- Elegir el número de filas y columnas al crear la tabla.
- Insertar la tabla entre párrafos sin cubrir el contenido existente.
- Dibujar su zona directamente sobre la página.
- Seleccionar una tabla creada, moverla y redimensionarla con un marco que coincide exactamente con la cuadrícula.
- La geometría exacta de cada tabla se conserva en sus metadatos, evitando que el marco de selección se desplace respecto a la cuadrícula.
- Las tablas creadas por versiones anteriores recuperan esa geometría directamente desde sus trazos PDF.
- El marco de edición de la tabla comparte el mismo sistema de coordenadas que el PDF renderizado.
- Al cambiar la altura de una tabla, el texto posterior del mismo flujo se desplaza para conservar el espacio.
- Cambiar posteriormente filas, columnas, color y grosor de línea.
- Eliminar la tabla completa con `Eliminar` o la tecla `Delete`.
- Añadir texto editable independiente dentro de cada celda con `Añadir texto`.

## Visor e integración con VS Code
# PDF Viewer (Read Only)

Visor local de PDF para Visual Studio Code, construido en JavaScript con MuPDF.js.

La versión `0.0.8` convierte la extensión en un visor estricto de **solo lectura**. El PDF se puede abrir, consultar y recorrer, pero la extensión no ofrece ninguna operación para editarlo, guardarlo, exportarlo o sobrescribirlo.

## Funciones

- Renderizado local de alta calidad con MuPDF.js/WASM.
- Miniaturas, navegación, zoom de 25 % a 500 %, ajustar página y ajustar ancho.
- Zoom inicial al 100 %.
- Búsqueda en todo el documento con resaltado de resultados.
- Copiar el contenido del bloque seleccionado.
- Apertura de PDFs protegidos mediante contraseña; la contraseña solo vive en la memoria del webview.
- JavaScript incrustado en el PDF desactivado por seguridad.
- Guardado incremental o limpio, según la configuración.
- Guardar, Guardar como, Deshacer, Rehacer y recuperación nativos de VS Code.
- Todo el procesamiento ocurre localmente; el documento no se envía a ningún servidor.
- La barra de edición muestra `v0.0.7` para poder comprobar visualmente que está instalada la versión correcta del VSIX.

## Uso rápido
- Miniaturas y navegación por páginas.
- Zoom del 25 % al 500 %, ajuste a página y ajuste al ancho.
- Búsqueda en todo el documento con resaltado del resultado activo.
- Apertura de PDFs protegidos mediante contraseña; la contraseña solo permanece en memoria.
- JavaScript incrustado en el PDF desactivado.
- Indicador visible `Solo lectura` y versión `v0.0.8`.
- Procesamiento completamente local: el documento no se envía a ningún servidor.

## Garantía de solo lectura

La restricción no depende únicamente de ocultar botones:

1. El proveedor de VS Code implementa la API de editor personalizado de solo lectura y no registra eventos de cambio, guardado, Guardar como, copia de seguridad, deshacer ni rehacer.
2. El protocolo del webview solo acepta cargar el documento y mostrar mensajes; rechaza órdenes no incluidas en esa lista.
3. El motor incluido solo expone carga, autenticación, renderizado, miniaturas, límites de página y búsqueda. No contiene métodos de edición ni serialización.

También se retiraron Fabric.js, la barra de edición, los controles de texto, imagen y tabla, y la configuración del modo de guardado.

## Uso

1. Abre un archivo `.pdf` en VS Code.
2. Si se abre otro visor, usa el menú contextual y elige **Open with PDF Viewer & Editor**.
3. Haz clic en una línea para seleccionar esa línea, o arrastra sobre cualquier palabra o frase.
4. Pulsa `Editar selección` o `Editar contenido`; el editor azul se abre sobre la zona real correspondiente.
5. Redimensiona el marco azul si quieres modificar la anchura o altura disponible para el texto.
6. Usa `Mover / redimensionar bloque` para cambiar la posición o anchura del bloque de texto completo.
7. Cambia el tamaño de fuente: la selección se recompone y el contenido inferior se desplaza.
8. Usa el punto `+` entre párrafos para insertar texto, imagen o tabla sin solapar nada.
9. También puedes usar `Añadir texto`, `Imagen` o `Tabla` para colocar contenido libremente.
10. Guarda con `Ctrl/Cmd+S`.
2. Si se abre otro visor, usa el menú contextual y elige **Open with PDF Viewer (Read Only)**.
3. Navega con las miniaturas, los botones de página o `PageUp` y `PageDown`.
4. Ajusta el zoom o busca texto con el cuadro de búsqueda.

| Acción | Atajo |
|---|---|
| Guardar | `Ctrl/Cmd+S` |
| Guardar como | `Ctrl/Cmd+Shift+S` |
| Deshacer | `Ctrl/Cmd+Z` |
| Rehacer | `Ctrl/Cmd+Y` o `Ctrl/Cmd+Shift+Z` |
| Buscar | `Ctrl/Cmd+F` |
| Aplicar edición de texto | `Ctrl/Cmd+Enter` |
| Eliminar selección | `Delete` |
| Página anterior/siguiente | `PageUp` / `PageDown` |
| Cancelar herramienta | `Escape` |
| Página anterior | `PageUp` |
| Página siguiente | `PageDown` |

`Ctrl/Cmd+S`, Deshacer y Rehacer no modifican el PDF y muestran el estado de solo lectura cuando el foco está dentro del visor.

## Arquitectura

| Componente | Responsabilidad | Licencia |
|---|---|---|
| VS Code Custom Editor API | Pestaña editable, guardar, Guardar como, deshacer/rehacer y recuperación | Microsoft API |
| MuPDF.js 1.28 | Renderizado, extracción estructurada, eliminación real, escritura estática, imágenes, contraseñas y serialización | AGPL-3.0 |
| Fabric.js 7.4 | Selección visual, movimiento, escala y zonas de colocación | MIT |
| VS Code Custom Readonly Editor API | Abrir una pestaña de PDF sin ciclo de edición o guardado | Microsoft API |
| MuPDF.js 1.28 | Carga, contraseñas, renderizado, miniaturas y búsqueda | AGPL-3.0 |

El identificador interno `pdfViewerEditor.editor` se conserva para que una actualización desde versiones anteriores mantenga la asociación existente de archivos PDF.

## Desarrollo

Expand All @@ -105,7 +57,7 @@ Requisitos:
- Visual Studio Code 1.96 o posterior.

```bash
npm install
npm ci
npm run check
npm run package
```
Expand All @@ -114,27 +66,23 @@ npm run package
|---|---|
| `npm run lint` | Valida JavaScript con ESLint |
| `npm run typecheck` | Comprueba el host de la extensión con TypeScript `checkJs` |
| `npm test` | Ejecuta pruebas unitarias y de integración contra MuPDF/WASM |
| `npm test` | Ejecuta las pruebas del visor y del contrato de solo lectura |
| `npm run check` | Ejecuta lint, typecheck y pruebas |
| `npm run package` | Genera `pdf-viewer-editor-0.0.7.vsix` |
| `npm run package` | Genera `pdf-viewer-editor-0.0.8.vsix` |

El script `prepare` copia MuPDF y Fabric a `media/vendor`; esa carpeta se genera y no se versiona.
El script `prepare` copia MuPDF a `media/vendor`; esa carpeta se genera y no se versiona.

## Límites conocidos

- La detección de párrafos y columnas es geométrica. Maquetaciones muy complejas pueden requerir editar fragmentos más pequeños.
- La extensión recompone texto horizontal. Texto curvo, vertical o transformado puede aproximarse.
- Para una edición estable se ofrecen las tres familias PDF estándar; una fuente incrustada arbitraria se aproxima a la familia equivalente.
- Las tablas editables son las creadas por esta extensión. Una tabla original suele ser un conjunto de trazos sin semántica de filas o columnas.
- Los textos de las celdas son bloques independientes; al borrar la cuadrícula no se borran automáticamente esos textos.
- Cualquier modificación invalida una firma digital existente.
- La edición puede estar limitada por los permisos del propio PDF.
- El contenido se presenta como páginas renderizadas; no se pueden rellenar formularios ni modificar anotaciones.
- La búsqueda depende del texto que el PDF contenga. Un documento compuesto únicamente por imágenes necesita OCR externo.
- Los límites máximos de renderizado configurables pueden reducir el zoom efectivo en páginas extraordinariamente grandes.

## Licencia y coste

El proyecto es gratuito y de código abierto bajo **GNU AGPL v3 o posterior**, porque MuPDF se distribuye bajo AGPL. Para incorporar MuPDF en software cerrado, Artifex ofrece una licencia comercial.

Consulta [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md) para las dependencias incluidas.
Consulta [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md) para la dependencia incluida.

## Contribuir

Expand Down
8 changes: 5 additions & 3 deletions SECURITY.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

## Versiones compatibles

Mientras `0.0.1` sea la versión publicada, los problemas de seguridad se corregirán en la rama de desarrollo activa y en la siguiente versión disponible.
La versión `0.0.8` es la versión compatible. Los problemas de seguridad se corrigen en la rama de desarrollo activa y en la siguiente versión disponible.

## Informar de una vulnerabilidad

Expand All @@ -20,6 +20,8 @@ No publiques PDFs sensibles ni contraseñas en una incidencia. Usa la función p
- El JavaScript incluido en los PDFs se desactiva con MuPDF.
- El webview aplica una Content Security Policy restrictiva.
- Las contraseñas no se guardan en disco ni se envían al host de la extensión.
- Los datos OCR de castellano e inglés están incluidos. Otros idiomas pueden descargarse desde la URL configurada por el usuario.
- El proveedor usa la API de editor personalizado de solo lectura y no implementa operaciones de guardado, copia de seguridad, deshacer o rehacer.
- El motor del webview no expone edición ni serialización de documentos.
- Los mensajes procedentes del webview se validan mediante una lista explícita de operaciones permitidas.

Modificar un PDF firmado invalida su firma digital. La redacción solo es permanente después de ejecutar **Apply redactions permanently** y guardar el resultado.
La extensión `0.0.8` no modifica el archivo PDF, por lo que abrir un documento firmado no altera su firma digital.
10 changes: 2 additions & 8 deletions THIRD_PARTY_NOTICES.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Third-party notices

PDF Viewer & Editor incluye las siguientes dependencias de ejecución. Las copias de sus licencias se empaquetan dentro de `media/vendor` durante `npm install`/`npm run prepare`.
PDF Viewer incluye la siguiente dependencia de ejecución. Una copia de su licencia se empaqueta dentro de `media/vendor` durante `npm install`/`npm run prepare`.

## MuPDF.js

Expand All @@ -9,10 +9,4 @@ PDF Viewer & Editor incluye las siguientes dependencias de ejecución. Las copia
- Copyright: Artifex Software, Inc.
- Licencia: GNU Affero General Public License v3.0 o posterior.

## Fabric.js

- Proyecto: https://fabricjs.com/
- Paquete: `fabric` 7.4.0
- Licencia: MIT.

Los nombres de productos y proyectos pertenecen a sus respectivos titulares. Esta extensión no está afiliada ni respaldada oficialmente por Artifex ni Fabric.js.
Los nombres de productos y proyectos pertenecen a sus respectivos titulares. Esta extensión no está afiliada ni respaldada oficialmente por Artifex.
Loading
Loading