2013-09-24 10 views
1

pdf에서 텍스트를 추출하여 다시 레이아웃하려고합니다. 내 코드는 다음과 같다 :mupdf를 사용하여 pdf에서 텍스트를 추출하는 방법은 무엇입니까?

BOOL CTextEditorDoc::loadTxt() 
{ 
    if(m_strPDFPath.IsEmpty()) 
     return FALSE; 

#ifdef _DEBUG 
    DWORD dwTick = GetTickCount(); 
    CString strLog; 
#endif 

    CString strFile; 
    fz_context *ctx; 
    fz_document* doc; 

    fz_matrix ctm; 
    fz_page *page; 
    fz_device *dev; 
    fz_text_page *text; 
    fz_text_sheet *sheet; 
    int i,line,rotation,pagecount; 

    if(!gb2312toutf8(m_strPDFPath,strFile)) 
     return FALSE; 

    ctx = fz_new_context(NULL, NULL, FZ_STORE_UNLIMITED); 
    fz_try(ctx){ 
     doc = fz_open_document(ctx, strFile.GetBuffer(0)); 
    }fz_catch(ctx){ 
     fz_free_context(ctx); 
     return FALSE; 
    } 

    line = 0; 
    rotation = 0; 
    pagecount = 0; 
    pagecount = fz_count_pages(doc); 

    fz_rotate(&ctm, rotation); 
    fz_pre_scale(&ctm,1.0f,1.0f); 

    sheet = fz_new_text_sheet(ctx); 
    for(i=0;i<pagecount;i++){ 
     page = fz_load_page(doc,i); 
     text = fz_new_text_page(ctx); 
     dev = fz_new_text_device(ctx, sheet, text); 

#ifdef _DEBUG 
     dwTick = GetTickCount(); 
#endif 
     fz_run_page(doc, page, dev, &ctm, NULL); 

#ifdef _DEBUG 
     strLog.Format("run page:%d ms\n",GetTickCount() - dwTick); 
     OutputDebugString(strLog); 
     dwTick = GetTickCount(); 
#endif 

     //m_linesInfoVector.push_back(line); 
     print_text_page(ctx,m_strContent,text,line); 

#ifdef _DEBUG 
     strLog.Format("print text:%d ms\n",GetTickCount() - dwTick); 
     OutputDebugString(strLog); 
     dwTick = GetTickCount(); 
#endif 

     fz_free_device(dev); 
     fz_free_text_page(ctx,text); 
     fz_free_page(doc, page); 
    } 

    fz_free_text_sheet(ctx,sheet); 
    fz_close_document(doc); 
    fz_free_context(ctx); 
    return TRUE; 
} 

이 코드는 PDF 파일의 모든 텍스트를 추출 할 수 있지만 너무 느릴 수 있습니다. 그것을 향상시키는 방법? 대부분의 시간이 기능 fz_run_page에 사용되었습니다. pdf에서 텍스트를 추출하는 것만으로도 fz_run_page을 실행할 필요가 없습니다.

답변

2

코드가 잘 보입니다.

PDF에서 텍스트를 추출하려면 PDF 연산자 스트림을 해석해야합니다. fz_run_page가이를 수행합니다. 그 결과 사용자가 지정한 장치 (이 경우 구조화 된 텍스트 추출 장치)로 호출됩니다. 이렇게하면 페이지 전체에서 무작위로 배치 된 문자 모양을 단어/선/단락/열 등의 더 구조적인 형태로 조합 할 수 있습니다.

그래서 짧게 말해서 올바른 일을 수행하고 있습니다.

속도를 향상시킬 수있는 현재 사용자가 처리 할 수있는 방법은 없습니다. 차후 버전에서 이미지 등을 읽지 않도록 장치 힌트를 사용할 수도 있습니다. 나는 이것에 대해 숙고하고 다른 개발자들과 토론 할 것이다. 그러나 지금 당장 당신은 옳은 일을하고 있습니다.

HTH.

+0

@@ Robin Watts, mupdf가 세계 최고의 PDF 라이브러리라고 생각하십니까? – tfzxyinhao

+0

@Robin Watts, pdf에서 텍스트를 읽는 속도가 빨라졌습니다. – EekTheCat

1

아니요, fz_run_page 호출이 필요합니다. 문서의 페이지를 해석하여 텍스트를 가져와야합니다. fz_run_page가하는 일입니다.

문자 위치를 추적하지 않아도되는 더 간단한 텍스트 장치를 만들 수는 있지만 성능에 실질적인 차이를 만들지는 모릅니다.

+0

예, fz_new_text_device는 pdf의 텍스트 만 구문 분석 할 수 있도록 만듭니다. – tfzxyinhao

관련 문제