how to ocr image (table format) and turn it into a data.frame in r

Viewed 122

enter image description here

I tried something like this, but I couldn't get any further. I want the data to be shaped in their exact columns.

table.jpg<-("C:/Users/omar/Documents/bt-etats-financiers-semestriels-30-06-2020_9.png")


data <- image_read(table.jpg) %>%
image_crop(geometry_area(0, 0, 80, 25)) %>%
image_ocr() %>%
stringi::stri_split(fixed = "\n")
1 Answers

I was able to extract the table from the image with the following code :

library(RDCOMClient)
library(magick)

################################################
#### Step 1 : We convert the image to a PDF ####
################################################

path_PDF <- "C:\\image_Stackoverflow78.pdf"
path_PNG <- "C:\\image_Stackoverflow78.png"
path_Word <- "C:\\image_Stackoverflow78.docx"

pdf(path_PDF, height = 12, width = 8)
im <- image_read(path_PNG)
plot(im)
abline(v = 400, col = "black")
abline(v = 2200, col = "black")
abline(v = 2400, col = "black")
abline(v = 2800, col = "black")
abline(v = 3050, col = "black")
abline(v = 3400, col = "black")
abline(h = 2000, col = "black")
abline(h = 2200, col = "black")
abline(h = 2275, col = "black")
abline(h = 2525, col = "black")
abline(h = 2600, col = "black")
abline(h = 2690, col = "black")
abline(h = 2780, col = "black")
abline(h = 2870, col = "black")
abline(h = 2960, col = "black")
abline(h = 3050, col = "black")
abline(h = 3180, col = "black")
abline(h = 3320, col = "black")
abline(h = 3850, col = "black")
abline(h = 3940, col = "black")
abline(h = 4040, col = "black")
abline(h = 4130, col = "black")
dev.off()

####################################################################
#### Step 2 : We use the OCR of Word to convert the PDF in word ####
####################################################################
wordApp <- COMCreate("Word.Application")
wordApp[["Visible"]] <- TRUE
wordApp[["DisplayAlerts"]] <- FALSE

doc <- wordApp[["Documents"]]$Open(normalizePath(path_PDF),
                                   ConfirmConversions = FALSE)

doc$SaveAs2(path_Word)

##############################################################
#### Step 3 : We extract the table from the word document ####
##############################################################

nb_Row <- doc$tables(1)$Rows()$Count()
nb_Col <- doc$tables(1)$Columns()$Count()
mat_Temp <- matrix(NA, nrow = nb_Row, ncol = nb_Col)
  
for(i in 1 : nb_Row)
{
  for(j in 1 : nb_Col)
  {
      mat_Temp[i, j] <- tryCatch(doc$tables(l)$cell(i, j)$range()$text(), error = function(e) NA)
  }
}

mat_Temp

[,1]   [,2]                                                                                                [,3]          
 [1,] "\r\a" "Banque de Tunisie\rEtats financiers | 30 juin 2020\rEtat de résultat | 30 Juin 2020\rEn K.TND\r\a" "\r\a"        
 [2,] NA     NA                                                                                                  "Notes\r\a"   
 [3,] "\r\a" "PRI - Intérêts et revenus assimilés\r\a"                                                           "6.1\r\a"     
 [4,] "\r\a" "- Commissions (en produits)\r\a"                                                                   "6.2\r\a"     
 [5,] "\r\a" "- Gains sur portefeuille-titres commercial et opérations financières\r\a"                          "6.3\r\a"     
 [6,] "\r\a" "PR4 - Revenus du portefeuille d'investissement\r\a"                                                "6.4\r\a"     
 [7,] NA     "Total produits d'exploitation\r\a"                                                                 "\r\a"        
 [8,] NA     "CHI - Intérêts encourus et charges assimilées CH2 - Commissions encourues ( * )\r\a"               "6.5\r6.6\r\a"
 [9,] NA     "Total charges d'exploitation\r\a"                                                                  "\r\a"        
[10,] NA     "Produit net bancaire\r\a"                                                                          "\r\a"        
[11,] "\r\a" "PR5 CH4 - Dotations aux provisions & corrections e va eur sur creances et passifs\r\a"             "6.7\r\a"     
[12,] "\r\a" "PR6 CH5 - Dotations aux provisions & corrections de valeurs sur ortefeuille d'investissement\r\a"  "6.8\r\a"     
[13,] "\r\a" "PR 7 - Autres produits d'exploitation\r\a"                                                         "6.9\r\a"     
[14,] "\r\a" "CH6 - Frais de personnel\r\a"                                                                      "6.10\r\a"    
[15,] "\r\a" "CH 7 - Charges générales d'exploitation (*)\r\a"                                                   "6.11\r\a"    
[16,] "\r\a" "CH8 - Dotations aux amortissements sur immobilisations\r\a"                                        "6.12\r\a"    
[17,] "\r\a" "\r\a"                                                                                              "esu tat \r\a"
[18,] "\r\a" "PR8/CH9 - Solde en gain / perte provenant des éléments ordinaires\r\a"                             "6.13\r\a"    
[19,] "\r\a" "CHII - Impôt sur les bénéfices\r\a"                                                                "6.14\r\a"    
[20,] NA     "Résultat net des activités ordinaires\r\a"                                                         "\r\a"        
[21,] NA     "PR9/CHIO - Solde Gain / Pertes des éléments extraordinaires\r\a"                                   "\r\a"        
[22,] "\r\a" "Résultat net de la période\r\a"                                                                    "\r\a"        
[23,] "\r\a" "( *) La colonne comparative de juin 2019 a été retraitée pour des fins de c \r\a"                  "mparab \r\a" 
[24,] "\r\a" "\r\a"                                                                                              "\r\a"        
      [,4]                     [,5]                 [,6]                 [,7]   [,8]   [,9]   [,10]  [,11]  [,12] 
 [1,] "\r\a"                   "\r\a"               "\r\a"               NA     NA     NA     NA     NA     NA    
 [2,] "juin-20\r\a"            "juin-19\r\a"        "déc.-19\r\a"        NA     NA     NA     NA     NA     NA    
 [3,] "219 592\r\a"            "227 073\r\a"        "473 871\r\a"        NA     NA     NA     NA     NA     NA    
 [4,] "27 219\r\a"             "29 090\r\a"         "60 661\r\a"         NA     NA     NA     NA     NA     NA    
 [5,] "8 751\r\a"              "19 069\r\a"         "31 822\r\a"         NA     NA     NA     NA     NA     NA    
 [6,] "46 587\r\a"             "31 702\r\a"         "54 491\r\a"         NA     NA     NA     NA     NA     NA    
 [7,] "302 149\r\a"            "306 934\r\a"        "620 845\r\a"        NA     NA     NA     NA     NA     NA    
 [8,] "122 146\r1 299\r\a"     "125 471\r1 372\r\a" "256 272\r3 459\r\a" NA     NA     NA     NA     NA     NA    
 [9,] "123 445\r\a"            "126 843\r\a"        "259 731\r\a"        NA     NA     NA     NA     NA     NA    
[10,] "178 704\r\a"            "180 091\r\a"        "361 114\r\a"        NA     NA     NA     NA     NA     NA    
[11,] "46 390\r\a"             "10 532\r\a"         "36 147\r\a"         NA     NA     NA     NA     NA     NA    
[12,] "5 825\r\a"              "2 661\r\a"          "12 769\r\a"         NA     NA     NA     NA     NA     NA    
[13,] "371\r\a"                "667\r\a"            "1 389\r\a"          NA     NA     NA     NA     NA     NA    
[14,] "37 366\r\a"             "39 312\r\a"         "74 831\r\a"         NA     NA     NA     NA     NA     NA    
[15,] "16 049\r\a"             "16 092\r\a"         "32 327\r\a"         NA     NA     NA     NA     NA     NA    
[16,] "3 889\r\a"              "3 622\r\a"          "7 446\r\a"          NA     NA     NA     NA     NA     NA    
[17,] "exp 01tatlon\r\a"       "\r\a"               "\r\a"               "\r\a" "\r\a" "\r\a" "\r\a" "\r\a" "\r\a"
[18,] "(11 197)\r\a"           "(1 698)\r\a"        "499\r\a"            NA     NA     NA     NA     NA     NA    
[19,] "21 870\r\a"             "31 552\r\a"         "64 192\r\a"         NA     NA     NA     NA     NA     NA    
[20,] "36 489\r\a"             "75 289\r\a"         "135 290\r\a"        NA     NA     NA     NA     NA     NA    
[21,] "\r\a"                   "\r\a"               "\r\a"               NA     NA     NA     NA     NA     NA    
[22,] "36 489\r\a"             "75 289\r\a"         "135 290\r\a"        NA     NA     NA     NA     NA     NA    
[23,] "lité (Voir note 8)\r\a" "\r\a"               "\r\a"               NA     NA     NA     NA     NA     NA    
[24,] "\r\a"                   "\r\a"               "/ 8\r\a"            NA     NA     NA     NA     NA     NA  
Related