Получить количество векторов в документе PDF? - PullRequest
2 голосов
/ 15 февраля 2011

У меня проблема с некоторыми предоставленными пользователем документами в формате PDF.Они созданы из 3d-пакетов и представляют собой ОГРОМНЫЙ список векторных линий, которые обрабатываются и стареют (более 60 секунд).

Как создать отчет о количестве векторных линий в документе PDFиспользуя iTextSharp (5.0.5) ?

Я могу получить текстовые и графические данные, но не вижу, где можно получить указатель на вектор.Похоже, они не представлены в виде изображения.

Ответы [ 2 ]

1 голос
/ 15 февраля 2011

Пакет синтаксического анализа iText [Sharp] еще не обрабатывает команды lineTo или curveTo.Это цель, но не настолько важная, чтобы ее реализовать.Другие вещи привлекают внимание в данный момент.

Если вы чувствуете себя предприимчивым, вы должны проверить PdfContentStreamProcessor.В закрытой функции populateOperators есть длинный список команд, которые в настоящее время обрабатываются (тем или иным способом).

Вам необходимо написать одинаковые классы команд для всех команд штриховой графики (moveTo,lineTo, rect, обводить, заполнить, обрезать) и представить их каким-либо образом.

На самом деле, если все, что вы хотите сделать, это СЧИТЫВАТЬ количество путей, вы можете просто реализовать обводку и заполнение, чтобы увеличить статические значения.целое число [s], затем проверьте их после разбора.Должно быть довольно просто (я пишу на Java, но это достаточно легко перевести):

private static class CountOps implements ContentOperator {
  public static int operationCount = 0;
  public void invoke(PdfContentStreamProcessor processor, PdfLiteral operator, ArrayList<PdfObject> operands) {
    ++operationCount;
  }
}

Ах!registerContentOperator является публичной функцией.Вам вообще не нужно менять источник iText:

PdfContentStreamProcessor proc = new PdfContentStreamProcessor(null);
CountOps counter = new CountOps();
proc.registerContentOperator("S", countOps); // stroke the path
proc.registerContentOperator("s", countOps); // close & stroke
proc.registerContentOperator("F", countOps); // fill, backward compat
proc.registerContentOperator("f", countOps); // fill
proc.registerContentOperator("f*", countOps); // fill with event-odd winding rule
proc.registerContentOperator("B", countOps); // fill & stroke
proc.registerContentOperator("B*", countOps); // fill & stroke with even-odd
proc.registerContentOperator("b", countOps); // close, fill, & stroke
proc.registerContentOperator("b*", countOps); // close, fill, & stroke with even-odd

proc.processContent( contentBytes, pageResourceDict );

int totalStrokesAndFills = CountOps.operationCount; // note that stroke&fill operators will be counted once, not twice.

Что-то в этом роде.Только нулевой RenderListener вызовет исключение нулевого указателя, если вы столкнетесь с любым текстом или изображениями.Вы можете сами запустить прослушиватель, который не работает, или использовать один из существующих и игнорировать его вывод.

PS: iTextSharp 5.0.6 должен быть выпущен в любой день, если он еще не вышел.

0 голосов
/ 15 февраля 2011

Нет конкретного векторного изображения.Обычно он просто добавляется в поток контента, который по сути является векторным потоком данных для рисования всей страницы.

Есть статья в блоге, которая может оказаться полезной для понимания на http://www.jpedal.org/PDFblog/2010/11/grow-your-own-pdf-file-%E2%80%93-part-5-path-objects/

...