1

我想从 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 的工作调用。

对于两个包装器之一或什至另一个包装器的任何提示将不胜感激。

4

0 回答 0