QT case combat 1: escriba un software de herramienta OCR desde cero (8) Pantalla de lectura de PDF / captura de pantalla / reconocimiento de texto

1. Función de visualización de lectura de PDF

        QT proporciona módulos pdf, PdfWidgets, debe instalar los módulos y luego agregar el siguiente código en el archivo CMakeLists.txt del proyecto para usarlo en el proyecto.

        El funcionario proporciona un ejemplo completo de visualización de PDF, ejemplo 1: un visor de PDF basado en widgets que permite desplazarse por las páginas. Ejemplo 2: un visor Qt Quick PDF que permite desplazarse por las páginas.

https://doc.qt.io/qt-6/qtpdf-examples.html icono-predeterminado.png?t=M85Bhttps://doc.qt.io/qt-6/qtpdf-examples.html         Archivo CMakeLists.txt.

find_package(Qt6 REQUIRED COMPONENTS Pdf)
find_package(Qt6 REQUIRED COMPONENTS PdfWidgets)

target_link_libraries(QtFFmpegApp2 PRIVATE Qt6::Pdf)
target_link_libraries(QtFFmpegApp2 PRIVATE Qt6::PdfWidgets)

2. Diseño preliminar de funciones 

1. Resumen de funciones

        El pdf se muestra a la izquierda y el área de visualización del resultado del reconocimiento ocr está a la derecha.

2, control de vista de pdf

        El control debe promocionarse a QPdfView, que no se puede ver en el menú de la izquierda del diseño.

    m_document = new QPdfDocument(this);

    //目录,我这里不需要目录,所以没有展示
    //QPdfBookmarkModel *bookmarkModel = new QPdfBookmarkModel(this);
    //bookmarkModel->setDocument(m_document);
    //ui->bookmarkView->setModel(bookmarkModel);

    ui->pdfView->setZoomMode(QPdfView::FitToWidth);
    //ui->pdfView->setZoomFactor(0.8);
    ui->pdfView->setDocument(m_document);

3. Leer pdf

        Haga clic en el botón para seleccionar el botón pdf, seleccione el pdf y llame al método abierto para abrirlo.

void PdfViewWindow::on_pushButton_clicked()
{
    QUrl toOpen = QFileDialog::getOpenFileUrl(this, tr("Choose a PDF"), QUrl(), "Portable Documents (*.pdf)");
       if (toOpen.isValid())
           open(toOpen);
}

4. Mostrar pdf

        Aquí, siempre que la ruta del archivo pdf local se pase a QPdfDocument, se puede abrir el archivo pdf.

void PdfViewWindow::open(const QUrl &docLocation)
{
    if (docLocation.isLocalFile()) {
        m_document->load(docLocation.toLocalFile());
        const auto documentTitle = m_document->metaData(QPdfDocument::Title).toString();
        setWindowTitle(!documentTitle.isEmpty() ? documentTitle : QStringLiteral("PDF Viewer"));
        ui->label->setText("共" + QString::number(ui->pdfView->pageNavigation()->pageCount()) + "页");
        ui->lineEdit->setText(QString::number(1));
    } else {
        QMessageBox::critical(this, tr("Failed to open"), tr("%1 is not a valid local file").arg(docLocation.toString()));
    }
}

5. Captura de pantalla/reconocimiento de texto

        QPdfDocument nos proporciona un método de renderizado que nos permite obtener capturas de pantalla. Después de obtener la imagen, inicie un nuevo hilo y realice la identificación OCR. El hilo aquí es el mismo que el OCR de la imagen anterior, y el método de procesamiento es exactamente el mismo.

/**
 * @brief PdfViewWindow::on_pushButton_3_clicked
 * 文字提取
 */
void PdfViewWindow::on_pushButton_3_clicked()
{
    QString filePath = QString("%1\\screen.jpg").arg(qApp->applicationDirPath().replace("/", "\\"));

    //渲染到图片
    //size = m_document->pageSize(1);//QSize(600, 800)
    int page = ui->pdfView->pageNavigation()->currentPage();
    QSize origin = m_document->pageSize(page).toSize();
    QSize *newsize = new QSize(origin.width()*2, origin.height()*2);
    QImage image = m_document->render(page, *newsize);
    image.save(filePath, "jpg");

    //清空右侧文本框
    ui->textEdit->setText("");

    //实例化loading窗口
    loading = new LoadingDialog(this);
    loading->setVisible(true);

    //启动线程
    m_thread  =  new MyThreadForTextRecognition;
    m_thread->init(filePath.toStdString(), QString("%1\\screen_action.jpg").arg(qApp->applicationDirPath().replace("/", "\\")).toStdString(), ui->comboBox->currentIndex(), ui->checkBox_3->isChecked(), ui->comboBox_2->currentIndex());
    connect(m_thread, &MyThreadForTextRecognition::getRecognitionText,this,&PdfViewWindow::getRecognitionText);
    connect(m_thread, &MyThreadForTextRecognition::recognitionFinish,this,&PdfViewWindow::recognitionFinish);
    m_thread->start();
}

Supongo que te gusta

Origin blog.csdn.net/bashendixie5/article/details/127182427
Recomendado
Clasificación