EditorOnline.Sdk
1.0.4
dotnet add package EditorOnline.Sdk --version 1.0.4
NuGet\Install-Package EditorOnline.Sdk -Version 1.0.4
<PackageReference Include="EditorOnline.Sdk" Version="1.0.4" />
<PackageVersion Include="EditorOnline.Sdk" Version="1.0.4" />
<PackageReference Include="EditorOnline.Sdk" />
paket add EditorOnline.Sdk --version 1.0.4
#r "nuget: EditorOnline.Sdk, 1.0.4"
#:package EditorOnline.Sdk@1.0.4
#addin nuget:?package=EditorOnline.Sdk&version=1.0.4
#tool nuget:?package=EditorOnline.Sdk&version=1.0.4
EditorOnline
Edite documentos de Office dentro de su aplicación .NET. Word, Excel, PowerPoint, PDF y formularios rellenables, en el navegador, sin instalar nada en la máquina del usuario. Al guardar, el archivo llega a su endpoint.
dotnet add package EditorOnline.Sdk
.NET 8, 9 y 10. Sin dependencias externas.
En marcha
Levante el contenedor del editor. Es la única infraestructura que hace falta.
docker run -d --name editoronline -p 8099:80 LA-IMAGEN-DEL-EDITOR
Registre el SDK:
using EditorOnline;
builder.Services.AddEditorOnline(clave, o =>
{
o.ServidorUrl = "https://editor.miempresa.cr"; // el contenedor, visto por el navegador
});
var app = builder.Build();
app.MapEditorOnline(); // publica el componente desde su propio dominio
Cargue el componente una vez, en el layout:
@inject EditorOnline.IEditorOnline Editor
@Html.Raw(Editor.ObtenerEtiquetaScript())
Y abra un documento desde cualquier página:
EditorOnline.Open({
urlGetDocumento: '/api/expedientes/482/documento', // su backend lo entrega
saveUrl: '/api/expedientes/482/documento', // y lo recibe al guardar
saveFields: { idExpediente: '482' },
onSave: r => console.log(r.fileName, r.response)
});
El endpoint que lo recibe es un formulario normal:
app.MapPost("/api/expedientes/{id}/documento", async (int id, HttpRequest req) =>
{
var form = await req.ReadFormAsync();
var archivo = form.Files["file"]!;
// guárdelo donde corresponda
return Results.Ok(new { ok = true });
});
Qué abre
El tipo sale de la extensión. No hay que indicarlo.
| Formato | Se abre con |
|---|---|
| docx, doc, odt, rtf, txt | Editor de documentos |
| xlsx, xls, ods, csv | Hoja de cálculo |
| pptx, ppt, odp | Presentaciones |
| Editor de PDF | |
| pdf con campos | Formularios |
Si el nombre no trae extensión, dígalo con typeFile: 'xlsx'.
De dónde sale el documento
urlGetDocumento es lo habitual: el archivo lo entrega su backend y nunca pasa
por el navegador del usuario. Acepta dos respuestas, binaria o
{ nombre, tipo, base64 }, y deduce el nombre de la cabecera, de la URL o del
tipo de contenido.
También sirve file (un input), base64, arrayBuffer o url.
Guardar
Guardar no cierra el editor. Fuerza el guardado, recoge el archivo, se lo pasa
a onSave y lo sube a saveUrl. Al cerrar con cambios pendientes, pregunta.
saveUrl se decide al abrir cada documento. La opción UrlDeGuardado es solo
el valor por defecto, para cuando todo va al mismo sitio.
Si el editor no responde
No hace falta comprobarlo antes. Intente abrir y, si no hay nadie, el componente avisa:
EditorOnline.Open({ file, onUnavailable: e => mostrarAviso(e.servidor) });
Open rechaza la promesa con e.codigo === 'no-disponible'.
La API
AddEditorOnline(clave, opciones) |
Valida la clave al arrancar. Si no sirve, no registra nada y explica por qué |
TryAddEditorOnline(clave, opciones) |
Igual, pero devuelve false en vez de lanzar |
MapEditorOnline() |
Publica el JavaScript, embebido en el paquete. Sin CDN ni CORS |
ObtenerEtiquetaScript() |
La etiqueta <script> lista, con la configuración resuelta |
ObtenerConfiguracion() |
Las mismas URLs, si prefiere montar la etiqueta usted |
Opciones
| Opción | Por defecto | |
|---|---|---|
ServidorUrl |
http://127.0.0.1:8099 |
El contenedor, visto por el navegador. Casi siempre lo único que hay que poner |
UrlDeGuardado |
vacío | Endpoint por defecto. El saveUrl de Open manda sobre este |
Idioma |
es |
Interfaz del editor |
AutoGuardado |
true |
El editor transmite los cambios al contenedor mientras se escribe, por si se cierra la pestaña |
RutaScript |
/editoronline/EditorOnline.js |
Dónde se publica el .js |
Su aplicación no necesita ser alcanzable
El contenedor lleva dentro la pieza que recibe el documento, se lo sirve al editor y devuelve cada versión guardada. Se busca a sí mismo, así que no hay URL pública que declarar, ni carpeta temporal, ni almacén de sesiones.
Por eso su aplicación escala sin estado: el documento en edición vive en el contenedor, nunca en ella. El contenedor del editor, en cambio, conviene que sea uno solo o con sesiones pegajosas.
Un detalle que ahorra un rato: ServidorUrl es la dirección vista por el
navegador. Si su aplicación corre en Docker junto al editor, no ponga
http://editoronline, que solo existe dentro de la red de Docker.
La clave de activación
AddEditorOnline la exige. El paquete compara hashes SHA-256, nunca la clave
en claro. Trátela como una credencial:
dotnet user-secrets set "EditorOnline:Clave" "su-clave"
En producción, variable de entorno EditorOnline__Clave o el gestor de
secretos de su nube. Nunca en appsettings.json ni en el código.
Para solicitar la suya: andreyclemen@gmail.com
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- No dependencies.
-
net8.0
- No dependencies.
-
net9.0
- No dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.