gpt4 book ai didi

c# - 在参数中使用带有 Unicode 字符的 Windows 中的 GhostScript 9.10

转载 作者:太空宇宙 更新时间:2023-11-03 13:29:13 24 4
gpt4 key购买 nike

我想在 .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# 字符串转换为以 null 结尾的 UTF-8 编码字符串,请使用此 function provided by 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);
}
}
}

关于c# - 在参数中使用带有 Unicode 字符的 Windows 中的 GhostScript 9.10,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21251895/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com