QT 케이스 전투 1 - 처음부터 OCR 도구 소프트웨어 작성 (8) PDF 읽기 디스플레이/스크린샷/텍스트 인식

1. PDF 읽기 표시 기능

        QT는 pdf, PdfWidgets 모듈을 제공합니다. 모듈을 설치한 후 프로젝트에서 사용하기 위해 프로젝트의 CMakeLists.txt 파일에 다음 코드를 추가해야 합니다.

        공식은 완전한 pdf 표시 예를 제공합니다(예 1: 페이지 스크롤을 허용하는 위젯 기반 PDF 뷰어). 예 2: 페이지 스크롤을 허용하는 Qt Quick PDF 뷰어.

https://doc.qt.io/qt-6/qtpdf-examples.html icon-default.png?t=M85Bhttps://doc.qt.io/qt-6/qtpdf-examples.html         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. 기능의 예비설계 

1. 기능 개요

        왼쪽은 pdf, 오른쪽은 ocr 인식 결과 표시 영역입니다.

2, pdfview 컨트롤

        컨트롤은 디자인의 왼쪽 메뉴에서 볼 수 없는 QPdfView로 승격되어야 합니다.

    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. PDF 읽기

        버튼을 클릭하여 pdf 버튼을 선택하고 pdf를 선택하고 열기 메소드를 호출하여 엽니다.

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

4. PDF 표시

        여기서 로컬 pdf 파일의 경로가 QPdfDocument에 전달되기만 하면 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. 스크린샷/텍스트 인식

        QPdfDocument는 스크린샷을 얻을 수 있는 렌더링 방법을 제공합니다. 그림을 얻은 후 새 스레드를 시작하고 ocr 식별을 수행합니다.여기의 스레드는 이전 그림의 ocr과 동일하고 처리 방법은 완전히 동일합니다.

/**
 * @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();
}

рекомендация

отblog.csdn.net/bashendixie5/article/details/127182427