2016-06-28 5 views
2

テキストに変換するPDFのバッチがあります。それはiTextSharpからこのような何かを持つテキストを取得するのは簡単です:イメージプレースホルダ付きテキストへのC#Pdf

PdfTextExtractor.GetTextFromPage(reader, pageNumber); 

それはthis answer(スレッド内または同様の回答)を使用して画像を取得するのは簡単です。

私は簡単には分かりませんが...テキスト内にイメージプレースホルダを挿入する方法です。私は出力があることを期待PDF、ページ番号とGetTextFromPage考える

line 1 
line 2 
line 3 

私はそれが(どこに1.1手段の1ページ、画像1になりたい場合は... 1ページ、画像2):

line 1 
[1.1] 
line 2 
[1.2] 
line 3 

iTextSharp、PdfSharpまたは類似のもののために、「イメージプレースホルダー」を取得する方法はありますか? GetTextAndPlaceHoldersFromPageメソッド(またはこれに類するもの)が必要です。

PS:Hrm ... iTextSHARPにタグ付けさせてはいません - iTextではありません。 C#はJavaではありません。

+0

あなたはiTextの/ Javaのためのソリューションのような何かを探していますが、[この回答](http://stackoverflow.com/a/28087521/1729265)で提示しましたか?それはiTextSharp/C#に簡単に翻訳されるべきです。 – mkl

+0

@mklはその質問に一層緊密に一致する説明を更新しました。昨夜のようにちょっと拡大することを考えました。その質問は基本的に同じですが、私はiTextSharpを使ってC#で作業しています(ただし、必要に応じてPdfSharpのような他のライブラリに移動するのは嫌ですが)。 – WernerCD

+0

したがって、iText/Javaソリューションをその古い質問からiTextSharp/C#に移植することで、あなたが望むものを作成することができます。それはあまりにも難しいはずはありません... – mkl

答えて

1

C# Pdf to Text with image placeholder
https://stackoverflow.com/a/28087521/
https://stackoverflow.com/a/33697745/

これは(それは私が本当にとにかく何を望むかの簡易版だったので)私の質問で述べた正確なレイアウトを持っていませんが、それは同様の開始部分を持っています(iText Javaから翻訳された)2番目の注記でリストアップされています.3番目の注釈から追加情報が引き出されています(Javaで使用されているリフレクションの一部はC#で動作していないようです。

これで、PDF(すべてのページ、ページ1ではなく)の行を表す文字列のリストを取得できます。イメージはどこにあるべきか(Huzzah!)テキストが追加されました。味のためにByteArrayToFile拡張メソッドが追加されました(私はこのコードのコピー/ペーストの使用法を破るかもしれない他の部分/拡張を含んでいませんでしたが)。

私はまた、私のプロセスの他の部分を大幅に簡素化することができ、私が以前に働いていたゴミの半分を詰め込んだ。 Huzzah !!!おかげ@Mkl

internal class Program 
{ 
    public static void Main(string[] args) 
    { 
     var dir = Settings.TestDirectory; 
     var file = Settings.TestFile; 

     Log.Info($"File to Process: {file.FullName}"); 

     using (var reader = new PdfReader(file.FullName)) 
     { 
      var parser = new PdfReaderContentParser(reader); 
      var listener = new SimpleMixedExtractionStrategy(file, dir); 
      parser.ProcessContent(1, listener); 
      var x = listener.GetResultantText().Split('\n'); 
     } 
    } 
} 

public class SimpleMixedExtractionStrategy : LocationTextExtractionStrategy 
{ 
    public static readonly ILog Log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 
    public DirectoryInfo OutputPath { get; } 
    public FileInfo OutputFile { get; } 

    private static readonly LineSegment UNIT_LINE = new LineSegment(new Vector(0, 0, 1), new Vector(1, 0, 1)); 
    private int _counter; 

    public SimpleMixedExtractionStrategy(FileInfo outputFile, DirectoryInfo outputPath) 
    { 
     OutputPath = outputPath; 
     OutputFile = outputFile; 
    } 

    public override void RenderImage(ImageRenderInfo renderInfo) 
    { 
     try 
     { 
      var image = renderInfo.GetImage(); 
      if (image == null) return; 
      var number = _counter++; 

      var imageFile = new FileInfo($"{OutputFile.FullName}-{number}.{image.GetFileType()}"); 
      imageFile.ByteArrayToFile(image.GetImageAsBytes()); 

      var segment = UNIT_LINE.TransformBy(renderInfo.GetImageCTM()); 
      var location = new TextChunk("[" + imageFile + "]", segment.GetStartPoint(), segment.GetEndPoint(), 0f); 
      var locationalResultField = typeof(LocationTextExtractionStrategy).GetField("locationalResult", BindingFlags.NonPublic | BindingFlags.Instance); 
      var LocationalResults = (List<TextChunk>)locationalResultField.GetValue(this); 
      LocationalResults.Add(location); 
     } 
     catch (Exception ex) 
     { 
      Log.Debug($"{ex.Message}"); 
      Log.Verbose($"{ex.StackTrace}"); 
     } 
    } 
} 

public static class ByteArrayExtensions 
{ 
    public static bool ByteArrayToFile(this FileInfo fileName, byte[] byteArray) 
    { 
     try 
     { 
      // Open file for reading 
      var fileStream = new FileStream(fileName.FullName, FileMode.Create, FileAccess.Write); 

      // Writes a block of bytes to this stream using data from a byte array. 
      fileStream.Write(byteArray, 0, byteArray.Length); 

      // close file stream 
      fileStream.Close(); 

      return true; 
     } 
     catch (Exception exception) 
     { 
      // Error 
      Log.Error($"Exception caught in process: {exception.Message}", exception); 
     } 

     // error occured, return false 
     return false; 
    } 
} 
関連する問題