Поиск свободного места на странице PDF на Android - PullRequest
1 голос
/ 09 февраля 2012

Мне нужен какой-то алгоритм, который пытался бы найти свободное место на указанной странице PDF.

Я ищу искомый квадрат размером 100x100 пикселей.Я хотел бы начать поиск снизу справа, переместиться дальше влево в ряду, а затем постепенно перемещаться вверх по строкам, пока я не найду подходящее пространство (свободное пространство / пробел) или не вернусь к ошибке, которой нетсвободного места.

Кто-нибудь знает о такой возможности в Android?А если нет, то как я мог бы это реализовать?

Edit

В последнее время я довольно много исследовал это и правильно ли предположить, чтонайти свободное место невозможно, пока документ не отрендерен?Потому что, если я понимаю, правильно, каждый вектор и каждый объект должны быть размещены на своем месте, просто чтобы найти свободные места?То есть места, которые никакие векторы не пересекаются?

1 Ответ

1 голос
/ 13 февраля 2012

Вам определенно нужно отрендерить PDF.Вы можете использовать что-то вроде Попплера, а затем искать белые области.Вот Android-приложение с открытым исходным кодом, использующее poppler, которое вы можете изменить / использовать в качестве вдохновения:

http://code.google.com/p/apdfviewer/

Получив отрендеренный PDF, вы можете использовать что-то вроде Boyer-Более алгоритм поиска строки , чтобы найти место.Т.е. в 1D вы пытаетесь найти строку "......." в "+++ ... ++ ..... + ..........." где.= белый и + = не белый.

В 2D все будет сложнее, самая эффективная вещь, о которой я могу подумать, примерно такая:

  1. Поиск по строке, пока вынайдите достаточно места.
  2. Перейдите к следующей строке и выполните поиск вдоль нее до точки, в которой вы находились в строке выше.
  3. Если вы найдете место до этого, повторите шаг 2, затем продолжите.

Если вы понимаете, что я имею в виду ... что-то вроде этого:

void search(int row, int space_pos, int space_height_so_far)
{
  for (int x = find_next_space(row, 0); x < space_pos; x = find_next_space(row, x+1))
  {
     search(row+1, x, 0);
  }
  if (is_space(row, space_pos))
  {
     if (space_height_so_far > ?)
        cout << "Space found at " << row << ", " << space_pos << endl;
     else
        search(row+1, previous_space_pos, space_height_so_far);
  }
}

Хм, я уже вижу несколько вещей не так с этим кодом ... но, надеюсь, вы получитеидея.Я ожидаю, что этот алгоритм уже существует, но, к сожалению, я не знаю его имени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...