2016-02-04 4 views
0

libpoppler-qt5.so est utilisé. J'utilise le code suivant pour extraire le texte du document PDF:C++ qt libpoppler multithread issue

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; 
} 

Mais quand il s `segfaults utilisé pour plusieurs threads. Pour un fil, cela semble être OK. Ce thread de code est-il sécurisé? Existe-t-il d'autres bibliothèques à thread sécurisé pour extraire du texte d'un document PDF? merci

Répondre

0

Selon Bug 50992 et les notes de version, poppler est thread-safe maintenant.

Cependant, j'ai remarqué la ligne suivante:

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

accède au pointeur de la page, même si vous avez créé un page_del unique_ptr de ce pointeur avant, non accessible. L'unique_ptr peut-il être nettoyé avant d'accéder au pointeur?