2013-09-24 63 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执行此操作。它会调用您指定的任何设备 - 在本例中为结构化文本提取设备。这整理来自全国各地的页面的随机定位字形进字/行/段落/列等

因此,简而言之你正在做正确的事情的更多的结构形式。

有提高这个速度没有当前用户servicable方式。有可能我们可能会使用设备提示来避免在将来的版本中读取图像等。我会思考这一点,并与其他开发者讨论。但现在你正在做正确的事情。

HTH。

+0

@@ Robin Watts,您认为mupdf是世界上最好的pdf库吗? – tfzxyinhao

+0

@Robin Watts,有没有关于加速阅读PDF文本的任何事情? – EekTheCat

1

没有,需要的fz_run_page电话。您需要解释文档的页面以提取文本,这就是fz_run_page所做的。

也许你可以创建一个避免跟踪字符位置的简单文本的设备,但我怀疑,这将使性能的真正区别。

+0

是,fz_new_text_device创建deivce,它只能解析器PDF文本。 – tfzxyinhao