{"record":{"id":"edd315c1916df329","repo":"apache/seatunnel","slug":"file-format-pdf-does-not-support-writing","errorCode":null,"errorMessage":"File format 'pdf' does not support writing.","messagePattern":"File format 'pdf' does not support writing\\.","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"seatunnel-connectors-v2/connector-file/connector-file-base/src/main/java/org/apache/seatunnel/connectors/seatunnel/file/config/FileFormat.java","lineNumber":191,"sourceCode":"                    \"File format 'maxwell_json' does not support reading.\");\n        }\n    },\n    MARKDOWN(\"md\", \"markdown\") {\n        @Override\n        public WriteStrategy getWriteStrategy(FileSinkConfig fileSinkConfig) {\n            throw new UnsupportedOperationException(\n                    \"File format 'markdown' does not support writing.\");\n        }\n\n        @Override\n        public ReadStrategy getReadStrategy() {\n            return new MarkdownReadStrategy();\n        }\n    },\n    PDF(\"pdf\") {\n        @Override\n        public WriteStrategy getWriteStrategy(FileSinkConfig fileSinkConfig) {\n            throw new UnsupportedOperationException(\"File format 'pdf' does not support writing.\");\n        }\n\n        @Override\n        public ReadStrategy getReadStrategy() {\n            return new PdfReadStrategy();\n        }\n    };\n\n    private final String[] suffix;\n\n    FileFormat(String... suffix) {\n        this.suffix = suffix;\n    }\n\n    public String getSuffix() {\n        if (suffix.length > 0) {\n            return \".\" + suffix[0];\n        }","sourceCodeStart":173,"sourceCodeEnd":209,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-connectors-v2/connector-file/connector-file-base/src/main/java/org/apache/seatunnel/connectors/seatunnel/file/config/FileFormat.java#L173-L209","documentation":"The FileFormat enum maps file extensions to read/write strategies. PDF is read-only in this connector: its getWriteStrategy implementation unconditionally throws UnsupportedOperationException, so the sink path cannot write PDF files.","triggerScenarios":"Configuring a SeaTunnel file sink with format = pdf (FileFormat.PDF) causes getWriteStrategy(FileSinkConfig) to be invoked during sink initialization and immediately throw.","commonSituations":"Users assume that because PDF reading is supported, PDF writing is too, and set sink filetype to pdf; copy-pasting a source config into a sink config; migrating a job from another tool that supports PDF export.","solutions":["Change the sink file format to a writable one such as text, csv, parquet, orc, or json","If PDF output is required, write a supported format first and convert externally (e.g. with a post-processing script)","If reading is the actual goal, verify you configured a source (not a sink) with format pdf"],"exampleFix":"// before\nsink {\n  LocalFile {\n    path = \"/tmp/output\"\n    file_format = \"pdf\"\n  }\n}\n// after\nsink {\n  LocalFile {\n    path = \"/tmp/output\"\n    file_format = \"parquet\"\n  }\n}","handlingStrategy":"validation","validationCode":"if (fileFormat == FileFormat.PDF && isSink) {\n    throw new IllegalArgumentException(\"PDF is read-only; use text/csv/parquet/orc/json for writing\");\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Check the FileFormat enum's supported read/write capabilities before configuring a sink","Only pair PDF format with source connectors"],"tags":["file","sink","unsupported-format"],"backgroundTag":"unsupported-operation","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}