C# Ghostscript将PDF转换为文本文件并输出

C# Ghostscript将PDF转换为文本文件并输出,c#,pdf,text-files,ghostscript,C#,Pdf,Text Files,Ghostscript,1.我需要将PDF文件转换为txt.NET文件。我的命令似乎有效,因为我在屏幕上获得了转换后的文本,但不知怎么的,我无法将输出导入文本文件 public static string[] GetArgs(string inputPath, string outputPath) { return new[] { "-q", "-dNODISPLAY", "-dSAFER", "-dDELAYBIND", "-dWRITESYS

1.我需要将PDF文件转换为txt.NET文件。我的命令似乎有效,因为我在屏幕上获得了转换后的文本,但不知怎么的,我无法将输出导入文本文件

public static string[] GetArgs(string inputPath, string outputPath)
{ 
    return new[] {
                "-q", "-dNODISPLAY", "-dSAFER",
                "-dDELAYBIND", "-dWRITESYSTEMDICT", "-dSIMPLE",
                "-c", "save", "-f",
                "ps2ascii.ps", inputPath, "-sDEVICE=txtwrite",
                String.Format("-sOutputFile={0}", outputPath),
                "-c", "quit"
    }; 
}
2.是否有unicode专用的.ps

更新: 发布我的完整代码,可能错误在其他地方

public static string[] GetArgs(string inputPath, string outputPath)
{
    return new[]    
    {   "-o c:/test.txt",    
        "-dSIMPLE",
        "-sFONTPATH=c:/windows/fonts",
        "-dNODISPLAY",
        "-dDELAYBIND",
        "-dWRITESYSTEMDICT",
        "-f",
        "C:/Program Files/gs/gs9.05/lib/ps2ascii.ps",               
        inputPath,
    };
}

[DllImport("gsdll64.dll", EntryPoint = "gsapi_new_instance")]
private static extern int CreateAPIInstance(out IntPtr pinstance, IntPtr caller_handle);

[DllImport("gsdll64.dll", EntryPoint = "gsapi_init_with_args")]
private static extern int InitAPI(IntPtr instance, int argc, string[] argv);

[DllImport("gsdll64.dll", EntryPoint = "gsapi_exit")]
private static extern int ExitAPI(IntPtr instance);

[DllImport("gsdll64.dll", EntryPoint = "gsapi_delete_instance")]
private static extern void DeleteAPIInstance(IntPtr instance);`

private static object resourceLock = new object();

private static void Cleanup(IntPtr gsInstancePtr)
{
    ExitAPI(gsInstancePtr);
    DeleteAPIInstance(gsInstancePtr);
}

private static object resourceLock = new object();

public static void ConvertPdfToText(string inputPath, string outputPath) 
{ 
    CallAPI(GetArgs(inputPath, outputPath));
}

public static void ConvertPdfToText(string inputPath, string outputPath) 
{ 
    CallAPI(GetArgs(inputPath, outputPath));
}

private static void CallAPI(string[] args)      
{       
    // Get a pointer to an instance of the Ghostscript API and run the API with the current arguments       
    IntPtr gsInstancePtr;   
    lock (resourceLock)     
    {           
        CreateAPIInstance(out gsInstancePtr, IntPtr.Zero);      
        try
        {
            int result = InitAPI(gsInstancePtr, args.Length, args);                    
            if (result < 0)     
            {
                throw new ExternalException("Ghostscript conversion error", result);        
            }       
        }           
        finally     
        {               
            Cleanup(gsInstancePtr);     
        }       
    }   
}
publicstaticstring[]GetArgs(stringinputpath,stringoutputpath)
{
返回新的[]
{“-o c:/test.txt”,
“-dSIMPLE”,
“-sFONTPATH=c:/windows/font”,
“-dNODISPLAY”,
“-dDELAYBIND”,
“-dWRITESYSTEMDICT”,
“-f”,
“C:/Program Files/gs/gs9.05/lib/ps2ascii.ps”,
输入路径,
};
}
[DllImport(“gsdll64.dll”,EntryPoint=“gsapi\u新实例”)]
私有静态extern int createapinstance(out IntPtr pinstance,IntPtr调用者_handle);
[DllImport(“gsdll64.dll”,EntryPoint=“gsapi_init_with_args”)]
私有静态外部intinitapi(IntPtr实例,intargc,字符串[]argv);
[DllImport(“gsdll64.dll”,EntryPoint=“gsapi_exit”)]
私有静态外部intexitapi(IntPtr实例);
[DllImport(“gsdll64.dll”,EntryPoint=“gsapi\u delete\u实例”)]
私有静态外部void DeleteAPIInstance(IntPtr实例)`
私有静态对象resourceLock=新对象();
专用静态无效清除(IntPtr gsInstancePtr)
{
出口(gsInstancePtr);
DeleteAPIInstance(gsInstancePtr);
}
私有静态对象resourceLock=新对象();
公共静态void ConvertPdfToText(字符串输入路径、字符串输出路径)
{ 
CallAPI(GetArgs(inputPath,outputPath));
}
公共静态void ConvertPdfToText(字符串输入路径、字符串输出路径)
{ 
CallAPI(GetArgs(inputPath,outputPath));
}
私有静态void CallAPI(字符串[]args)
{       
//获取指向Ghostscript API实例的指针,并使用当前参数运行该API
IntPtr-gsInstancePtr;
锁(资源锁)
{           
CreateAPIInstance(out gsInstancePtr,IntPtr.Zero);
尝试
{
int result=InitAPI(gsInstancePtr,args.Length,args);
如果(结果<0)
{
抛出新的外部异常(“Ghostscript转换错误”,结果);
}       
}           
最后
{               
清理(gsInstancePtr);
}       
}   
}

2个问题,2个答案:

  • 要获得文件的输出,请在命令行上使用
    -sOutputFile=/path/To/file
    ,或添加该行

     "-sOutputFile=/where/it/should/go",
    
    到你的
    c
    代码(可以是第一个参数,但应该在你的第一个
    “-c”
    之前。但是首先要去掉你的另一个
    -sOutputFile
    文件…:-)

  • 不,PostScript不知道Unicode


  • 更新

    (注:从PDF中可靠地提取文本(由于各种技术原因)是出了名的困难。而且它可能根本不起作用,无论您使用哪种工具……)

    在命令行上,以下两个应该适用于Ghostscript的最新版本(当前版本为v9.05)。这将是你自己的工作

    • …测试哪个命令更适合您的用例,以及
    • …将这些转换为
      c#
      code
    1. <代码>txtwrite设备: 注意事项:

  • 如果系统为64位,则可能需要在系统上使用
    gswin64c.exe
    (如果可用)
  • 输出的
    -o
    语法仅适用于最新版本的Ghostscript
  • -o
    语法也隐含地设置了
    -dBATCH
    -dNOPAUSE
    参数
  • 如果您的Ghostscript太旧并且
    -o
    速记不起作用,请将其替换为
    -dBATCH-dNOPAUSE-sOutputFile=…
  • 即使在Windows上,Ghostscript也可以在路径参数内处理正向斜杠
  • 不管怎样,
    -dTextFormat
    默认设置为
    3
    ,因此此处不需要它。”it的“法律”价值是:
    • 0
      :输出XML转义Unicode以及与文本格式(位置、字体名称、点大小等)相关的信息。仅供开发人员使用
    • 1
      :与
      0
      相同,但将输出文本块
    • 2
      :输出带有BMO(字节顺序标记)的Unicode(UCS2)文本;尝试近似原始文档中的文本布局
    • 3
      (默认)
      2
      相同,但文本以UTF-8编码
  • 带有此
    -dTextFormat
    修饰符的
    txtwoite
    设备是Ghostscript的一项新资产,因此如果您找到了,请联系我们
  • 2.使用
    ps2ascii.ps
    注意事项:

  • 这是一种与
    txtwite
    设备一完全不同的方法,不能与之混合使用
  • ps2ascii.ps
    是一个文件,是Ghostscript调用以提取文本的PostScript程序。它通常位于Ghostscript installdir的
    /lib
    子目录中。去看看它是否真的在那里
  • -dSIMPLE
    可以替换为
    dCOMPLEX
    ,以便打印额外的信息行(当前颜色、图像的存在、矩形填充)
  • -sstdout=…
    是必需的,因为
    ps2ascii.ps
    PostScript程序只打印到标准输出,不能告诉它写入文件。因此,
    -sstdout=…
    告诉Ghostscript将其标准输出重定向到一个文件
  • 3.非重影脚本方法 不要忽略其他可能更容易使用的非重影脚本方法。以下所有内容都是跨平台的,也应在Windows上提供:

    • mudraw-t

      GPL许可(或商业,如果需要)。从中提取PDF文本的命令行实用程序(正在开发
      gswin32c.exe ^
         -o c:/path/to/output.txt ^
         -dTextFormat=3 ^
         -sDEVICE=txtwrite ^
          input.pdf
      
      gswin32c.exe ^
         -sstdout=c:/path/to/output.txt ^
         -dSIMPLE ^
         -sFONTPATH=c:/windows/fonts ^
         -dNODISPLAY 
         -dDELAYBIND ^
         -dWRITESYSTEMDICT ^
         -f /path/to/ps2ascii.ps ^
          input.pdf