Files
DocumentService/CONTROLLER_ENDPOINTS.md
TekH dc0af68d26 docs: Update API specification based on Marvin/Marlon feedback
CONTROLLER_ENDPOINTS.md changes:

  - Binary stream output for all operations (NO outputPath, NO base64)

  - PDF Operations: merge, stamp, annotate → return application/pdf stream

  - PDF Conversion: to-pdfa, from-pdfa → return application/pdf stream

  - Attachment Extraction: extract → return application/zip stream

  - Add Attachment endpoint (Phase 2): embed files in PDF/PDF/A-3

  - Swiss QR Code endpoint documented (already implemented)

  - PdfRenderController REMOVED (moved to .NET client library)

AGENTS.md changes:

  - Current Status: SwissQrCodeController  DONE (2 tests)

  - Current Status: PdfValidationController  Partial (4 tests)

  - Phase reorganization:

    - Phase 1: validate, validate-pdfa, check, extract (SwissQR), extract (attachments), merge

    - Phase 2: stamp, annotate, add-attachment

    - Phase 3: to-pdfa, from-pdfa

  - Removed PdfRenderController from all phases

Design decisions (team consensus):

  - Server endpoints stay granular (validate, check, extract separate)

  - Combined operations (validateANDextract) → .NET client library

  - Binary streams avoid filesystem dependencies

  - No base64 overhead (~33%), client library handles conversions

Result: Clean API spec, memory-based operations, client convenience layer
2026-07-08 15:46:10 +02:00

353 lines
8.2 KiB
Markdown

# DocumentOperator - Controller & Endpoint Specification
**Project:** DocumentService (DOC)
**Ticket:** DOC-1 - GDPicture and Nutrient Replacing
**Owner:** Hakan Tek
**Date:** July 3, 2026
---
## Overview
This specification defines the controller structure and REST API endpoints for the DocumentOperator service.
---
## PdfValidationController
### Endpoint: PDF Validation
**Route:** `POST /api/pdf/validation/validate`
**Function:** Checks whether the file is a valid PDF, whether it is corrupted, and returns basic information
**Input:**
- PDF file (multipart/form-data)
**Output:**
```json
{
"isValid": bool,
"pdfVersion": string,
"pageCount": int,
"fileSize": long,
"encrypted": bool,
"errors": string[]
}
```
**Usage:** All products - basic PDF input check
---
### Endpoint: PDF/A Validation
**Route:** `POST /api/pdf/validation/validate-pdfa`
**Function:** PDF/A conformance check (embedded fonts, encryption, JavaScript, etc.)
**Input:**
- PDF file (multipart/form-data)
**Output:**
```json
{
"isValid": bool,
"pdfaVersion": string,
"pageCount": int,
"errors": string[],
"warnings": string[]
}
```
**Usage:** taskFLOW, eParser - ensuring PDF/A conformance
---
## PdfAttachmentController
### Endpoint: Attachment Check
**Route:** `POST /api/pdf/attachments/check`
**Function:** Detects whether embedded files (e.g. ZUGFeRD XML) are present in the PDF
**Input:**
- PDF file (multipart/form-data)
**Output:**
```json
{
"hasAttachments": bool,
"attachmentCount": int,
"attachments": [
{
"fileName": string,
"mimeType": string,
"size": long
}
]
}
```
**Usage:** eParser (ZUGFeRD), ErgebnisberichtCreator
---
### Endpoint: Attachment Extraction
**Route:** `POST /api/pdf/attachments/extract`
**Function:** Extracts all embedded files from the PDF and returns them as a ZIP archive
**Input:**
- PDF file (multipart/form-data)
**Output:**
- Binary stream (application/zip)
- Content-Disposition: attachment; filename="attachments.zip"
- ZIP archive containing all extracted files
**Usage:** eParser (ZUGFeRD XML extraction)
---
### Endpoint: Add Attachment
**Route:** `POST /api/pdf/attachments/add`
**Function:** Embeds one or more files as attachments in a PDF (supports PDF/A-3)
**Input:**
- PDF file (multipart/form-data)
- Attachment files (multipart/form-data, multiple)
**Output:**
- Binary stream (application/pdf)
- Content-Disposition: attachment; filename="with-attachments.pdf"
- PDF with embedded attachments
**Usage:** eParser (ZUGFeRD XML embedding), PDF/A-3 archiving
---
## PdfOperationsController
### Endpoint: PDF Merge
**Route:** `POST /api/pdf/operations/merge`
**Function:** Merges multiple PDFs into a single file
**Input:**
- Multiple PDF files (multipart/form-data)
- Field name: "files" (array of IFormFile)
**Output:**
- Binary stream (application/pdf)
- Content-Disposition: attachment; filename="merged.pdf"
- Merged PDF document
**Usage:** signFLOW (Envelope Generator), ErgebnisberichtCreator, ResultHandler (windream)
---
### Endpoint: PDF Stamp
**Route:** `POST /api/pdf/operations/stamp`
**Function:** Adds stamps to PDF pages (APPROVED, CONFIDENTIAL, etc.)
**Input:**
- PDF file (multipart/form-data)
- Stamp configuration (JSON):
```json
{
"text": string,
"position": string,
"pages": string,
"color": string,
"opacity": float
}
```
**Output:**
- Binary stream (application/pdf)
- Content-Disposition: attachment; filename="stamped.pdf"
- PDF with applied stamps
**Usage:** ErgebnisberichtCreator
---
### Endpoint: PDF Annotate
**Route:** `POST /api/pdf/operations/annotate`
**Function:** Adds comments, highlights, and markings to the PDF
**Input:**
- PDF file (multipart/form-data)
- Annotations (JSON):
```json
{
"annotations": [
{
"type": string,
"page": int,
"position": object,
"text": string
}
]
}
```
**Output:**
- Binary stream (application/pdf)
- Content-Disposition: attachment; filename="annotated.pdf"
- PDF with applied annotations
**Usage:** signFLOW (Envelope Generator)
---
## SwissQrCodeController
### Endpoint: Swiss QR Code Extraction
**Route:** `POST /api/swissqrcode/extract`
**Function:** Extracts and parses Swiss QR Bill (Swiss QR Code) from PDF
**Input:**
- PDF file (multipart/form-data)
**Output:**
```json
{
"qrType": "SwissQrBill",
"version": "0200",
"creditorIban": "CH4431999123000889012",
"creditorName": "Example AG",
"creditorAddress": {
"addressType": "Structured",
"street": "Musterstrasse",
"houseNumber": "1",
"postalCode": "8000",
"city": "Zürich",
"country": "CH"
},
"amount": 1234.56,
"currency": "CHF",
"debtorName": "Max Mustermann",
"debtorAddress": { ... },
"referenceType": "QRR",
"reference": "210000000003139471430009017",
"unstructuredMessage": "Invoice #12345",
"billInformation": "//S1/10/12345",
"alternativeProcedures": ["UV1", "UV2"]
}
```
**Usage:** eParser (Swiss QR Bill processing), signFLOW (payment reference extraction)
**Note:** Supports only Structured Address (S-Type) as per Swiss QR Bill Standard 2.0. Combined Address (K-Type) deprecated November 21, 2025.
---
## PdfRenderController
**Status:** REMOVED - PDF preview functionality will be implemented in .NET client library using DevExpress WinForms/WPF controls. Server-side rendering is unnecessary CPU/memory overhead.
---
## PdfConversionController
### Endpoint: Convert PDF to PDF/A
**Route:** `POST /api/pdf/conversion/to-pdfa`
**Function:** Converts a standard PDF to PDF/A
**Input:**
- PDF file (multipart/form-data)
- PDF/A level (query parameter): "PDF/A-1b", "PDF/A-2b", "PDF/A-3b"
**Output:**
- Binary stream (application/pdf)
- Content-Disposition: attachment; filename="converted-pdfa.pdf"
- PDF/A compliant document
**Usage:** taskFLOW (optional conversion)
---
### Endpoint: Convert PDF/A to PDF
**Route:** `POST /api/pdf/conversion/from-pdfa`
**Function:** Converts PDF/A to a standard PDF
**Input:**
- PDF/A file (multipart/form-data)
**Output:**
- Binary stream (application/pdf)
- Content-Disposition: attachment; filename="converted-pdf.pdf"
- Standard PDF document
**Usage:** taskFLOW (optional conversion)
---
## Technical Specifications
### Framework Support
- ✓ .NET Core (3.1+, 6.0+, 8.0+)
- ✓ .NET Framework (4.7.2+, 4.8+)
### Client Usage
The service can be used on the client side **without manual HTTP response handling**:
- Provide REST client wrapper
- SDK for C# clients
- Automatic serialization/deserialization
- Abstracted error handling
**Example Client SDK:**
```csharp
var client = new DocumentOperatorClient("https://api.example.com");
var result = await client.Pdf.Validation.ValidateAsync(pdfFile);
if (result.IsValid) { ... }
```
### Response Format
- Default: JSON (for metadata endpoints like validation, check)
- Binary streams: application/pdf, application/zip (for operations, conversion, extraction)
- Content-Disposition header: attachment; filename="<output-filename>"
- Errors: HTTP Status Codes (400, 404, 500) + JSON error object
- Success: HTTP 200 + JSON/Binary response
**Binary Stream Endpoints:**
- PDF Operations: merge, stamp, annotate
- PDF Conversion: to-pdfa, from-pdfa
- Attachment Operations: extract (ZIP), add (PDF)
**JSON Response Endpoints:**
- PDF Validation: validate, validate-pdfa
- Attachment Check: check
- Swiss QR Code: extract
### Authentication
- API Key (Header: `X-API-Key`)
- Optional: OAuth2/JWT for advanced scenarios
### Swagger/OpenAPI
- Complete API documentation
- Interactive test UI
- Code generation for clients
---
## Prioritization
### Phase 1 (Priority)
1. PdfValidationController - both endpoints (validate, validate-pdfa)
2. PdfAttachmentController - check endpoint
3. SwissQrCodeController - extract endpoint (already implemented)
4. PdfAttachmentController - extract endpoint
5. PdfOperationsController - merge endpoint
### Phase 2
6. PdfOperationsController - stamp & annotate endpoints
7. PdfAttachmentController - add attachment endpoint
### Phase 3
8. PdfConversionController - both endpoints (to-pdfa, from-pdfa)
### Removed
- PdfRenderController - moved to .NET client library (WinForms/WPF DevExpress controls)
---
**Last Updated:** July 3, 2026
**Author:** Hakan Tek
**Status:** Draft - Awaiting Feedback