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 https://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();
}