pdfbox получить начало раздела текста (BT ET) координаты - PullRequest
0 голосов
/ 23 июля 2011

Может кто-нибудь, пожалуйста, помогите мне получить реальные пиксельные координаты для разделов начала PDF-текста? Я использую pdfbox для извлечения текстов из pdf файлов, но теперь мне нужно получить рецензии, изобилующие текстовыми разделами / параграфами.

$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}, PDFOperator {Q},

  • 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 {uoè}, 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}, PDFOp erator {Tj}, COSFloat {7.202}, PDFOperator {Tw}, COSFloat {-0.148}, PDFOperator {Tc}, COSString {odmor}, PDFOperator {Tj}, COSInt {0}, PDFOperator {Tc}, COSString {a} , 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}, COSInt {14}, PDFOperator {Tf}, COSString {}, PDFOperator {Tj}, COSFloat {2.751}, PDFOperator {Tw}, ...

Я хотел бы получить что-то похожее на функцию PrintTextLocations для каждого слова / символа. Я могу получить нижнюю и левую координаты, но как получить ширину и верхнюю координату?

PrintTextРасположение:

  • string [25,92,45.119995 fs = 56,0 xscale = 55.440002 высота = 40.208004 пробел = 15,412322 ширина = 36,978485] p строка [63.22914,45.119995 fs = 56,0 xscale = 55,440002 высота = 40,208004 пробел = 15,412322 ширина = 33,87384] o строка [97,43364,45.119995 fs = 56,0 xscale = 55,440002 высота = 40,208004 пробел = 15,412322 ширина = 30,824646] с строка [128.58894,45.119995 fs = 56,0 xscale = 55,440002 высота = 42,168 пробел = 15,412322 ширина = 33,87384] p строка [162,79344,45.119995 fs = 56,0 xscale = 55,440002 высота = 42,168 пробел = 15,412322 ширина = 21,566162] r строка [184.69026,45.119995 fs = 56,0 xscale = 55,440002 высота = 42,168 пробел = 15,412322 ширина = 30,824646] e строка [215,84557,45.119995 fs = 56,0 xscale = 55,440002 высота = 42,168 пробел = 15,412322 ширина = 49,286148] м ...

1 Ответ

1 голос
/ 26 июля 2011

... поскольку секция BT дает вам нижние левые координаты, вам нужно проанализировать все слова / буквы, содержащиеся в текущем блоке BT, чтобы получить все остальные координаты.Высота первого слова + BT bottom = top, max (левая координата + width) = right, last word bottom = нижняя координата.

Надеюсь, это кому-нибудь поможет ...

Пример строки дляодна буква:

string[32.94,35.099976 fs=8.0 xscale=1.0 height=4.4240003 space=2.2240002 width=3.959999]p

Извлеченная, проанализированная и подготовленная строка:

32.94,35.099976 fs=8.0 xscale=1.0 height=4.4240003 space=2.2240002 width=3.959999

Функция:

/**
 * 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;
}

-матия канцияна

...