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
6 changes: 4 additions & 2 deletions docs/ARCHITECTURE.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
│ Built in: Magick (images, RAW) · PdfSharp · Pdfium · PdfPig · Svg.Skia · ICNS │
│ HwpxWriter + DocxWriter over DocumentReaders (DOCX, XLSX, XLS, ODS, PPTX, │
│ PDF, HTML, EPUB, MOBI, FB2, HWPX, Markdown) · Spreadsheets · OOXML variants │
│ · E-mail · Data · E-books · CAD · Fonts · Subtitles · 3D models │
│ · E-mail · Signed files · Data · E-books · CAD · Fonts · Subtitles · 3D models │
│ Bundled: rhwp (HWP→PDF, HWP↔HWPX) · 7-Zip (archives) · Unhwp · Markdig │
│ Optional: FFmpeg · LibreOffice + H2Orestart · calibre · Ghostscript · Pandoc │
└────────────────────────────────────────────────────────────────────────────────────┘
Expand All @@ -42,7 +42,9 @@
4. **Plan** – for every file, `RoutePlanner` finds the cheapest chain of converter edges from the source format to
the target (at most 3 hops). Engine priority (Settings → Engines) breaks ties. Some edges are limited: tracing
only starts from raster images (`ImageSourcesOnly`), and PDF → PPTX picture slides are only ever a route of their
own (`DirectOnly`), never a step of a longer one.
own (`DirectOnly`), never a step of a longer one. An envelope (a signed `.p7m`) is planned from the file inside
it: its engine (`IEnvelopeOpener`) names that file's format, and the route opens it first, then goes on from there
(`RoutePlanner.PlanThrough`: P7M → PDF → PNG).
5. **Run** – `JobQueue` runs steps with per-engine concurrency limits. Intermediate files live in a temp folder;
final outputs are named by `OutputPathResolver` (pattern, folder, conflict policy; the source is never overwritten).
Each name stays reserved while a conversion holds it. A conversion that fails or is cancelled deletes what it began
Expand Down
26 changes: 26 additions & 0 deletions docs/ENGINES.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ Filee chooses engines automatically. Settings → *Engines* shows their status,
| PDF slides | built in (PDFium, PdfPig) | **PDF → PPTX**: a picture of each page on its own slide (looks like the PDF, not editable), the page's text in the speaker notes |
| PDF tables | built in (PdfPig) | **PDF → XLSX, ODS, CSV** (#267): each table drawn with lines on its own sheet, numbers and dates as real values, merged cells and column widths kept |
| E-mail | built in (MimeKit, MsgReader) | **EML, Outlook MSG → HTML** (headers + body, inline pictures), **TXT**, **ZIP** (the attachments); **MSG → EML**; **MHTML → HTML** (the saved page in one file, pictures inlined; on to PDF, DOCX, HWPX, TXT, Markdown, EPUB from there) |
| Signed files | built in (System.Security.Cryptography.Pkcs) | **P7M → the signed file inside** (CMS / PKCS #7, CAdES: Italian e-invoices `*.xml.p7m`, signed PDFs `*.pdf.p7m`), then on from its format (P7M → PDF → JPG); the signature isn't checked |
| Data | built in (System.Text.Json, YamlDotNet, Tomlyn, System.Xml) | **JSON, JSON Lines, YAML, TOML, XML, CSV ↔ each other** (CSV for tables); **vCard, iCalendar ↔ CSV**; FreeMASTER oscilloscope TXT → CSV; spreadsheets, contacts and events reach JSON / YAML / TOML / XML through CSV |
| **E-books** | built in | **EPUB, MOBI/AZW/AZW3/PRC, FB2, HTMLZ, TXTZ → EPUB, HWPX (→ PDF), TXT, HTML, Markdown, FB2, HTMLZ, TXTZ**; HTML, Markdown, TXT, DOCX → EPUB/FB2/HTMLZ/TXTZ; HTML → TXT; comics CBZ/CBR/CB7/CBT/CBC → PDF, EPUB, CBZ; PDF → CBZ; AZW4 → PDF; **EPUB ↔ KEPUB** (Kobo) |
| CAD (ACadSharp + built-in renderer) | built in (library) | **DWG ↔ DXF**; DWG/DXF → **PDF** (vector), **SVG**, PNG, JPG, WEBP, TIFF, BMP, GIF, ICO, AVIF |
Expand Down Expand Up @@ -963,6 +964,31 @@ saved as octet-stream, and scripts, frames, remote pictures, fonts and style she
(windows-1252, `file:///C:/` locations, VML fallbacks), a `cid:`-only page in EUC-KR, a picture on disk named by a
`file:` URI that must not be read, and the routes to HTML, TXT, DOCX, HWPX and PDF.

## Signed files (.p7m)

A `.p7m` (#1010) is a CMS / PKCS #7 SignedData envelope (RFC 5652; CAdES as Italian e-invoices and signed PDFs are
made): the signed file with its signature around it. `Signed/P7mConverter.cs` takes the file out with .NET's
`SignedCms` (System.Security.Cryptography.Pkcs): DER or BER, or the same saved as Base64 or PEM text. An envelope
signed again is opened again, up to 8 deep. Envelopes over 512 MB are refused.

- **The signature is not checked**, and nothing in it is trusted: no certificate chain, no revocation list, no
time-stamp server, no network. The result is the plain file without the proof the signature gives; the `.p7m` is
left as it was.
- **The format inside** comes from the envelope's name (`invoice.xml.p7m` → XML), else from the first bytes: PDF and
pictures (as for files from a browser), XML, HTML, RTF, a MIME message (a signed e-mail, `smime.p7m`), ZIP and the
Word, Excel, PowerPoint, OpenDocument and EPUB files in one, plain UTF-8 text. Anything else is refused
(`error.p7m_unknown_content`).
- **The route** goes on from that format. The converter is an `IEnvelopeOpener`: `JobQueue` asks it for the format
inside before planning, and `RoutePlanner.PlanThrough` puts the step to it first (P7M → PDF → PNG); "same format",
OCR and the other options apply to the file inside. The converter has an edge from P7M to every format, so the donut
offers what any file inside could become, and a file inside that can't become the target fails with its own
format's "no route" (`xml → mp4`).
- **Names**: outputs are named after the file inside (`FormatRegistry.NameWithoutExtension`: `invoice.pdf.p7m` →
`invoice.pdf`, `invoice.png`).
- **Refused**: a detached signature (`error.p7m_detached`: the signed file is kept elsewhere), an encrypted S/MIME
envelope (`error.p7m_encrypted`: EnvelopedData, only the recipient's key opens it) and anything that isn't a
SignedData (`error.p7m_unreadable`).

## Data (JSON, YAML, TOML, XML, CSV, vCard, iCalendar)

`Data/DataConverter.cs` (engine id `data`) reads every format into one tree (`Data/DataTree.cs`: objects with their
Expand Down
7 changes: 7 additions & 0 deletions src/Filee.App/Assets/i18n/ar.json
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,11 @@
"download.badge_files": "{0} · {1} من أصل {2} من الملفات",
"error.unsupported_source": "نوع الملف هذا غير مدعوم",
"error.empty_file": "الملف فارغ (0 بايت). يبقى الملف المُنشأ باستخدام «جديد» من قائمة النقر بالزر الأيمن فارغًا حتى تفتحه في تطبيقه وتحفظه",
"error.p7m_unreadable": "هذا ليس ملفًا موقّعًا (.p7m) يستطيع Filee فتحه، أو أنه تالف",
"error.p7m_detached": "لا يحتوي ملف .p7m هذا إلا على التوقيع، لا على الملف الموقّع. حوّل الملف الذي يوقّعه بدلًا منه",
"error.p7m_encrypted": "ملف .p7m هذا مشفّر وليس موقّعًا فقط: لا يفتحه إلا مفتاح المستلم",
"error.p7m_unknown_content": "الملف داخل ملف .p7m هذا من نوع لا يحوّله Filee",
"error.p7m_too_large": "الملف الموقّع أكبر من أن يُفتح",
"format_request.request": "طلب دعم هذه الصيغة",
"format_request.notice_title": "لا يستطيع Filee تحويل ملفات {0} بعد",
"format_request.notice_text": "أخبرنا بالصيغة التي تحتاجها.\nتساعد الطلبات في تحديد الصيغ التي سيدعمها Filee لاحقًا.\nلا يمكن تحويل الملفات المشفّرة أو المحمية من النسخ (DRM)، مهما كانت صيغتها.",
Expand Down Expand Up @@ -211,6 +216,8 @@
"engine.pdf-tables.description": "يحوّل الجداول المرسومة بخطوط في ملف PDF إلى مصنف Excel، لكل جدول ورقة، مع الأرقام والتواريخ كقيم حقيقية.",
"engine.email.name": "E-mail (built-in)",
"engine.email.description": "تحويل رسائل البريد (EML وOutlook MSG) إلى HTML ونص مع المرسل والمستلمين والتاريخ والصور، وتجميع المرفقات في ZIP.\nتحويل MSG إلى EML، وصفحات الويب المحفوظة (MHTML) إلى ملف HTML واحد مع صورها.",
"engine.p7m.name": "Signed files (built-in)",
"engine.p7m.description": "يستخرج الملف الموقّع من ملف .p7m (CMS / PKCS #7: الفواتير الإلكترونية الإيطالية وملفات PDF الموقّعة) ثم يحوّله. لا يُتحقَّق من التوقيع ولا يبقى في الناتج: احتفظ بملف .p7m كإثبات.",
"engine.data.name": "Data (built-in)",
"engine.data.description": "التحويل بين JSON وJSON Lines وYAML وTOML وXML وCSV.\nتحويل جهات اتصال vCard وأحداث iCalendar إلى CSV والعكس.\nتُحذف التعليقات. تدعم CSV البيانات الجدولية فقط.",
"engine.vector.name": "Vector graphics (built-in)",
Expand Down
7 changes: 7 additions & 0 deletions src/Filee.App/Assets/i18n/de.json
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,11 @@
"download.badge_files": "{0} · {1} von {2} Dateien",
"error.unsupported_source": "Dieser Dateityp wird nicht unterstützt",
"error.empty_file": "Die Datei ist leer (0 Bytes). Eine über „Neu“ im Kontextmenü erstellte Datei bleibt leer, bis du sie in ihrem Programm öffnest und speicherst",
"error.p7m_unreadable": "Das ist keine signierte .p7m-Datei, die Filee öffnen kann, oder sie ist beschädigt",
"error.p7m_detached": "Diese .p7m enthält nur die Signatur, nicht die signierte Datei. Konvertiere stattdessen die Datei, die sie signiert",
"error.p7m_encrypted": "Diese .p7m ist verschlüsselt, nicht nur signiert: Nur der Schlüssel des Empfängers öffnet sie",
"error.p7m_unknown_content": "Die Datei in dieser .p7m hat ein Format, das Filee nicht konvertiert",
"error.p7m_too_large": "Die signierte Datei ist zu groß zum Öffnen",
"format_request.request": "Dieses Format vorschlagen",
"format_request.notice_title": "Filee kann {0}-Dateien noch nicht konvertieren",
"format_request.notice_text": "Sag uns, welches Format du brauchst.\nDie Anfragen bestimmen, welche Formate Filee als Nächstes unterstützt.\nVerschlüsselte oder kopiergeschützte Dateien (DRM) lassen sich unabhängig vom Format nicht konvertieren.",
Expand Down Expand Up @@ -211,6 +216,8 @@
"engine.pdf-tables.description": "Überträgt Tabellen mit eingezeichneten Linien aus einer PDF in eine Excel-Arbeitsmappe, jeweils auf ein eigenes Blatt. Zahlen und Datumsangaben bleiben echte Werte.",
"engine.email.name": "E-Mail (integriert)",
"engine.email.description": "E-Mails (EML, Outlook MSG) in HTML und Text mit Absender, Empfängern, Datum und Bildern; Anhänge in eine ZIP-Datei.\nMSG in EML. Gespeicherte Webseiten (MHTML) in eine HTML-Datei mit ihren Bildern.",
"engine.p7m.name": "Signierte Dateien (integriert)",
"engine.p7m.description": "Holt die signierte Datei aus einer .p7m (CMS / PKCS #7: italienische E-Rechnungen, signierte PDFs) und konvertiert sie weiter. Die Signatur wird weder geprüft noch übernommen: Behalte die .p7m als Nachweis.",
"engine.data.name": "Daten (integriert)",
"engine.data.description": "Konvertiert JSON, JSON Lines, YAML, TOML, XML und CSV untereinander.\nvCard-Kontakte und iCalendar-Termine in CSV und zurück.\nKommentare werden entfernt. CSV speichert nur Tabellen.",
"engine.vector.name": "Vektorgrafiken (integriert)",
Expand Down
7 changes: 7 additions & 0 deletions src/Filee.App/Assets/i18n/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,11 @@

"error.unsupported_source": "This file type isn't supported",
"error.empty_file": "The file is empty (0 bytes). A file made with “New” in the right-click menu stays empty until you open it in its app and save it",
"error.p7m_unreadable": "This isn't a signed .p7m file Filee can open, or it is damaged",
"error.p7m_detached": "This .p7m holds only the signature, not the signed file. Convert the file it signs instead",
"error.p7m_encrypted": "This .p7m is encrypted, not only signed: only the recipient's key opens it",
"error.p7m_unknown_content": "The file inside this .p7m is of a type Filee doesn't convert",
"error.p7m_too_large": "The signed file is too large to open",
"format_request.request": "Request this format",
"format_request.notice_title": "Filee can't convert {0} files yet",
"format_request.notice_text": "Tell us which format you need.\nRequests decide what Filee supports next.\nEncrypted or copy-protected (DRM) files can't be converted, whatever the format.",
Expand Down Expand Up @@ -218,6 +223,8 @@
"engine.pdf-tables.description": "Turns the tables drawn with lines in a PDF into an Excel workbook, one sheet each, with numbers and dates as real values.",
"engine.email.name": "E-mail (built-in)",
"engine.email.description": "E-mails (EML, Outlook MSG) to HTML and text with sender, recipients and date, pictures included; attachments into a ZIP.\nMSG to EML. Saved web pages (MHTML) to one HTML file with their pictures.",
"engine.p7m.name": "Signed files (built-in)",
"engine.p7m.description": "Takes the signed file out of a .p7m (CMS / PKCS #7: Italian e-invoices, signed PDFs) and converts it on. The signature isn't checked or kept: keep the .p7m as proof.",
"engine.data.name": "Data (built-in)",
"engine.data.description": "JSON, JSON Lines, YAML, TOML, XML and CSV into each other.\nvCard contacts and iCalendar events to CSV and back.\nComments are dropped. CSV holds tables only.",
"engine.vector.name": "Vector graphics (built-in)",
Expand Down
7 changes: 7 additions & 0 deletions src/Filee.App/Assets/i18n/es.json
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,11 @@
"download.badge_files": "{0} · {1} de {2} archivos",
"error.unsupported_source": "Este tipo de archivo no es compatible",
"error.empty_file": "El archivo está vacío (0 bytes). Un archivo creado con «Nuevo» en el menú contextual sigue vacío hasta que lo abres en su aplicación y lo guardas",
"error.p7m_unreadable": "No es un archivo firmado .p7m que Filee pueda abrir, o está dañado",
"error.p7m_detached": "Este .p7m solo contiene la firma, no el archivo firmado. Convierte el archivo que firma",
"error.p7m_encrypted": "Este .p7m está cifrado, no solo firmado: solo lo abre la clave del destinatario",
"error.p7m_unknown_content": "El archivo dentro de este .p7m es de un tipo que Filee no convierte",
"error.p7m_too_large": "El archivo firmado es demasiado grande para abrirlo",
"format_request.request": "Solicitar este formato",
"format_request.notice_title": "Filee aún no puede convertir archivos {0}",
"format_request.notice_text": "Cuéntanos qué formato necesitas.\nLas solicitudes determinan qué formatos admitirá Filee a continuación.\nLos archivos cifrados o con protección de copia (DRM) no se pueden convertir, sea cual sea su formato.",
Expand Down Expand Up @@ -211,6 +216,8 @@
"engine.pdf-tables.description": "Convierte las tablas dibujadas con líneas de un PDF en un libro de Excel, una hoja por tabla, con números y fechas como valores reales.",
"engine.email.name": "E-mail (built-in)",
"engine.email.description": "Correos electrónicos (EML, Outlook MSG) a HTML y texto con remitente, destinatarios y fecha, imágenes incluidas; los adjuntos van a un ZIP.\nMSG a EML. Páginas web guardadas (MHTML) a un solo archivo HTML con sus imágenes.",
"engine.p7m.name": "Signed files (built-in)",
"engine.p7m.description": "Saca el archivo firmado de un .p7m (CMS / PKCS #7: facturas electrónicas italianas, PDF firmados) y sigue la conversión. La firma no se comprueba ni se conserva: guarda el .p7m como prueba.",
"engine.data.name": "Data (built-in)",
"engine.data.description": "JSON, JSON Lines, YAML, TOML, XML y CSV entre sí.\nContactos vCard y eventos de iCalendar a CSV y viceversa.\nLos comentarios se descartan. CSV solo admite tablas.",
"engine.vector.name": "Vector graphics (built-in)",
Expand Down
7 changes: 7 additions & 0 deletions src/Filee.App/Assets/i18n/fr.json
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,11 @@

"error.unsupported_source": "Ce type de fichier n'est pas pris en charge",
"error.empty_file": "Le fichier est vide (0 octet). Un fichier créé avec « Nouveau » dans le menu contextuel reste vide tant que vous ne l'avez pas ouvert et enregistré dans son application",
"error.p7m_unreadable": "Ce n'est pas un fichier signé .p7m que Filee peut ouvrir, ou il est endommagé",
"error.p7m_detached": "Ce .p7m ne contient que la signature, pas le fichier signé. Convertissez plutôt le fichier qu'il signe",
"error.p7m_encrypted": "Ce .p7m est chiffré, pas seulement signé : seule la clé du destinataire peut l'ouvrir",
"error.p7m_unknown_content": "Le fichier contenu dans ce .p7m est d'un type que Filee ne convertit pas",
"error.p7m_too_large": "Le fichier signé est trop volumineux pour être ouvert",
"format_request.request": "Demander ce format",
"format_request.notice_title": "Filee ne sait pas encore convertir les fichiers {0}",
"format_request.notice_text": "Dites-nous de quel format vous avez besoin.\nLes demandes décident de ce que Filee prendra en charge ensuite.\nLes fichiers chiffrés ou protégés contre la copie (DRM) ne peuvent pas être convertis, quel que soit le format.",
Expand Down Expand Up @@ -218,6 +223,8 @@
"engine.pdf-tables.description": "Transforme les tableaux tracés avec des lignes d'un PDF en classeur Excel, une feuille par tableau, avec les nombres et les dates en vraies valeurs.",
"engine.email.name": "E-mail (built-in)",
"engine.email.description": "E-mails (EML, MSG Outlook) en HTML et texte avec expéditeur, destinataires et date, images comprises ; pièces jointes dans un ZIP.\nMSG en EML. Pages web enregistrées (MHTML) en un seul fichier HTML avec leurs images.",
"engine.p7m.name": "Signed files (built-in)",
"engine.p7m.description": "Extrait le fichier signé d'un .p7m (CMS / PKCS #7 : factures électroniques italiennes, PDF signés) puis le convertit. La signature n'est ni vérifiée ni conservée : gardez le .p7m comme preuve.",
"engine.data.name": "Data (built-in)",
"engine.data.description": "JSON, JSON Lines, YAML, TOML, XML et CSV entre eux.\nContacts vCard et événements iCalendar en CSV et inversement.\nLes commentaires sont supprimés. Le CSV ne contient que des tableaux.",
"engine.vector.name": "Vector graphics (built-in)",
Expand Down
Loading
Loading