我想从 C# 中剪下 postscript 页面的一部分,旋转结果并将其保存为新的 postscript 页面。
我的源文件是 A4 的 Postscript 页面,纵向格式。页面由四个象限组成,每个象限是纵向格式的 A6。我想切掉左上象限。这将产生一个 A6 格式的页面。最后我想把这张 A6 页面顺时针旋转 90° 并再次输出为 postscript 文件。
我想从 Windows 下的 C# 应用程序调用这个过程,为此我想为 Ghostscript 使用 .Net-wrapper。
我可以使用以下代码从命令行执行任务:
"c:\Program Files (x86)\gs\gs9.50\bin\gswin32c.exe" ^
-o output_A6_upper_left_quadrant.ps ^
-sDEVICE=ps2write ^
-g4210x2970 ^
-c "<</Install {-421 297 translate 270 rotate}>> setpagedevice" ^
-f input_4_Quadrants_A4.ps
(我也尝试过使用 PageOffset 和 Orientation 的变体,但在 Windows 下这对我不起作用。)
为了从 C# 中完成任务,我尝试了 Ghostscript.Net 和 GhostscriptSharp。不幸的是,两者都没有成功。
我在 Ghostscript.net 上尝试了这段代码,灵感来自于包含的示例:
namespace Ghostscript.NET.Samples
{
public class ProcessorSample3 : ISample
{
public void Start()
{
string inputFile = @"C:\Users\plehn\test\input_4_Quadrants_A4.ps";
string outputFile = @"C:\Users\plehn\test\output_A6_upper_left_quadrant.ps";
using (GhostscriptProcessor ghostscript = new GhostscriptProcessor())
{
ghostscript.Processing += new GhostscriptProcessorProcessingEventHandler(ghostscript_Processing);
List<string> switches = new List<string>();
switches.Add("-empty");
switches.Add("-dBATCH");
switches.Add("-dNOPAUSE");
switches.Add("-sOutputFile=" + outputFile);
switches.Add("-sDEVICE=ps2write");
switches.Add("-g4210x2970");
// the following switch seems to be ignored…
switches.Add(@"-c ""<</Install {-421 297 translate 270 rotate}>> setpagedevice""");
switches.Add("-f");
switches.Add(inputFile);
ghostscript.Process(switches.ToArray());
}
}
void ghostscript_Processing(object sender, GhostscriptProcessorProcessingEventArgs e)
{
Console.WriteLine(e.CurrentPage.ToString() + " / " + e.CurrentPage.ToString());
}
}
}
这是我用 GhostscriptSharp 尝试的代码:
使用此调用:
GhostscriptWrapper.CropPage(@"C:\Users\plehn\test\input_4_Quadrants_A4.ps", @"C:\Users\plehn\test\output_A6_upper_left_quadrant.ps", 421, 297, -421, 297, 270);
我在公共类 GhostscriptWrapper 中添加了另一个函数
/// <summary>
/// Crops a document using the parameters
/// </summary>
/// <param name="inputPath">file to crop</param>
/// <param name="outputPath">Destination file</param>
/// <param name="cropX">Cropping width</param>
/// <param name="cropY">Cropping height</param>
/// <param name="translateX">Optional x-position if cropping rectangle</param>
/// <param name="translateY">Optional y-position if cropping rectangle</param>
/// <param name="rotate">Optional rotation angle, counterclockwise</param>
public static void CropPage(string inputPath, string outputPath, int cropX, int cropY, int translateX = 0, int translateY = 0, int rotate = 0)
{
GhostscriptSettings settings = new GhostscriptSettings();
settings.Device = Settings.GhostscriptDevices.ps2write;
if (IntPtr.Size == 4)
API.GhostScript32.CallAPI(GetArgs(inputPath, outputPath, cropX, cropY, translateX, translateY, rotate));
else
API.GhostScript64.CallAPI(GetArgs(inputPath, outputPath, cropX, cropY, translateX, translateY, rotate));
}
/// <summary>
/// Returns an array of arguments to be sent to the Ghostscript API
/// </summary>
private static string[] GetArgs(string inputPath, string outputPath, int cropX, int cropY, int translateX = 0, int translateY = 0, int rotate = 0)
{
//System.Collections.ArrayList args = new System.Collections.ArrayList(ARGS);
System.Collections.ArrayList args = new System.Collections.ArrayList(); // test wihout standards...
args.Add("-q"); // First parameter is ignored
args.Add("-dBATCH");
args.Add("-dNOPAUSE");
args.Add(String.Format("-sOutputFile={0}", outputPath));
args.Add("-sDEVICE=ps2write");
args.Add("-dAutoRotatePages=/None");
args.Add(String.Format("-g{0}0x{1}0", cropX, cropY)); // is equal to -dDEVICEWIDTHPOINTS=cropX & -dDEVICEHEIGHTPOINTS=CropY & -dFIXEDMEDIA
// the following arg seems to be ignored...
args.Add("-c \"<</Install {" + String.Format("{0} {1} translate {2} rotate", translateX, translateY, rotate) + "}>> setpagedevice\"");
args.Add(String.Format("-f\u0022{0}\u0022", inputPath));
return (string[])args.ToArray(typeof(string));
}
使用这两种方法,我都可以成功地从 A4 页面中剪切出 A6 页面,但是平移和旋转都没有完成。剪切在坐标原点的左下角完成。
在我看来,“-c”命令不能作为参数传递给 DLL 函数 gsapi_init_with_args,但我不确定。
Ghostscrip.Net 中的一个示例表明可以使用函数 gsapi_run_string 代替 init_with_args。在查看器示例中,字符串包含在 %%BeginPageSetup 和 %%EndPageSetup 中。但是,我无法结合 gsapi_run_string 构建 gsapi_init_with_args 的工作调用。
对于两个包装器之一或什至另一个包装器的任何提示将不胜感激。