簡體   English   中英

在Windows中將GhostScript 9.10與參數中的Unicode字符一起使用

[英]Using GhostScript 9.10 in Windows with Unicode characters in parameters

我想在.NET / C#應用程序中使用Ghostscript將.tiff文件轉換為PDF。 我的問題:當文件路徑包含非ansi字符(例如Umlaute)時,該函數

gsapi_init_with_args 

失敗。 (對於GS 8.x,它可以正常工作!)。 我發現在9.x中該行為已更改的信息,並且我還找到了一個名為

gsapi_init_with_argsW

而且此功能應該可以與.NET一起使用,而不會出現任何問題(請參閱http://permalink.gmane.org/gmane.comp.printing.ghostscript.cvs/31721

因此,我使用以下DLLImport:

[DllImport(@"gsdll32.dll")]
public static extern int gsapi_init_with_argsW( IntPtr instace, int argc, string[] argv);

但這仍然不起作用,我得到了錯誤:

Error: /undefinedfilename
in (C:\\304NDERUNGEN\\TEST.PDF)

文件的名稱應為

C:\\ÄNDERUNGEN\\TEST.PDF

因此無法正確識別變音符號“Ä”。

我在網上搜索了很多,但沒有找到解決方案。

任何想法? 謝謝!

我懷疑您將需要在此處使用UTF-8。 撥打電話到gs_set_arg_encoding傳遞GS_ARG_ENCODING_UTF8

傳遞給Ghostscript的任何字符串都應聲明為IntPtr 若要將C#字符串轉換為以NTF結尾的空字符串,請使用Hans Passant提供的以下功能

public static IntPtr NativeUtf8FromString(string managedString) 
{
    int len = Encoding.UTF8.GetByteCount(managedString);
    byte[] buffer = new byte[len + 1]; // null-terminator allocated
    Encoding.UTF8.GetBytes(managedString, 0, managedString.Length, buffer, 0);
    IntPtr nativeUtf8 = Marshal.AllocHGlobal(buffer.Length);
    Marshal.Copy(buffer, 0, nativeUtf8, buffer.Length);
    return nativeUtf8;
}

確保記得通過調用Marshal.FreeHGlobal進行清理。

整體代碼可能看起來像這樣:

public class Ghostscript
{
    public const int GS_ARG_ENCODING_LOCAL = 0;
    public const int GS_ARG_ENCODING_UTF8 = 1;

    [DllImport("gsdll32.dll")]
    private static extern int gsapi_new_instance(out IntPtr inst, IntPtr handle);

    [DllImport("gsdll32.dll")]
    private static extern int gsapi_set_arg_encoding(IntPtr inst, int encoding);

    [DllImport("gsdll32.dll")]
    private static extern int gsapi_init_with_args(IntPtr inst, int argc, IntPtr[] argv);

    [DllImport("gsdll32.dll")]
    private static extern int gsapi_exit(IntPtr inst);

    [DllImport("gsdll32.dll")]
    private static extern void gsapi_delete_instance(IntPtr inst);

    private static void checkReturnValue(int retval)
    {
        if (retval != 0)
            throw ...; // implement error handling here
    }

    public static void run(string[] argv)
    {
        IntPtr inst;
        checkReturnValue(gsapi_new_instance(out inst, IntPtr.Zero));
        try
        {
            IntPtr[] utf8argv = new IntPtr[argv.length];
            for (int i=0; i<utf8argv.Length; i++)
                utf8argv[i] = NativeUtf8FromString(argv[i]);
            try
            {
                checkReturnValue(gsapi_set_arg_encoding(inst, GS_ARG_ENCODING_UTF8));
                checkReturnValue(gsapi_init_with_args(inst, utf8argv.Length, utf8argv));
                checkReturnValue(gsapi_exit(inst));
            finally
            {
                for (int i=0; i<utf8argv.Length; i++)
                    Marshal.FreeHGlobal(utf8argv[i]);
            }
        }
        finally
        {
            gsapi_delete_instance(inst);
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM