[英]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.