Ghostscript的转换PDF输出的文本文件(Ghostscript convert a PDF

2019-07-30 17:20发布

1.I需要将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.Is有一个Unicode speficic .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);     
        }       
    }   
}

Answer 1:

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. 您可能需要使用gswin64c.exe (如果可用),您的系统上,如果它是64位。
  2. -o为输出语法与最新版本的Ghostscript的才有效。
  3. -o语法确实隐含还设置了-dBATCH-dNOPAUSE参数。
  4. 如果你的Ghostscript的太旧和-o速记不工作,将其替换为-dBATCH -dNOPAUSE -sOutputFile=...
  5. Ghostscript的可以处理正斜杠,即使在Windows里面路径参数。
  6. -dTextFormat是默认设置为3无论如何,所以它在这里不需要。 因为它“合法”值是:
    • 0 :此输出XML-逃脱相关的文本(位置,字体名称,字号等)的格式信息一起统一。 仅用于开发。
    • 1 :同0文本,但将输出块。
    • 2 :该输出的Unicode(UCS2)文本与BMO(字节顺序标记); 试图近似文字的布局原始文件内。
    • 3 :(默认)2 ,但文本以UTF-8编码。
  7. txtwrite与此设备-dTextFormat修改的Ghostscript是一个相当新的资产,所以请报告bug ,如果你发现的。

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是一个文件 ,该Ghostscript的调用来提取文本的PostScript程序。 它通常位于Ghostscript的安装目录的/lib的子目录。 去看看它是否真的存在。
  3. -dSIMPLE可以被替换dCOMPLEX以便打印出额外的信息线(当前颜色,图像的存在,矩形填充)。
  4. -sstdout=...因为需要ps2ascii.ps的PostScript程序确实只打印到stdout,不能告诉写入文件。 所以-sstdout=...告诉Ghostscript的其标准输出重定向到一个文件。

3.非Ghostscript的方法

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

  • mudraw -t
    GPL许可(或商业,如果需要)。 从命令行工具MuPDF来提取PDF文本(这是由同一组的开发人员做Ghostscript的开发)。
  • pdftotext
    GPL许可。 从命令行工具poppler的 (这是从一个叉XPDF ,这也提供了一个pdftotext )。
  • podofotxtextract
    GPL许可。 命令行工具基于PoDoFo PDF处理库。
  • TET
    文本提取工具包从PDFlib.com(商业,但可能是免费供个人使用-我没有检查最近的新闻)。 也许他们所有的最强大的文本提取工具...


文章来源: Ghostscript convert a PDF and output in a textfile