namespace QWERTYkez.WordProcessor; /// /// Статический класс для работы с документами Word через процессоры чтения/записи. /// public static class WordProcessor { #region Read Operations /// /// Пытается открыть документ только для чтения и выполнить действия. /// /// Путь к исходному файлу .docx /// Действия для выполнения над документом /// если операция выполнена успешно, иначе public static bool TryRead(string sourcePath, Action read) { return TryRead(new FileInfo(sourcePath), read); } /// /// Пытается открыть документ только для чтения и выполнить действия. /// /// Объект исходного файла .docx /// Действия для выполнения над документом /// если операция выполнена успешно, иначе public static bool TryRead(FileInfo sourceFile, Action read) { if (sourceFile is null || read is null) { #if DEBUG Debug.WriteLine("[DEBUG] SourceFile or action is null"); #endif return false; } using var processor = WordReader.CreateInternal(sourceFile); if (processor is null) return false; try { read(processor); return true; } catch (Exception ex) { #if DEBUG Debug.WriteLine($"[DEBUG] Error in read action: {ex.Message}"); #endif return false; } } #endregion #region Read Operations from Memory /// /// Пытается открыть документ из массива байт только для чтения и выполнить действия. /// /// Массив байт, содержащий документ .docx /// Действия для выполнения над документом /// если операция выполнена успешно, иначе public static bool TryRead(byte[] data, Action read) => TryRead(new ReadOnlyMemory(data), read); /// /// Пытается открыть документ из только для чтения и выполнить действия. /// /// Буфер с документом .docx /// Действия для выполнения над документом /// если операция выполнена успешно, иначе public static bool TryRead(ReadOnlyMemory data, Action read) { if (data.IsEmpty || read is null) { #if DEBUG Debug.WriteLine("[DEBUG] Data is empty or action is null"); #endif return false; } using var processor = WordReader.CreateFromData(data); if (processor is null) return false; try { read(processor); return true; } catch (Exception ex) { #if DEBUG Debug.WriteLine($"[DEBUG] Error in read action from memory: {ex.Message}"); #endif return false; } } #endregion #region Write Operations /// /// Пытается открыть документ для записи и выполнить действия с последующей перезаписью исходного файла. /// /// Путь к исходному файлу .docx /// Действия для выполнения над документом /// если операция выполнена успешно, иначе public static bool TryWrite(string sourcePath, Action write) { return TryWrite(sourcePath, sourcePath, write); } /// /// Пытается открыть документ для записи и выполнить действия с последующей перезаписью исходного файла. /// /// Объект исходного файла .docx /// Действия для выполнения над документом /// если операция выполнена успешно, иначе public static bool TryWrite(FileInfo sourceFile, Action write) { return TryWrite(sourceFile, sourceFile.FullName, write); } /// /// Пытается открыть документ для записи, выполнить действия и сохранить результат по новому пути. /// /// Путь к исходному файлу .docx /// Путь для сохранения результата (null - перезапись исходного файла) /// Действия для выполнения над документом /// если операция выполнена успешно, иначе public static bool TryWrite(string sourcePath, string? destinationPath, Action write) { return TryWrite(new FileInfo(sourcePath), destinationPath, write); } /// /// Пытается открыть документ для записи, выполнить действия и сохранить результат по новому пути. /// /// Объект исходного файла .docx /// Путь для сохранения результата (null - перезапись исходного файла) /// Действия для выполнения над документом /// если операция выполнена успешно, иначе public static bool TryWrite(FileInfo sourceFile, string? destinationPath, Action write) { if (sourceFile is null || write is null) { #if DEBUG Debug.WriteLine("[DEBUG] SourceFile or action is null"); #endif return false; } using var processor = WordWriter.CreateInternal(sourceFile, destinationPath); if (processor is null) return false; try { write(processor); return true; } catch (Exception ex) { #if DEBUG Debug.WriteLine($"[DEBUG] Error in write action: {ex.Message}"); #endif return false; } } #endregion #region Write Operations from Memory /// /// Пытается открыть документ из массива байт для записи, выполнить действия и сохранить результат по указанному пути. /// /// Массив байт, содержащий документ .docx /// Путь для сохранения результата /// Действия для выполнения над документом /// если операция выполнена успешно, иначе public static bool TryWrite(byte[] data, string destinationPath, Action write) => TryWrite(new ReadOnlyMemory(data), destinationPath, write); /// /// Пытается открыть документ из для записи, выполнить действия и сохранить результат по указанному пути. /// /// Буфер с документом .docx /// Путь для сохранения результата /// Действия для выполнения над документом /// если операция выполнена успешно, иначе public static bool TryWrite(ReadOnlyMemory data, string destinationPath, Action write) { if (data.IsEmpty || write is null) { #if DEBUG Debug.WriteLine("[DEBUG] Data is empty or write is null"); #endif return false; } using var processor = WordWriter.CreateFromData(data, destinationPath); if (processor is null) return false; try { write(processor); return true; } catch (Exception ex) { #if DEBUG Debug.WriteLine($"[DEBUG] Error in write action from memory: {ex.Message}"); #endif return false; } } #endregion /// /// Пытается создать новый документ Word, отредактировать его и вернуть результат в виде массива байт. /// /// Результирующий массив байт (если операция успешна). /// Действия для заполнения документа. /// если операция выполнена успешно, иначе . public static bool TryCreate(out byte[] result, Action write) { result = null!; if (write is null) return false; try { using var writer = WordWriter.CreateNew(); write(writer); result = writer.GetDocumentBytes(); return true; } catch { return false; } } /// /// Пытается создать новый документ Word, отредактировать его и записать в указанный поток. /// /// Поток, в который будет записан документ. /// Действия для заполнения документа. /// если операция выполнена успешно, иначе . public static bool TryCreate(Stream outputStream, Action write) { if (write is null || outputStream is null) return false; try { using var writer = WordWriter.CreateNew(); write(writer); writer.SaveTo(outputStream); return true; } catch { return false; } } /// /// Пытается создать новый документ Word, отредактировать его и сохранить на диск. /// /// Путь для сохранения результата. /// Действия для заполнения документа. /// если операция выполнена успешно, иначе . public static bool TryCreate(string destinationPath, Action write) { if (string.IsNullOrEmpty(destinationPath) || write is null) return false; try { using var writer = WordWriter.CreateNew(destinationPath); write(writer); writer.Save(); return true; } catch { return false; } } /// /// Пытается создать новый документ Word, отредактировать его и прочитать результат в памяти. /// /// Действия для заполнения документа. /// Действия для чтения полученного документа. /// если операция выполнена успешно, иначе . public static bool TryCreate(Action write, Action read) { if (write is null || read is null) return false; try { using var writer = WordWriter.CreateNew(); // без привязки к файлу write(writer); using var reader = writer.ToReader(); // преобразуем в read-only read(reader); return true; } catch { return false; } } }