1. PDF 읽기 표시 기능
QT는 pdf, PdfWidgets 모듈을 제공합니다. 모듈을 설치한 후 프로젝트에서 사용하기 위해 프로젝트의 CMakeLists.txt 파일에 다음 코드를 추가해야 합니다.
공식은 완전한 pdf 표시 예를 제공합니다(예 1: 페이지 스크롤을 허용하는 위젯 기반 PDF 뷰어). 예 2: 페이지 스크롤을 허용하는 Qt Quick PDF 뷰어.
https://doc.qt.io/qt-6/qtpdf-examples.html https://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();
}