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.ユニコード固有の.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)で次の2つが機能するはずです。それはあなた自身の仕事になるでしょう...

  • ...どのコマンドがユースケースに適しているかをテストし、
  • ...これらを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構文は暗黙的にandパラメータも設定し-dBATCHます-dNOPAUSE
  4. Ghostscriptが古すぎて-o短縮形が機能しない場合は、に置き換えて-dBATCH -dNOPAUSE -sOutputFile=...ください。
  5. Ghostscriptは、Windowsでも、パス引数内のスラッシュを処理できます。
  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ファイルであり、Ghostscriptがテキストを抽出するために呼び出すPostScriptプログラムです。これは通常、Ghostscriptinstalldirの/libサブディレクトリにあります。行って、それが本当にそこにあるかどうかを確認してください。
  3. -dSIMPLEdCOMPLEX追加の情報行(現在の色、画像の存在、長方形の塗りつぶし)を印刷するために、に置き換えることができます。
  4. -sstdout=...ps2ascii.psPostScriptプログラムはstdoutにのみ出力し、ファイルへの書き込みを指示できないため、が必要です。したがって、 Ghostscriptにstdoutをファイルにリダイレクトするように-sstdout=...指示します。

3.非Ghostscriptメソッド

扱いやすい他のGhostscript以外のメソッドを無視しないでください。次のすべてはクロスプラットフォームであり、Windowsでも利用できるはずです。

  • mudraw -t
    GPLライセンス(または必要に応じて商用)。PDFからテキストを抽出するためのMuPDFのコマンドラインユーティリティ(Ghostscriptを実行するのと同じ開発者グループによって開発されています)。
  • pdftotext
    GPLライセンス。Popplerのコマンドラインユーティリティ( XPDFのフォークであり、も提供しますpdftotext)。
  • podofotxtextract
    GPLライセンス。PoDoFoPDF処理ライブラリに基づくコマンドラインユーティリティ。
  • TETPDFlib.com
    TextExtractionToolkit(商用ですが、個人的な使用には無償である可能性があります。最近のニュースは確認していません)。おそらくそれらすべての中で最も強力なテキスト抽出ツール...
于 2012-08-01T07:57:32.753 に答える