<PackageReference Include="Relativity.Server.Import.SDK" Version="2.9.2" />

MultiPageImagesRollup

public abstract class MultiPageImagesRollup : IImagesRollup
using kCura.WinEDDS; using kCura.WinEDDS.Exceptions; using kCura.WinEDDS.Exporters; using Relativity.DataExchange.Io; using Relativity.DataExchange.Logger; using Relativity.DataExchange.Media; using Relativity.Logging; using System; using System.Collections.Generic; using System.IO; using System.Linq; namespace Relativity.DataExchange.Export.VolumeManagerV2.ImagesRollup { public abstract class MultiPageImagesRollup : IImagesRollup { private const string _TEMP_FILE_EXTENSION = ".tmp"; private readonly ExportFile _exportSettings; private readonly IFile _fileWrapper; private readonly IStatus _status; private readonly ILog _logger; protected readonly IImage ImageConverter; protected MultiPageImagesRollup(ExportFile exportSettings, IFile fileWrapper, IStatus status, ILog logger, IImage imageConverter) { _exportSettings = exportSettings; _fileWrapper = fileWrapper; _status = status; _logger = logger; ImageConverter = imageConverter; } public void RollupImages(ObjectExportInfo artifact) { if (artifact.Images.Count == 0) _logger.LogVerbose("No images found for artifact {artifactId}. Skipping rollup.", new object[1] { artifact.ArtifactID }); else { ImageExportInfo imageExportInfo = (ImageExportInfo)artifact.Images[0]; IList<string> list = (from ImageExportInfo x in artifact.Images select x.TempLocation).ToList(); string tempLocation = GetTempLocation(); try { _logger.LogVerbose("Attempting to rollup images in temporary location {tempLocation}. List of images {images}.", new object[2] { tempLocation.Secure(), string.Join(",", list).Secure() }); ConvertImage(list, tempLocation); _logger.LogVerbose("Attempting to delete images.", Array.Empty<object>()); DeleteImages(list); _logger.LogVerbose("Attempting to update images location.", Array.Empty<object>()); UpdateImageLocation(imageExportInfo); _logger.LogVerbose("Attempting to move temporary image {tempImage} to destination location {destinationLocation}.", new object[2] { tempLocation.Secure(), imageExportInfo.TempLocation.Secure() }); MoveFileFromTempToDestination(imageExportInfo, tempLocation); } catch (ImageConversionException ex) { HandleImageRollupException(artifact, ex, tempLocation); artifact.DocumentError = true; return; } _logger.LogVerbose("Images rollup finished.", Array.Empty<object>()); imageExportInfo.SuccessfulRollup = true; } } private string GetTempLocation() { string path = Path.ChangeExtension(Guid.NewGuid().ToString(), ".tmp"); string text = Path.Combine(_exportSettings.FolderPath, path); _logger.LogVerbose("Temp file {tempFile} for images rollup created.", new object[1] { text.Secure() }); return text; } protected abstract void ConvertImage(IList<string> imageList, string tempLocation); private void DeleteImages(IEnumerable<string> imageList) { foreach (string image in imageList) { _logger.LogVerbose("Removing image {image}.", new object[1] { image.Secure() }); _fileWrapper.Delete(image); } } private void UpdateImageLocation(ImageExportInfo image) { string extension = GetExtension(); image.TempLocation = Path.ChangeExtension(image.TempLocation, extension); image.FileName = Path.ChangeExtension(image.FileName, extension); } private void MoveFileFromTempToDestination(ImageExportInfo image, string rollupTempLocation) { if (_fileWrapper.Exists(image.TempLocation)) { if (_exportSettings.Overwrite) { _logger.LogVerbose("Overwriting image {image} with image from {tempLocation}.", new object[2] { image.TempLocation.Secure(), rollupTempLocation.Secure() }); _fileWrapper.Delete(image.TempLocation); _fileWrapper.Move(rollupTempLocation, image.TempLocation); } else { _logger.LogWarning("File {file} exists - skipping. Removing temp file.", new object[1] { image.TempLocation.Secure() }); _status.WriteWarning("File exists - file copy skipped: " + image.TempLocation); _fileWrapper.Delete(rollupTempLocation); } } else { _logger.LogVerbose("Moving file from {tempLocation} to {destinationLocation}.", new object[2] { rollupTempLocation.Secure(), image.TempLocation.Secure() }); _fileWrapper.Move(rollupTempLocation, image.TempLocation); } } private void HandleImageRollupException(ObjectExportInfo artifact, ImageConversionException ex, string rollupTempLocation) { _logger.LogError((Exception)ex, "Error occurred during image rollup.", Array.Empty<object>()); try { if (!string.IsNullOrEmpty(rollupTempLocation) && _fileWrapper.Exists(rollupTempLocation)) { _logger.LogVerbose("Removing unfinished image {image}.", new object[1] { rollupTempLocation.Secure() }); _fileWrapper.Delete(rollupTempLocation); } _status.WriteImgProgressError(artifact, ex.PageNumber, ex, "Document exported in single-page image mode."); } catch (IOException ex2) { _logger.LogError((Exception)ex2, "Failed to delete image temp file {tempFile}.", new object[1] { rollupTempLocation.Secure() }); throw new FileWriteException(FileWriteException.DestinationFile.Errors, ex2); } } protected abstract string GetExtension(); } }