using DocumentOperator.Application.Common.DTOs; namespace DocumentOperator.Application.Common.Interfaces; public interface IPdfProcessor { /// /// Validates a PDF and extracts metadata. /// /// /// PDF document stream. Must be readable and positioned at the beginning (Position = 0). /// Non-seekable streams are supported. Caller is responsible for disposal. /// /// PDF metadata (page count, size, version, attachments) /// /// Thrown when stream is empty, invalid, or not positioned at the beginning /// Task ValidateAsync(Stream pdfStream); /// /// Validates a PDF/A document and checks conformance level. /// /// /// PDF document stream. Must be readable and positioned at the beginning (Position = 0). /// Non-seekable streams are supported. Caller is responsible for disposal. /// /// PDF/A metadata including conformance level and validation errors/warnings /// /// Thrown when stream is empty, invalid, or not positioned at the beginning /// Task ValidatePdfAAsync(Stream pdfStream); /// /// Checks for embedded files (attachments) in a PDF document and returns detailed metadata. /// /// /// PDF document stream. Must be readable and positioned at the beginning (Position = 0). /// Non-seekable streams are supported. Caller is responsible for disposal. /// /// Attachment information (count, file names, MIME types, sizes) /// /// Thrown when stream is empty, invalid, or not positioned at the beginning /// Task CheckAttachmentsAsync(Stream pdfStream); /// /// Extracts all embedded files from a PDF document and returns them as a ZIP archive. /// /// /// PDF document stream. Must be readable and positioned at the beginning (Position = 0). /// Non-seekable streams are supported. Caller is responsible for disposal. /// /// ZIP archive containing all extracted attachments as byte array /// /// Thrown when stream is empty, invalid, or not positioned at the beginning /// /// /// Thrown when PDF contains no attachments /// Task ExtractAttachmentsAsync(Stream pdfStream); /// /// Merges multiple PDF documents into a single PDF. /// /// /// PDF streams to merge (minimum 2 required). Each stream must be readable and positioned /// at the beginning (Position = 0). Caller is responsible for disposal. /// /// /// Optional page ranges per PDF (null = all pages). Format: "1-3,5" means pages 1, 2, 3, and 5. /// If null or empty for a PDF, all pages are included. Array length must match pdfStreams length if provided. /// /// Merged PDF as byte array /// /// Thrown when fewer than 2 PDFs provided, any stream is empty/invalid/not at Position=0, /// or page range format is invalid /// Task MergePdfsAsync(IReadOnlyList pdfStreams, IReadOnlyList? pageRanges = null); }