2016-02-04 11 views
0

libpoppler-qt5.so используется. Я использую следующий код для извлечения текста из документа PDF:C++ qt libpoppler многопоточная проблема

QString pdf2txt(const char *buf, size_t len) 
{ 

    Poppler::Document* document = Poppler::Document::loadFromData(QByteArray(buf, len)); 
    unique_ptr<Poppler::Document> doc_del(document); 
    if (!document || document->isLocked()) throw runtime_error("pdf2txt document is locked or unavailable"); 

    const int pages = document->numPages(); 
    QString dst; 
    for (int i = 0; i < pages; ++i) 
    { 
     Poppler::Page* page = document->page(i); 
     if (!page) throw runtime_error("bad pdf document"); 
     unique_ptr<Poppler::Page> page_del(page); 
     dst += page->text(QRect()); 
    } 

    return dst; 
} 

Но он segfaults, когда он используется для нескольких потоков. Для одного потока это кажется ОК. Безопасен ли этот код? Есть ли другие потокобезопасные библиотеки для извлечения текста из документа PDF? спасибо

ответ

0

Согласно Bug 50992 и примечания к выпуску, poppler уже потокобезопасен.

Однако, я заметил следующую строку:

dst += page->text(QRect()); 

обращается указатель страницы, хотя вы создали unique_ptr page_del от этого указателя до, который не доступ. Не удалось ли очистить unique_ptr до доступа к указателю?