2016-12-15 21 views
1

PDFからX、Y座標で各文字の位置を取得する方法があるかどうかを教えてもらえますか? 私はそれがXYではないかもしれないことを感謝します。私はちょうどテキスト文字がページ上のどこにあるのかを特定する方法が必要です。 文字はラスターではないので、それらを認識する必要はありません。 私はこれを使い始めました。Powershell C#PDFキャラクターの場所を取得

$Path = "C:\temp\test.pdf" 

$reader = New-Object iTextSharp.text.pdf.pdfreader -ArgumentList $Path 

for ($page = 1; $page -le $reader.NumberOfPages; $page++) 
{ 
$text = [iTextSharp.text.pdf.parser.PdfTextExtractor]::GetTextFromPage($reader,$page).Split([char]0x000A) 
} 

$reader.Close() 

答えて

1

私はPowerShellにはまったく精通していませんが、C#でこれを行うことができます。 iTextSharp 5.5.10またはiText 7.0.1 for .NETが必要です。 blagae回答に基づいて

void Run() 
{ 
    PdfReader reader = new PdfReader("/path/to/input.pdf"); 

    var s = PdfTextExtractor.GetTextFromPage(reader, 1, new LocationTextExtractionStrategy(new Local())); 
} 

private class Local : LocationTextExtractionStrategy.ITextChunkLocationStrategy 
    { 

    public LocationTextExtractionStrategy.ITextChunkLocation CreateLocation(TextRenderInfo renderInfo, LineSegment baseline) 
    { 
     // you need the info per character, so iterate all characters per TextRenderInfo 
     foreach (TextRenderInfo tr in renderInfo.GetCharacterRenderInfos()) 
     { 
      LineSegment bl = tr.GetBaseline(); 
      // do something with the info 
      Console.WriteLine(tr.GetText() + " @ (" + bl.GetStartPoint()[Vector.I1] + ", " + bl.GetStartPoint()[Vector.I2] + ")"); 
     } 
     return new LocationTextExtractionStrategy.TextChunkLocationDefaultImp(baseline.GetStartPoint(), baseline.GetEndPoint(), renderInfo.GetSingleSpaceWidth()); 
    } 
} 
0

、ここでは基本的に彼のC#のコードを実行するPowerShellスクリプトです。私は、PowerShellで直接LocationTextExtractionStrategyを使用する簡単な方法を見つけられませんでした。 LocationTextExtractionStrategyを公開するための最初のパブリックバージョンであるため、iTextSharp 5.5.10が必要になります。

$Source = @" 
     using System; 
     using iTextSharp.text.pdf; 
     using iTextSharp.text.pdf.parser; 

     public class PdfHelper 
     { 
      public static void Run(string filePath) 
      { 
       PdfReader reader = new PdfReader(filePath); 
       for(var page = 1; page <= reader.NumberOfPages; page++) 
       { 
        PdfTextExtractor.GetTextFromPage(reader, page, new LocationTextExtractionStrategy(new Local())); 
       } 
      } 
     } 

     class Local : LocationTextExtractionStrategy.ITextChunkLocationStrategy 
     { 
      public LocationTextExtractionStrategy.ITextChunkLocation CreateLocation(TextRenderInfo renderInfo, LineSegment baseline) 
      { 
       // you need the info per character, so iterate all characters per TextRenderInfo 
       foreach (TextRenderInfo tr in renderInfo.GetCharacterRenderInfos()) 
       { 
        LineSegment bl = tr.GetBaseline(); 
        // do something with the info 
        Console.WriteLine(tr.GetText() + " @ (" + bl.GetStartPoint()[Vector.I1] + ", " + bl.GetStartPoint()[Vector.I2] + ")"); 
       } 
       return new LocationTextExtractionStrategy.TextChunkLocationDefaultImp(baseline.GetStartPoint(), baseline.GetEndPoint(), renderInfo.GetSingleSpaceWidth()); 
      } 
     } 
"@ 

$DLLPath = "$PSScriptRoot\iTextSharp.dll" 
Add-Type -Path $DLLPath 
Add-Type -ReferencedAssemblies $DLLPath -TypeDefinition $Source -Language CSharp 

$Path = "C:\temp\test.pdf" 
[PdfHelper]::Run($Path) 
+0

ありがとう – James

関連する問題