mergePdfs method

Future<ApiResponse> mergePdfs(
  1. List<File> files, {
  2. MergeOptions? options,
})

Merge multiple PDF files

files List of PDF files to merge options Merge options

Implementation

Future<ApiResponse> mergePdfs(
  List<File> files, {
  MergeOptions? options,
}) async {
  options ??= const MergeOptions();

  // Create a multipart request manually
  final uri = Uri.parse('${ScanProConfig.apiUrl}/api/merge');
  final request = http.MultipartRequest('POST', uri);

  // Add API key header
  request.headers.addAll({'x-api-key': ScanProConfig.apiKey});

  // Add each file to the request
  for (int i = 0; i < files.length; i++) {
    final file = files[i];
    final fileName = file.path.split('/').last;
    final fileBytes = await file.readAsBytes();

    request.files.add(
      http.MultipartFile.fromBytes(
        'files',
        fileBytes,
        filename: fileName,
        contentType: MediaType.parse('application/pdf'),
      ),
    );
  }

  // Add merge options
  request.fields.addAll(options.toParams());

  // Send the request
  final streamedResponse = await request.send().timeout(
    ScanProConfig.timeout,
  );
  final response = await http.Response.fromStream(streamedResponse);

  // Parse the response
  try {
    final data = json.decode(response.body);

    if (response.statusCode >= 200 && response.statusCode < 300) {
      return ApiResponse(
        success: true,
        data: data,
        statusCode: response.statusCode,
      );
    } else {
      String errorMessage = 'An error occurred';

      if (data is Map && data.containsKey('error')) {
        errorMessage = data['error'].toString();
      }

      return ApiResponse(
        success: false,
        error: errorMessage,
        statusCode: response.statusCode,
        data: data,
      );
    }
  } catch (e) {
    return ApiResponse(
      success: false,
      error: 'Failed to parse response: ${e.toString()}',
      statusCode: response.statusCode,
      data: response.body,
    );
  }
}