Ejemplo n.º 1
0
        private string RemoveExtension(string filePath)
        {
            var directory            = PathSafe.GetDirectoryName(filePath);
            var fileWithoutExtension = PathSafe.GetFileNameWithoutExtension(filePath);

            return(Path.Combine(directory, fileWithoutExtension));
        }
        public SourceFileInfo Duplicate(SourceFileInfo sfi, string duplicateFolder, string profileGuid)
        {
            var duplicate = new SourceFileInfo();

            duplicate.SessionId           = sfi.SessionId;
            duplicate.WinStation          = sfi.WinStation;
            duplicate.Author              = sfi.Author;
            duplicate.ClientComputer      = sfi.ClientComputer;
            duplicate.PrinterName         = sfi.PrinterName;
            duplicate.JobCounter          = sfi.JobCounter;
            duplicate.JobId               = sfi.JobId;
            duplicate.DocumentTitle       = sfi.DocumentTitle;
            duplicate.OriginalFilePath    = sfi.OriginalFilePath;
            duplicate.Type                = sfi.Type;
            duplicate.TotalPages          = sfi.TotalPages;
            duplicate.Copies              = sfi.Copies;
            duplicate.UserTokenEvaluated  = sfi.UserTokenEvaluated;
            duplicate.UserToken           = sfi.UserToken;
            duplicate.OutputFileParameter = sfi.OutputFileParameter;

            duplicate.PrinterParameter = profileGuid == null ? sfi.PrinterParameter : "";
            duplicate.ProfileParameter = profileGuid ?? sfi.ProfileParameter;

            var duplicateFilename = PathSafe.GetFileNameWithoutExtension(sfi.Filename);
            var duplicateFilePath = PathSafe.Combine(duplicateFolder, duplicateFilename);

            duplicateFilePath = _uniqueFilePathBuilder.Build(duplicateFilePath).Unique;
            _file.Copy(sfi.Filename, duplicateFilePath);
            duplicate.Filename = duplicateFilePath;

            return(duplicate);
        }
Ejemplo n.º 3
0
        /// <summary>
        ///     Create a new GhostscriptJob instance
        /// </summary>
        /// <param name="jobInfo">JobInfo of the job to convert</param>
        /// <param name="profile">Profile that determines the conversion process</param>
        /// <param name="tempFolder">
        ///     TempFolderProvider that gives the full Temp path, i.e. C:\Users\Admin\Local
        ///     Settings\Temp\clawPDF
        /// </param>
        /// <param name="jobTranslations">Translations needed for the job</param>
        /// <param name="fileWrap">Only for testing</param>
        /// <param name="directoryWrap">Only for testing</param>
        public GhostscriptJob(IJobInfo jobInfo, ConversionProfile profile, JobTranslations jobTranslations,
                              ITempFolderProvider tempFolder, IFile fileWrap, IDirectory directoryWrap)
            : base(jobInfo, profile, jobTranslations, fileWrap, directoryWrap)
        {
            var gsVersion = new GhostscriptDiscovery().GetBestGhostscriptInstance();

            if (gsVersion == null)
            {
                Logger.Error("No valid Ghostscript version found.");
                throw new InvalidOperationException("No valid Ghostscript version found.");
            }

            Logger.Debug("Ghostscript Version: " + gsVersion.Version + " loaded from " + gsVersion.DllPath);
            _ghostScript = new GhostScript(gsVersion);

            JobTempFolder = PathSafe.Combine(tempFolder.TempFolder,
                                             "Job_" + PathSafe.GetFileNameWithoutExtension(PathSafe.GetRandomFileName()));
            JobTempOutputFolder = PathSafe.Combine(JobTempFolder, "tempoutput");
            DirectoryWrap.CreateDirectory(JobTempFolder);
            DirectoryWrap.CreateDirectory(JobTempOutputFolder);

            // Shorten the temp folder for GS compatibility
            //缩短临时文件夹以实现GS兼容性
            JobTempFolder = JobTempFolder;
        }
Ejemplo n.º 4
0
        private string DetermineOutfileBody(string outputFilenameTemplate)
        {
            var outputDir    = PathSafe.GetDirectoryName(outputFilenameTemplate) ?? "";
            var filenameBase = PathSafe.GetFileNameWithoutExtension(outputFilenameTemplate) ?? "output";

            return(PathSafe.Combine(outputDir, filenameBase));
        }
Ejemplo n.º 5
0
        public override void MoveOutputFiles()
        {
            string outputDir    = PathSafe.GetDirectoryName(Job.OutputFilenameTemplate) ?? "";
            string filenameBase = PathSafe.GetFileNameWithoutExtension(Job.OutputFilenameTemplate) ?? "output";
            string outfilebody  = PathSafe.Combine(outputDir, filenameBase);

            Job.OutputFiles = new string[TempOutputFiles.Count]; //reserve space

            foreach (string tempoutputfile in TempOutputFiles)
            {
                string extension = PathSafe.GetExtension(TempOutputFiles[0]);

                string tempFileBase = PathSafe.GetFileNameWithoutExtension(tempoutputfile) ?? "output";
                string num          = tempFileBase.Replace(Job.JobTempFileName, "");

                int numValue;
                if (int.TryParse(num, out numValue))
                {
                    int numDigits = (int)Math.Floor(Math.Log10(TempOutputFiles.Count) + 1);
                    num = numValue.ToString("D" + numDigits);
                }

                string outputfile;
                if (num == "1")
                {
                    outputfile = outfilebody + extension;
                }
                else
                {
                    outputfile = outfilebody + num + extension;
                }

                lock (_lockObject)
                {
                    var uniqueFilename = new UniqueFilename(outputfile, DirectoryWrap, FileWrap);

                    if (Job.Profile.AutoSave.Enabled && Job.Profile.AutoSave.EnsureUniqueFilenames)
                    {
                        outputfile = EnsureUniqueFilename(uniqueFilename);
                    }

                    if (!CopyFile(tempoutputfile, outputfile))
                    {
                        outputfile = EnsureUniqueFilename(uniqueFilename);

                        if (!CopyFile(tempoutputfile, outputfile))
                        {
                            //Throw exception after second attempt to copy failes.
                            throw new DeviceException("Error while copying to target file in second attempt. Process gets canceled.", 2);
                        }
                    }
                }
                DeleteFile(tempoutputfile);
                Job.OutputFiles[Convert.ToInt32(num) - 1] = outputfile;
            }
        }
Ejemplo n.º 6
0
        /// <param name="originalFilename">Original file name</param>
        public UniqueFilenameBase(string originalFilename, IPathUtil pathUtil)
        {
            if (originalFilename == null)
            {
                throw new ArgumentNullException();
            }

            if (string.IsNullOrWhiteSpace(originalFilename))
            {
                throw new ArgumentException(nameof(originalFilename));
            }

            _pathUtil = pathUtil;

            OriginalFilename   = originalFilename;
            LastUniqueFilename = originalFilename;
            _directory         = PathSafe.GetDirectoryName(OriginalFilename) ?? "";
            _fileBody          = PathSafe.GetFileNameWithoutExtension(OriginalFilename);
            _extension         = PathSafe.GetExtension(OriginalFilename);
        }
Ejemplo n.º 7
0
        private void AddTokensFromOriginalFilePath(SourceFileInfo sfi, Metadata metadata, JobInfo.JobInfo jobInfo)
        {
            var originalFileName  = metadata.PrintJobName;
            var originalDirectory = "";

            if (!string.IsNullOrEmpty(jobInfo.OriginalFilePath))
            {
                originalFileName  = PathSafe.GetFileNameWithoutExtension(jobInfo.OriginalFilePath);
                originalDirectory = PathSafe.GetDirectoryName(jobInfo.OriginalFilePath);
            }
            else if (_pathUtil.IsValidRootedPath(sfi.DocumentTitle))
            {
                originalFileName  = PathSafe.GetFileNameWithoutExtension(sfi.DocumentTitle);
                originalDirectory = PathSafe.GetDirectoryName(sfi.DocumentTitle);
            }

            _tokenReplacer.AddStringToken("InputFilename", originalFileName);
            _tokenReplacer.AddStringToken("InputDirectory", originalDirectory);
            _tokenReplacer.AddStringToken("InputFilePath", originalDirectory);
        }
Ejemplo n.º 8
0
        private string DetermineNumWithDigits(Job job, string tempOutputFile)
        {
            var tempFileBase = PathSafe.GetFileNameWithoutExtension(tempOutputFile) ?? "output";
            var num          = tempFileBase.Replace(job.JobTempFileName, "");

            if (job.TempOutputFiles.Count == 1)
            {
                num = "";
            }
            else
            {
                int numValue;
                if (int.TryParse(num, out numValue))
                {
                    var numDigits = (int)Math.Floor(Math.Log10(job.TempOutputFiles.Count) + 1);
                    num = numValue.ToString("D" + numDigits);
                }
            }
            return(num);
        }
Ejemplo n.º 9
0
        private SourceFileInfo CreateSourceFileInfo(JobFolderFile jobFolderFile, AppStartParameters appStartParameters)
        {
            var sourceFileInfo = new SourceFileInfo();

            sourceFileInfo.Filename            = jobFolderFile.FileInJobFolder;
            sourceFileInfo.Author              = Environment.UserName;
            sourceFileInfo.ClientComputer      = Environment.MachineName.Replace("\\", "");
            sourceFileInfo.Copies              = 1;
            sourceFileInfo.DocumentTitle       = PathSafe.GetFileNameWithoutExtension(jobFolderFile.OriginalFilePath);
            sourceFileInfo.OriginalFilePath    = jobFolderFile.OriginalFilePath;
            sourceFileInfo.JobCounter          = 0;
            sourceFileInfo.JobId               = 0;
            sourceFileInfo.PrinterParameter    = appStartParameters.Printer;
            sourceFileInfo.ProfileParameter    = appStartParameters.Profile;
            sourceFileInfo.OutputFileParameter = appStartParameters.OutputFile;
            sourceFileInfo.SessionId           = Process.GetCurrentProcess().SessionId;
            sourceFileInfo.TotalPages          = _directConversionHelper.GetNumberOfPages(jobFolderFile.FileInJobFolder);
            sourceFileInfo.Type       = JobType.PsJob;
            sourceFileInfo.WinStation = Environment.GetEnvironmentVariable("SESSIONNAME");

            return(sourceFileInfo);
        }
Ejemplo n.º 10
0
        private void SetTempFolders(Job job)
        {
            job.JobTempFolder = PathSafe.Combine(_tempFolderProvider.TempFolder,
                                                 "Job_" + PathSafe.GetFileNameWithoutExtension(Path.GetRandomFileName()));
            _directory.CreateDirectory(job.JobTempFolder);
            job.JobTempOutputFolder = PathSafe.Combine(job.JobTempFolder, "tempoutput");
            _directory.CreateDirectory(job.JobTempOutputFolder);
            job.IntermediateFolder = PathSafe.Combine(job.JobTempFolder, "intermediate");
            _directory.CreateDirectory(job.IntermediateFolder);

            // Shorten the temp folder for GS compatibility
            job.JobTempFolder = PathHelper.GetShortPathName(job.JobTempFolder);
            //TODO remove this after upgrade to GS 9.19

            if (job.Profile.SaveFileTemporary)
            {
                var tempPath = PathSafe.Combine(_tempFolderProvider.TempFolder,
                                                "Job_tempsave_" + PathSafe.GetFileNameWithoutExtension(Path.GetRandomFileName()));

                job.OutputFileTemplate = PathSafe.Combine(tempPath, PathSafe.GetFileNameWithoutExtension(job.OutputFileTemplate));
            }
        }
Ejemplo n.º 11
0
        /// <summary>
        ///     Adds ellipsis to a path with a length longer than 255.
        /// </summary>
        /// <param name="filePath">full path to file</param>
        /// <param name="maxLength">maximum length of the string. This must be between 10 and MAX_PATH (260)</param>
        /// <returns>file path with ellipsis to ensure length under the max length </returns>
        public string EllipsisForFilename(string filePath, int maxLength)
        {
            if (filePath == null)
            {
                throw new ArgumentNullException(nameof(filePath));
            }

            if (filePath.EndsWith("\\"))
            {
                throw new ArgumentException("The path has to be a file", nameof(filePath));
            }

            if (maxLength < 10 || maxLength > MAX_PATH)
            {
                throw new ArgumentException($"The desired length must be between 10 and {MAX_PATH}", nameof(maxLength));
            }

            if (filePath.Length > maxLength)
            {
                int minUsefulFileLength = 4;

                var directory = PathSafe.GetDirectoryName(filePath) ?? "";
                var file      = PathSafe.GetFileNameWithoutExtension(filePath);
                var extension = PathSafe.GetExtension(filePath);

                var remainingLengthForFile = maxLength - directory.Length - extension.Length - ELLIPSIS.Length - 1; // substract -1 to account for the slash between path and filename
                if (remainingLengthForFile < minUsefulFileLength)
                {
                    throw new ArgumentException("The path is too long", nameof(filePath)); //!
                }

                var partLength = remainingLengthForFile / 2;

                file     = file.Substring(0, partLength) + ELLIPSIS + file.Substring(file.Length - partLength, partLength);
                filePath = PathSafe.Combine(directory, file + extension);
            }

            return(filePath);
        }
Ejemplo n.º 12
0
        /// <summary>
        ///     Get the list of Ghostscript Parameters. This List contains of a basic set of parameters together with some
        ///     device-specific
        ///     parameters that will be added by the device implementation
        /// </summary>
        /// <param name="ghostscriptVersion"></param>
        /// <returns>A list of parameters that will be passed to Ghostscript</returns>
        public IList <string> GetGhostScriptParameters(GhostscriptVersion ghostscriptVersion)
        {
            IList <string> parameters = new List <string>();

            var outputFormatHelper = new OutputFormatHelper();

            parameters.Add("gs");
            parameters.Add("-I" + ghostscriptVersion.LibPaths);
            parameters.Add("-sFONTPATH=" + _osHelper.WindowsFontsFolder);

            parameters.Add("-dNOPAUSE");
            parameters.Add("-dBATCH");

            if (!outputFormatHelper.HasValidExtension(Job.OutputFileTemplate, Job.Profile.OutputFormat))
            {
                outputFormatHelper.EnsureValidExtension(Job.OutputFileTemplate, Job.Profile.OutputFormat);
            }

            AddOutputfileParameter(parameters);

            AddDeviceSpecificParameters(parameters);

            // Add user-defined parameters
            if (!string.IsNullOrEmpty(Job.Profile.Ghostscript.AdditionalGsParameters))
            {
                var args = _commandLineUtil.CommandLineToArgs(Job.Profile.Ghostscript.AdditionalGsParameters);
                foreach (var s in args)
                {
                    parameters.Add(s);
                }
            }

            //Dictonary-Parameters must be the last Parameters
            if (DistillerDictonaries.Count > 0)
            {
                parameters.Add("-c");
                foreach (var parameter in DistillerDictonaries)
                {
                    parameters.Add(parameter);
                }
            }

            //Don't add further paramters here, since the distiller-parameters should be the last!

            parameters.Add("-f");

            if (Job.Profile.Stamping.Enabled)
            {
                // Compose name of the stamp file based on the location and name of the inf file
                var stampFileName = PathSafe.Combine(Job.JobTempFolder,
                                                     PathSafe.GetFileNameWithoutExtension(Job.JobInfo.InfFile) + ".stm");
                CreateStampFile(stampFileName, Job.Profile, Job.TokenReplacer);
                parameters.Add(stampFileName);
            }

            SetCover(Job, parameters);

            foreach (var sfi in Job.JobInfo.SourceFiles)
            {
                parameters.Add(PathHelper.GetShortPathName(sfi.Filename));
            }

            SetAttachment(Job, parameters);

            // Compose name of the pdfmark file based on the location and name of the inf file
            var pdfMarkFileName = PathSafe.Combine(Job.JobTempFolder, "metadata.mtd");

            CreatePdfMarksFile(pdfMarkFileName);

            // Add pdfmark file as input file to set metadata
            parameters.Add(pdfMarkFileName);

            return(parameters);
        }