c# - Ghostscript转换PDF并在文本文件中输出

标签 c# pdf text-files ghostscript

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

最佳答案

2个问题,2个答案:

  • 要输出到文件,请在命令行上使用-sOutputFile=/path/to/file或添加以下行
     "-sOutputFile=/where/it/should/go",
    
    到您的c#代码(可以是第一个参数,但是应该在您的第一个"-c"之前。但是首先要删除您已经在其中的其他-sOutputFile东西... :-)
  • 不,PostScript不了解Unicode。

  • 更新
    (注:(由于各种技术原因)可靠地从PDF提取文本非常困难。无论您尝试使用哪种工具,它都根本无法工作。)
    在命令行上,以下两个应该适用于最新版本的Ghostscript(当前版本为v9.05)。这将是你自己的工作...
  • ...测试哪个命令更适合您的用例,以及
  • ...将它们翻译成c#代码。

  • 1. txtwrite设备:
    gswin32c.exe ^
       -o c:/path/to/output.txt ^
       -dTextFormat=3 ^
       -sDEVICE=txtwrite ^
        input.pdf
    
    注意:
  • 如果它是64位的,则可能要在系统上使用gswin64c.exe(如果可用)。
  • 输出的-o语法仅适用于最新版本的Ghostscript。
  • -o语法隐式地设置了-dBATCH-dNOPAUSE参数。
  • 如果您的Ghostscript太旧并且-o速记表不起作用,请将其替换为-dBATCH -dNOPAUSE -sOutputFile=...
  • 即使在Windows上,Ghostscript也可以处理路径参数内部的正斜杠。
  • 缺省情况下,-dTextFormat始终设置为3,因此此处不需要。 “合法”值包括:
  • 0:这将输出XML转义的Unicode以及与文本格式(位置,字体名称,磅值等)有关的信息。仅适用于开发人员。
  • 1:与0相同,但将输出文本块。
  • 2:输出带有BMO(字节顺序标记)的Unicode(UCS2)文本;尝试近似原始文档中文本的布局。
  • 3:(默认)2相同,但是文本使用UTF-8编码。

  • 带有txtwrite修饰符的-dTextFormat设备是Ghostscript的较新 Assets ,因此,如果找到它们,请report bugs

  • 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
    
    注意:
  • 这是一种与txtwrite设备完全不同的方法,不能与它混合使用!
  • ps2ascii.ps是一个文件,是Ghostscript调用以提取文本的PostScript程序。它通常位于Ghostscript installdir的/lib子目录中。去看看它是否真的在那里。
  • -dSIMPLE可以用dCOMPLEX代替,以便打印出额外的信息行(当前颜色,图像存在,矩形填充)。
  • -sstdout=...是必需的,因为ps2ascii.ps PostScript程序仅打印到stdout,并且不能被告知写入文件。因此-sstdout=...告诉Ghostscript将其标准输出重定向到文件。

  • 3.非Ghostscript方法
    不要忽略其他更容易使用的非Ghostscript方法。以下所有内容都是跨平台的,并且也应在Windows上可用:
  • mudraw -t已获得GPL许可(或根据需要提供商业许可)。 MuPDF的命令行实用程序,用于从PDF(由执行Ghostscript的同一组开发人员开发)中提取文本。
  • pdftotextGPL许可。 Poppler的命令行实用程序(这是XPDF的fork,它也提供pdftotext)。
  • podofotxtextractGPL许可。基于PoDoFo PDF处理库的命令行实用程序。
  • TET
    来自PDFlib.com的Text Extraction Toolkit(商业用途,但可能是免费提供的,仅供我使用-我没有查看最新消息)。可能是所有工具中最强大的文本提取工具...
  • 关于c# - Ghostscript转换PDF并在文本文件中输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11754556/

    相关文章:

    ruby - 将元数据添加到 PDF

    java - 使用 .txt 文件中的字符串列表重命名已知文件

    Java - 读取文本文件

    c# - 从 GUID 的前四个字节获取 Int32 的最佳方法是什么?

    c# - 在 Windows 10 Store App 中显示触摸键盘

    php - Html2pdf 非常慢,一个 pdf 有很多页面

    pdf - PDF 支持哪些不同的密码保护选项?

    android - 如何更新Android应用程序中的txt文件?

    c# - 如何让 IModel.BasicAcks 启动?

    c# - EF反向POCO生成器: Failed to load provider EntityClient