2017-03-01 5 views
1

2列形式のPDFがたくさんあります。 Rのpdftoolsパッケージを使用しています。各PDFを個別にトリミングせずに2列形式で各PDFを読む方法はありますか?2列PDFのテキストをRで抽出する

各PDFは選択可能なテキストで構成され、pdf_text関数はテキストを読むのに問題ありません。唯一の問題は、最初の列の最初の行を読み取り、次の列に進むことです。最初の列。

ご協力いただきありがとうございます。

+0

私は、2つのカラムpdfsを読み込む関数を認識していません。私は、各行を読み込み、行ごとに各列を分離し、各列をページごとにrbind()し、各列をページごとにrbind()し、各ページをrbind()して完全なデータセットそれは書かれた順序で読む。 –

+0

それは理にかなっていますが、唯一の問題は、Rが列をまっすぐに読んで両側にある単語の間にスペースだけを置くということです。その空間を通常の空間と区別する方法はありません。 – tsouchlarakis

答えて

3

私は同じ問題を抱えています。私がしたのは、自分のpdfページごとに最も頻繁にスペース値を取得し、それをVectorに保存することでした。その後、私はその値を使ってスライスしました。

library(pdftools) 
src <- "" 
trim <- function (x) gsub("^\\s+|\\s+$", "", x) 

QTD_COLUMNS <- 2 
read_text <- function(text) { 
    result <- '' 
    #Get all index of " " from page. 
    lstops <- gregexpr(pattern =" ",text) 
    #Puts the index of the most frequents ' ' in a vector. 
    stops <- as.integer(names(sort(table(unlist(lstops)),decreasing=TRUE)[1:2])) 
    #Slice based in the specified number of colums (this can be improved) 
    for(i in seq(1, QTD_COLUMNS, by=1)) 
    { 
    temp_result <- sapply(text, function(x){ 
     start <- 1 
     stop <-stops[i] 
     if(i > 1)    
     start <- stops[i-1] + 1 
     if(i == QTD_COLUMNS)#last column, read until end. 
     stop <- nchar(x)+1 
     substr(x, start=start, stop=stop) 
    }, USE.NAMES=FALSE) 
    temp_result <- trim(temp_result) 
    result <- append(result, temp_result) 
    } 
    result 
} 

txt <- pdf_text(src) 
result <- '' 
for (i in 1:length(txt)) { 
    page <- txt[i] 
    t1 <- unlist(strsplit(page, "\n"))  
    maxSize <- max(nchar(t1)) 
    t1 <- paste0(t1,strrep(" ", maxSize-nchar(t1))) 
    result = append(result,read_text(t1)) 
} 
result 
+0

ご意見ありがとうございます。 'stops < - as.integer(names = sort(table(unlist(lstops))、reduce = TRUE)[1:2]))'行にエラーが表示されます。エラーは 'lstops'が見つからないことを報告します。その前に定義されていません。 – tsouchlarakis

+0

申し訳ありませんが、私はそれを投稿した昨日の夜遅かったです。私はそれをテストして修正しました。もう一回やってみよう。 –

+0

これは素晴らしいことです!私はこのようなことをインターネット上で見つけることができませんでした。私はこれが人々の前進に役立つことを願っています。小さな変更では、forループの 'i < - 2'行を取り出す必要があります。それ以外の場合は、2ページ目の 'length(txt)'回だけが出力されます。 – tsouchlarakis

関連する問題