PDFBox get begintext sezione (BT) ET coordinate
-
22-10-2019 - |
Domanda
Per favore qualcuno può aiutare a ottenere le coordinate reali di pixel per PDF begintext sezioni? Sto usando PDFBox per recuperare i testi da file PDF, ma ora ho bisogno di ottenere Rects sorounding che le sezioni di testo / paragrafi.
$contents = $page->getContents();
$contentsStream = $page->getContents()->getStream();
$resources=$page->getResources();
$fonts = $resources->getFonts();
$xobjects = $resources->getImages();
$tokens=$contentsStream->getStreamTokens();
-
[PDFOperator {q}, COSFloat {690,48}, COSINT {0}, COSINT {0}, COSFloat {633,6}, COSINT {0}, COSINT {0}, PDFOperator {cm}, COSName {IM1 }, {PDFOperator Do}, {Q} PDFOperator,
-
PDFOperator {BT}, COSINT {1}, COSINT {0}, COSINT {0}, COSINT {1}, COSFloat {25,92}, COSFloat {588,48}, PDFOperator {Tm}, COSINT {99}, PDFOperator {Tz}, COSName {F30}, COSINT {56}, PDFOperator {Tf}, COSINT {3}, PDFOperator {Tr}, COSFloat {0,334}, PDFOperator {Tc}, COSString {Pospremanj}, PDFOperator {Tj}, COSINT {0}, PDFOperator {Tc}, COSString {e}, PDFOperator {Tj}, COSFloat {9,533}, PDFOperator {Tw}, COSString {i}, PDFOperator {Tj}, COSFloat {6.062}, PDFOperator {Tw}, COSFloat {0,95}, PDFOperator {Tc}, COSString {ciscenj}, PDFOperator {Tj}, COSINT {0}, PDFOperator {Tc}, COSString {e}, PDFOperator {Tj}, COSINT {1}, COSINT {0}, COSINT {0}, COSINT {1}, COSFloat {55,68}, COSFloat {539,76}, PDFOperator {Tm}, COSINT {0}, PDFOperator {Tw}, COSFloat {0,262}, PDFOperator {Tc}, COSString {} UOE, PDFOperator {Tj}, COSINT {0}, {PDFOperator Tc}, COSString {i}, {PDFOperator Tj}, {COSFloat 5.443}, {PDFOperator Tw}, {COSFloat -2,145}, {PDFOperator Tc}, COSString {zimslco}, {PDFOperator Tj}, COSINT {0}, {PDFOperator Tc}, {COSString g}, PDFOperat o {Tj}, {COSFloat 7.202}, {PDFOperator Tw}, {COSFloat -0,148}, {PDFOperator Tc}, {COSString odmor}, {PDFOperator Tj}, COSINT {0}, {PDFOperator Tc}, {a} COSString , PDFOperator {Tj}, {PDFOperator ET},
-
PDFOperator {BT}, COSINT {1}, COSINT {0}, COSINT {0}, COSINT {1}, COSFloat {6,72}, COSFloat {513,12}, PDFOperator {Tm}, COSINT {0} , PDFOperator {} Tw, COSName {F30}, {14} COSINT, PDFOperator {} Tf, COSString {}, {PDFOperator Tj}, {COSFloat 2.751}, {PDFOperator Tw}, ...
mi piacerebbe ottenere l'output qualcosa di simile funzione PrintTextLocations fa per ogni parola / carattere. Posso ottenere in basso a sinistra e coordinare, ma come ottenere la larghezza e la parte superiore coordinata?
PrintTextLocations:
- stringa [25.92,45.119995 fs = 56,0 xscale = 55,440,002 mila altezza = 40,208,004 mila spazio = 15,412,322 mila width = 36,978,485 mila] p stringa [63.22914,45.119995 fs = 56,0 xscale = 55,440,002 mila altezza = 40,208,004 mila spazio = 15,412,322 mila width = 33,87,384 mila] o stringa [97.43364,45.119995 fs = 56,0 xscale = 55,440,002 mila altezza = 40,208,004 mila spazio = 15,412,322 mila width = 30,824,646 mila] s stringa [128.58894,45.119995 fs = 56,0 xscale = 55,440,002 mila altezza = 42,168 spazio = 15,412,322 mila width = 33,87,384 mila] p stringa [162.79344,45.119995 fs = 56,0 xscale = 55,440,002 mila altezza = 42,168 spazio = 15,412,322 mila width = 21,566,162 mila] r stringa [184.69026,45.119995 fs = 56,0 xscale = 55,440,002 mila altezza = 42,168 spazio = 15,412,322 mila width = 30,824,646 mila] e stringa [215.84557,45.119995 fs = 56,0 xscale = 55,440,002 mila altezza = 42,168 spazio = 15,412,322 mila width = 49,286,148 mila] m ...
Soluzione
... come sezione BT fornisce le coordinate in basso a sinistra, è necessario analizzare attraverso tutte le parole / le lettere contenute in blocco BT corrente per ottenere tutte le altre coordinate. Prima altezza parola + BT bottom = top, max (a sinistra coordinare + larghezza) = destra, ultima parola in basso = coordinata in basso.
Spero che questo aiuta qualcuno ...
stringa Esempio per una singola lettera:
string[32.94,35.099976 fs=8.0 xscale=1.0 height=4.4240003 space=2.2240002 width=3.959999]p
Estratte, analizzato e la linea preparato:
32.94,35.099976 fs=8.0 xscale=1.0 height=4.4240003 space=2.2240002 width=3.959999
funzione:
/**
* Parse single word / letter element
*
* @param string $str_raw Extracted word string line.
* @param string $str_elem Element of interest, word, char.
* @param int $pdf_w Pdf page width.
* @param int $pdf_h Pdf page height.
* @param int $pdf_d Pdf page dpi.
* @param int $pdf_r Pdf page relative dpi.
*
* @return array
*/
function createRealCoordinates($str_raw, $str_elem, $pdf_w, $pdf_h, $pdf_d = 400, $pdf_r = 72)
{
$stringstrip = array('fs=', 'xscale=', 'height=', 'space=', 'width=');
$string_info = str_replace($stringstrip, '', $str_raw);
$coord_info = explode(' ', $string_info);
$coord_xy = explode(',', $coord_info[0]);
$coord = array(
'pdfWidth' => $pdf_w,
'pdfHeight' => $pdf_h,
'pdfDpi' => $pdf_d,
'pdfRel' => $pdf_r,
'word' => $str_elem,
'x1' => null,
'y1' => null,
'x2' => null,
'y2' => null,
'fontSize' => null,
'xScale' => null,
'HeightDir' => null,
'WidthDir' => null,
'WidthOfSpace' => null,
);
// Left, Bottom coordinate.
$coord['x1'] = ($coord_xy[0] / $pdf_r) * $pdf_d;
$coord['y2'] = ($coord_xy[1] / $pdf_r) * $pdf_d;
$coord['fontSize'] = $coord_info[1]; // font size.
$coord['xScale'] = $coord_info[2]; // x size scale.
$coord['HeightDir'] = $coord_info[3]; // height.
$coord['WidthDir'] = $coord_info[5]; // word width.
$coord['WidthOfSpace'] = ($coord_info[4] / $pdf_r) * $pdf_d; // width of space.
// Right, Top coordinate.
$coord['x2'] = $coord['x1'] + (($coord['WidthDir'] / $pdf_r) * $pdf_d);
$coord['y1'] = $coord['y2'] - (($coord['HeightDir'] / $pdf_r) * $pdf_d);
return $coord;
}
-matija Kancijan