2011-02-15 2 views
2

일부 사용자가 제공 한 pdf 문서에 문제가 있습니다. 그것들은 3d 패키지로 만들어지며 기본적으로 60 초가 넘는 렌더링 시간을 갖는 벡터 라인의 거대한 목록입니다.pdf 문서에서 문서 벡터 수를 얻으시겠습니까?

iTextSharp (5.0.5)을 사용하여 PDF 문서에있는 벡터 줄 수에 대한 보고서를 생성하려면 어떻게해야합니까?

텍스트 및 이미지 데이터를 얻을 수는 있지만 벡터에서 핸들을 가져올 위치를 볼 수 없습니다. 그들은 이미지로 표현되는 것 같지 않습니다.

답변

1

iText를 [샤프]의 파서 패키지에서이 문제를 이해하는 데 유용 할 수있는 블로그 글이 있습니다. 그것은 목표이지만, 아직 구현하기에 충분히 중요하지는 않습니다. 다른 것들은 현재 주목을 받고 있습니다.

모험을 느끼는 경우 PdfContentStreamProcessor를 확인해야합니다. 개인 기능 populateOperators에는 현재 처리되는 명령의 긴 목록이 있습니다 (한 가지 방법 또는 다른 방법으로).

모든 라인 아트 명령 (moveTo, lineTo, rect, stroke, fill, clip)에 대해 유사한 명령 클래스를 작성하고 어떤 방식 으로든 노출해야합니다.

실제로 경로 수를 COUNT로 지정하면 스트로크를 구현하고 일부 정적 정수 [s]를 늘린 다음 구문 분석 후 확인하면됩니다.

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. 

그런 것 같습니다. null RenderListener만이 텍스트 또는 이미지를 실행하면 null 포인터 예외가 발생합니다. 당신은 아무도 듣지 않는 청취자를 너 자신으로 만들거나 기존의 청취자 중 한 명을 사용하고 그 출력을 무시할 수있다.

추신 : iTextSharp 5.0.6은 아직 출시되지 않은 경우 언제든지 발표해야합니다.

+0

안녕하세요, 저는 같은 줄을 따라 빠른 길을 찾아 냈습니다. while (tokenizer.NextToken()) loop tokentype "OTHER"를 찾고 tokenizer 문자열 값을 목록 또는 벡터 연산 값과 비교할 수 있습니다 (위의 내용을 포함하지만 "l", "c", "v" "y", "h", "re". 내 목표는 주로 렌더링하는 데 시간이 걸릴 문서를 식별하는 것이므로 상당히 잘 작동하는 것 같습니다. iText in Action, Second Edition은 좋은 도움이되었습니다. –

+0

구현했습니다. 이미지 카운트와 치수를 얻기위한 IRenderListener. –

관련 문제