/* ----------------------------------------------------------------- */ /// /// ConfigureCommonImage /// /// <summary> /// 画像に関わるオプションを設定します。 /// </summary> /// /// <remarks> /// 全てのファイルタイプ共通の設定です。 /// </remarks> /// /* ----------------------------------------------------------------- */ private void ConfigureCommonImage(UserSetting setting, Ghostscript.Converter gs) { gs.AddOption("ColorConversionStrategy", setting.Grayscale ? "/Gray" : "/RGB"); gs.AddOption("DownsampleColorImages", true); gs.AddOption("DownsampleGrayImages", true); gs.AddOption("DownsampleMonoImages", true); // 解像度 var resolution = Parameter.ToValue(setting.Resolution); var mono = resolution < 300 ? 300 : 1200; gs.AddOption("ColorImageResolution", resolution); gs.AddOption("GrayImageResolution", resolution); gs.AddOption("MonoImageResolution", mono); // 画像圧縮 gs.AddOption("AutoFilterColorImages", false); gs.AddOption("AutoFilterGrayImages", false); gs.AddOption("AutoFilterMonoImages", false); gs.AddOption("ColorImageFilter", "/" + setting.ImageFilter.ToString()); gs.AddOption("GrayImageFilter", "/" + setting.ImageFilter.ToString()); gs.AddOption("MonoImageFilter", "/" + setting.ImageFilter.ToString()); // ダウンサンプリング if (setting.DownSampling != Parameter.DownSamplings.None) { gs.AddOption("ColorImageDownsampleType", "/" + setting.DownSampling.ToString()); gs.AddOption("GrayImageDownsampleType", "/" + setting.DownSampling.ToString()); gs.AddOption("MonoImageDownsampleType", "/" + setting.DownSampling.ToString()); } }
/* ----------------------------------------------------------------- */ /// /// ConfigImageOperations /// /// <summary> /// 画像に関わるオプションを設定します。 /// </summary> /// /* ----------------------------------------------------------------- */ public void ConfigImageOperations(UserSetting setting, Ghostscript.Converter gs) { // 解像度 var resolution = Parameter.ResolutionValue(setting.Resolution); gs.AddOption("ColorImageResolution", resolution); gs.AddOption("GrayImageResolution", resolution); gs.AddOption("MonoImageResolution", (resolution < 300) ? 300 : 1200); // 画像圧縮 gs.AddOption("AutoFilterColorImages", false); gs.AddOption("AutoFilterGrayImages", false); gs.AddOption("AutoFilterMonoImages", false); gs.AddOption("ColorImageFilter", "/" + setting.ImageFilter.ToString()); gs.AddOption("GrayImageFilter", "/" + setting.ImageFilter.ToString()); gs.AddOption("MonoImageFilter", "/" + setting.ImageFilter.ToString()); // ダウンサンプリング if (setting.DownSampling == Parameter.DownSamplings.None) { gs.AddOption("DownsampleColorImages", false); gs.AddOption("DownsampleGrayImages", false); gs.AddOption("DownsampleMonoImages", false); } else { gs.AddOption("DownsampleColorImages", true); gs.AddOption("DownsampleGrayImages", true); gs.AddOption("DownsampleMonoImages", true); gs.AddOption("ColorImageDownsampleType", "/" + setting.DownSampling.ToString()); gs.AddOption("GrayImageDownsampleType", "/" + setting.DownSampling.ToString()); gs.AddOption("MonoImageDownsampleType", "/" + setting.DownSampling.ToString()); } }
/* ----------------------------------------------------------------- */ /// /// Configure /// /// <summary> /// Ghostscript オブジェクトを生成し、必要な設定を行います。 /// </summary> /// /* ----------------------------------------------------------------- */ private Ghostscript.Converter Configure(UserSetting setting, string src, string dest) { var gs = new Ghostscript.Converter(_messages); if (!string.IsNullOrEmpty(setting.LibPath)) { gs.AddInclude(IoEx.Path.Combine(setting.LibPath, "lib")); } gs.Device = Parameter.GetDevice(setting.FileType, setting.Grayscale); gs.Resolution = Parameter.ToValue(setting.Resolution); if (setting.Orientation == Parameter.Orientations.Auto) { gs.AutoRotatePages = true; } else { gs.Orientation = (int)setting.Orientation; } ConfigureCommonImage(setting, gs); if (Parameter.IsImageType(setting.FileType)) { ConfigureBitmap(setting, gs); } else { ConfigureDocument(setting, gs); } gs.AddSource(src); gs.Destination = dest; return(gs); }
/* ----------------------------------------------------------------- */ /// /// ConfigPdf /// /// <summary> /// PDF ファイルに変換するために必要なオプションを設定します。 /// </summary> /// /* ----------------------------------------------------------------- */ public void ConfigPdf(UserSetting setting, Ghostscript.Converter gs) { gs.AddOption("CompatibilityLevel", Parameter.PdfVersionValue(setting.PDFVersion)); gs.AddOption("UseFlateCompression", true); if (setting.PDFVersion == Parameter.PdfVersions.VerPDFA) { this.ConfigPdfA(setting, gs); } else if (setting.PDFVersion == Parameter.PdfVersions.VerPDFX) { this.ConfigPdfX(setting, gs); } else { if (setting.EmbedFont) { gs.AddOption("EmbedAllFonts", true); gs.AddOption("SubsetFonts", true); } else { gs.AddOption("EmbedAllFonts", false); } if (setting.Grayscale) { gs.AddOption("ProcessColorModel", "/DeviceGray"); gs.AddOption("ColorConversionStrategy", "/Gray"); } } }
/* ----------------------------------------------------------------- */ /// /// ConfigurePdfX /// /// <summary> /// PDF/X 形式に変換するのに必要なオプションを設定します。 /// </summary> /// /// <remarks> /// PDF/X(1-a) の主な要求項目は以下の通り: /// /// - すべてのイメージのカラーは CMYKか 特色 /// - 基本 14 フォントを含む全てのフォントの埋め込み /// </remarks> /// /* ----------------------------------------------------------------- */ private void ConfigurePdfX(UserSetting setting, Ghostscript.Converter gs) { gs.AddOption("PDFX"); gs.AddOption("EmbedAllFonts", true); gs.AddOption("SubsetFonts", true); if (!setting.Grayscale) { gs.AddOption("ColorConversionStrategy", "/CMYK"); } }
/* ----------------------------------------------------------------- */ /// /// ConfigureDocument /// /// <summary> /// PDF, PostScript, EPS のファイルに変換するために必要なオプションを /// 設定します。 /// </summary> /// /* ----------------------------------------------------------------- */ private void ConfigureDocument(UserSetting setting, Ghostscript.Converter gs) { gs.AddOption("EmbedAllFonts", setting.EmbedFont); if (setting.EmbedFont) { gs.AddOption("SubsetFonts", true); } if (setting.FileType == Parameter.FileTypes.PDF) { ConfigurePdf(setting, gs); } }
/* ----------------------------------------------------------------- */ /// /// ConfigPdfA /// /// <summary> /// PDF/A 形式に変換するのに必要なオプションを設定します。 /// </summary> /// /// <remarks> /// PDF/A の主な要求項目は以下の通り: /// /// - デバイス独立カラーまたは PDF/A-1 OutputIntent 指定でカラーの /// 再現性を保証する /// - 基本 14 フォントを含む全てのフォントの埋め込み /// - PDF/Aリーダは,システムのフォントでなく埋め込みフォントで /// 表示すること /// - XMPメタデータの埋め込み /// - タグ付きPDFとする(PDF/A-1aのみ) /// </remarks> /// /* ----------------------------------------------------------------- */ public void ConfigPdfA(UserSetting setting, Ghostscript.Converter gs) { gs.AddOption("PDFA"); gs.AddOption("EmbedAllFonts", true); gs.AddOption("SubsetFonts", true); if (setting.Grayscale) { gs.AddOption("ProcessColorModel", "/DeviceGray"); gs.AddOption("ColorConversionStrategy", "/Gray"); } gs.AddOption("UseCIEColor"); }
/* ----------------------------------------------------------------- */ /// /// ConfigurePdf /// /// <summary> /// PDF ファイルに変換するために必要なオプションを設定します。 /// </summary> /// /* ----------------------------------------------------------------- */ private void ConfigurePdf(UserSetting setting, Ghostscript.Converter gs) { gs.AddOption("CompatibilityLevel", Parameter.ToValue(setting.PDFVersion)); gs.AddOption("UseFlateCompression", true); if (setting.PDFVersion == Parameter.PdfVersions.VerPDFA) { ConfigurePdfA(setting, gs); } if (setting.PDFVersion == Parameter.PdfVersions.VerPDFX) { ConfigurePdfX(setting, gs); } }
/* ----------------------------------------------------------------- */ /// /// ConfigDocument /// /// <summary> /// pdf, ps, eps, svg のベクター系ファイルに変換するために必要な /// オプションを設定します。 /// </summary> /// /* ----------------------------------------------------------------- */ public void ConfigDocument(UserSetting setting, Ghostscript.Converter gs) { if (setting.FileType == Parameter.FileTypes.PDF) { this.ConfigPdf(setting, gs); } else { if (setting.EmbedFont) { gs.AddOption("EmbedAllFonts", true); gs.AddOption("SubsetFonts", true); } else { gs.AddOption("EmbedAllFonts", false); } } }
/* ----------------------------------------------------------------- */ /// /// ConfigurePdfA /// /// <summary> /// PDF/A 形式に変換するのに必要なオプションを設定します。 /// </summary> /// /// <remarks> /// PDF/A の主な要求項目は以下の通り: /// /// - デバイス独立カラーまたは PDF/A-1 OutputIntent 指定でカラーの /// 再現性を保証する /// - 基本 14 フォントを含む全てのフォントの埋め込み /// - PDF/Aリーダは,システムのフォントでなく埋め込みフォントで /// 表示すること /// - XMPメタデータの埋め込み /// - タグ付きPDFとする(PDF/A-1aのみ) /// </remarks> /// /* ----------------------------------------------------------------- */ private void ConfigurePdfA(UserSetting setting, Ghostscript.Converter gs) { gs.AddOption("PDFA"); gs.AddOption("EmbedAllFonts", true); gs.AddOption("SubsetFonts", true); }
/* ----------------------------------------------------------------- */ /// /// ConfigureBitmap /// /// <summary> /// BMP, PNG, JPEG のビットマップ系ファイルに変換するために必要な /// オプションを設定します。 /// </summary> /// /* ----------------------------------------------------------------- */ private void ConfigureBitmap(UserSetting setting, Ghostscript.Converter gs) { gs.AddOption("GraphicsAlphaBits", 4); gs.AddOption("TextAlphaBits", 4); }
/* ----------------------------------------------------------------- */ // UserSetting の値を基に各種設定を行う /* ----------------------------------------------------------------- */ #region Configuration /* ----------------------------------------------------------------- */ /// /// ConfigImage /// /// <summary> /// bmp, png, jpeg, gif のビットマップ系ファイルに変換するために /// 必要なオプションを設定します。 /// </summary> /// /* ----------------------------------------------------------------- */ public void ConfigImage(UserSetting setting, Ghostscript.Converter gs) { gs.AddOption("GraphicsAlphaBits", 4); gs.AddOption("TextAlphaBits", 4); }
/* ----------------------------------------------------------------- */ /// /// Run /// /// <summary> /// ファイル変換処理を実行します。 /// </summary> /// /// <remarks> /// 文書プロパティ、パスワード関連とファイル結合は iTextSharp /// を利用します。出力パスに指定されたファイルが既に存在する場合、 /// ExistedFile プロパティの指定(上書き、先頭に結合、末尾に結合、 /// リネーム)に従います。 /// </remarks> /// /* ----------------------------------------------------------------- */ public bool Run(UserSetting setting) { // Ghostscript に指定するパスに日本語が入るとエラーが発生する // 場合があるので,作業ディレクトリを変更する. this.CreateWorkingDirectory(setting); Ghostscript.Converter gs = new Ghostscript.Converter(_messages); gs.Device = Parameter.Device(setting.FileType, setting.Grayscale); bool status = true; try { gs.AddInclude(setting.LibPath + @"\lib"); gs.PageRotation = setting.PageRotation; gs.Resolution = Parameter.ResolutionValue(setting.Resolution); this.ConfigImageOperations(setting, gs); if (Parameter.IsImageType(setting.FileType)) { this.ConfigImage(setting, gs); } else { this.ConfigDocument(setting, gs); } this.EscapeExistedFile(setting); gs.AddSource(setting.InputPath); gs.Destination = setting.OutputPath; gs.Run(); if (setting.FileType == Parameter.FileTypes.PDF) { PdfModifier modifier = new PdfModifier(_escaped, _messages); status = modifier.Run(setting); _messages.Add(new Message(Message.Levels.Info, String.Format("CubePdf.PDFModifier.Run: {0}", status.ToString()))); } if (status) { PostProcess postproc = new PostProcess(_messages); status = postproc.Run(setting); _messages.Add(new Message(Message.Levels.Info, String.Format("CubePdf.PostProcess.Run: {0}", status.ToString()))); } } catch (Exception err) { _messages.Add(new Message(Message.Levels.Error, err)); _messages.Add(new Message(Message.Levels.Debug, err)); status = false; } finally { if (Directory.Exists(Utility.WorkingDirectory)) { Directory.Delete(Utility.WorkingDirectory, true); } if (setting.DeleteOnClose && File.Exists(setting.InputPath)) { _messages.Add(new Message(Message.Levels.Debug, String.Format("{0}: delete on close", setting.InputPath))); File.Delete(setting.InputPath); } } return(status); }