5

1.我需要将PDF文件转换成txt.file。我的命令似乎有效,因为我在屏幕上获得了转换后的文本,但不知何故我无法将输出定向到文本文件中。

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);     
        }       
    }   
}
4

1 回答 1

8

2个问题,2个答案:

  1. 要将输出输出到文件,-sOutputFile=/path/to/file请在命令行上使用,或添加行

     "-sOutputFile=/where/it/should/go",
    

    到你的c#代码(可以是第一个参数,但应该在你的第一个参数之前"-c"。但首先摆脱-sOutputFile你已经在那里的其他东西...... :-)

  2. 不,PostScript 不知道 Unicode。


更新

(备注:可靠地从 PDF 中提取文本(由于各种技术原因)非常困难。而且无论您尝试哪种工具,它都可能根本不起作用......)

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

  • ...测试哪个命令更适合您的用例,以及
  • ...将这些翻译成c#代码。

1.txtwrite设备:

gswin32c.exe ^
   -o c:/path/to/output.txt ^
   -dTextFormat=3 ^
   -sDEVICE=txtwrite ^
    input.pdf

笔记:

  1. 如果它是 64 位,您可能希望gswin64c.exe在您的系统上使用(如果可用)。
  2. 输出的-o语法仅适用于最新版本的 Ghostscript。
  3. -o语法也隐含地设置了-dBATCHand-dNOPAUSE参数。
  4. 如果您的 Ghostscript 太旧并且-o速记不起作用,请将其替换为-dBATCH -dNOPAUSE -sOutputFile=....
  5. 即使在 Windows 上,Ghostscript 也可以处理路径参数中的正斜杠。
  6. -dTextFormat默认情况下设置为反正3,所以这里不需要。它的“合法”值是:
    • 0:这会输出 XML 转义的 Unicode 以及与文本格式相关的信息(位置、字体名称、点大小等)。仅适用于开发人员。
    • 1: 与 相同0,但会输出文本块。
    • 2:这会输出带有 BMO(字节顺序标记)的 Unicode(UCS2)文本;尝试近似原始文档中文本的布局。
    • 3:(默认)与 相同2,但文本以 UTF-8 编码。
  7. txtwrite带有这个修饰符的设备-dTextFormat是 Ghostscript 的一个相当新的资产,所以如果你发现了错误,请报告错误。

2.使用ps2ascii.ps

gswin32c.exe ^
   -sstdout=c:/path/to/output.txt ^
   -dSIMPLE ^
   -sFONTPATH=c:/windows/fonts ^
   -dNODISPLAY 
   -dDELAYBIND ^
   -dWRITESYSTEMDICT ^
   -f /path/to/ps2ascii.ps ^
    input.pdf

笔记:

  1. 这是和设备完全不同的方法,txtwrite不能混用!
  2. ps2ascii.ps是一个文件,一个 PostScript 程序,Ghostscript 调用它来提取文本。它通常位于 Ghostscript 安装目录的/lib子目录中。去看看它是否真的存在。
  3. -dSIMPLE可以替换dCOMPLEX为以打印额外的信息行(当前颜色、图像的存在、矩形填充)。
  4. -sstdout=...是必需的,因为ps2ascii.psPostScript 程序只打印到标准输出并且不能被告知写入文件。所以-sstdout=...告诉Ghostscript将其标准输出重定向到一个文件。

3.非Ghostscript方法

不要忽略其他可能更容易使用的非 Ghostscript 方法。以下所有内容都是跨平台的,也应该在 Windows 上可用:

  • mudraw -t
    GPL 许可(或商业,如果您需要)。MuPDF的命令行实用程序,用于从 PDF 中提取文本(由执行 Ghostscript 的同一组开发人员开发)。
  • pdftotext
    GPL 许可。Poppler的命令行实用程序(它是XPDF的一个分支,也提供了一个pdftotext.
  • podofotxtextract
    GPL 许可。基于PoDoFo PDF 处理库的命令行实用程序。
  • TET
    PDFlib.com 的文本提取工具包(商业,但可能免费供个人使用——我没有查看最近的新闻)。可能是它们中最强大的文本提取工具......
于 2012-08-01T07:57:32.753 回答