使用 Qt WebEngineView 在特定页面打开 PDF
Open PDF at specific page with Qt WebEngineView
我想在我的 Qt 应用程序中创建一个简单的 PDF 查看器。一切正常,接受在 URL 上的特定页面打开 PDF。
例如:
url = "file:///D://Repo//PdfViewer//PdfViewer//test.pdf";
有效,但是
url = "file:///D://Repo//PdfViewer//PdfViewer//test.pdf#page=9";
剂量。
我在某处读到,chrome 不再正式支持#page=x,但我找不到更多信息来解决这个问题。
我在 Qt 的 Nano-Browser Example url 中遇到了同样的问题。
PdfViewer::PdfViewer(const QString &pdf_path, QWidget *parent)
: QWidget(parent), m_View(new QWebEngineView(this)), m_ExitButton(new QPushButton())
{
QUrl url = QUrl::fromLocalFile(pdf_path);
m_View->settings()->setAttribute(QWebEngineSettings::PluginsEnabled, true);
m_View->settings()->setAttribute(QWebEngineSettings::FullScreenSupportEnabled, true);
m_View->settings()->setAttribute(QWebEngineSettings::PdfViewerEnabled, true);
m_View->load(url);
m_ExitButton->setIcon(QIcon("Ok.png"));
QVBoxLayout *layout = new QVBoxLayout();
layout->addWidget(m_View);
layout->addWidget(m_ExitButton);
this->setLayout(layout);
connect(m_ExitButton, &QPushButton::clicked, this, &PdfViewer::close);
}
我正在使用 Qt 5.13。
Qt WebEngine使用chromium pdf查看器所以分析the source code我找到了实现页面移动的功能:window.viewer.viewport_.goToPage(page)
可以使用QWebEnginePage的runJavaScript()
方法执行。
综合以上,解决方案是:
#include <QtWebEngineWidgets>
class PdfViewer: public QWidget{
Q_OBJECT
public:
PdfViewer(const QString &pdf_path, QWidget *parent=nullptr)
: QWidget(parent), m_View(new QWebEngineView(this)), m_ExitButton(new QPushButton())
{
QUrl url = QUrl::fromLocalFile(pdf_path);
m_View->settings()->setAttribute(QWebEngineSettings::PluginsEnabled, true);
m_View->settings()->setAttribute(QWebEngineSettings::FullScreenSupportEnabled, true);
m_View->settings()->setAttribute(QWebEngineSettings::PdfViewerEnabled, true);
m_View->load(url);
m_ExitButton->setIcon(QIcon("Ok.png"));
QVBoxLayout *layout = new QVBoxLayout();
layout->addWidget(m_View);
layout->addWidget(m_ExitButton);
this->setLayout(layout);
connect(m_ExitButton, &QPushButton::clicked, this, &PdfViewer::close);
connect(m_View, &QWebEngineView::loadFinished, this, &PdfViewer::on_finished);
}
private Q_SLOTS:
void on_finished(bool ok){
if(ok){
QTimer::singleShot(100, this, [this](){ goToPage(9); });
}
}
private:
void goToPage(int page){
m_View->page()->runJavaScript(QString("window.viewer.viewport_.goToPage(%1)").arg(page));
}
QWebEngineView *m_View;
QPushButton *m_ExitButton;
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QString fileName = QFileDialog::getOpenFileName(nullptr,
QObject::tr("Open Image"),
QDir::homePath(),
QObject::tr("PDF Files (*.pdf)"));
if(fileName.isEmpty())
return 0;
PdfViewer w(fileName);
w.resize(640, 480);
w.show();
return a.exec();
}
#include "main.moc"
这是 QtWebEngine 中缺少的功能,但现在最新的 Qt 5.15 版本(或 Qt 6.2)支持它。 https://bugreports.qt.io/browse/QTBUG-86152
我想在我的 Qt 应用程序中创建一个简单的 PDF 查看器。一切正常,接受在 URL 上的特定页面打开 PDF。 例如:
url = "file:///D://Repo//PdfViewer//PdfViewer//test.pdf";
有效,但是
url = "file:///D://Repo//PdfViewer//PdfViewer//test.pdf#page=9";
剂量。 我在某处读到,chrome 不再正式支持#page=x,但我找不到更多信息来解决这个问题。 我在 Qt 的 Nano-Browser Example url 中遇到了同样的问题。
PdfViewer::PdfViewer(const QString &pdf_path, QWidget *parent)
: QWidget(parent), m_View(new QWebEngineView(this)), m_ExitButton(new QPushButton())
{
QUrl url = QUrl::fromLocalFile(pdf_path);
m_View->settings()->setAttribute(QWebEngineSettings::PluginsEnabled, true);
m_View->settings()->setAttribute(QWebEngineSettings::FullScreenSupportEnabled, true);
m_View->settings()->setAttribute(QWebEngineSettings::PdfViewerEnabled, true);
m_View->load(url);
m_ExitButton->setIcon(QIcon("Ok.png"));
QVBoxLayout *layout = new QVBoxLayout();
layout->addWidget(m_View);
layout->addWidget(m_ExitButton);
this->setLayout(layout);
connect(m_ExitButton, &QPushButton::clicked, this, &PdfViewer::close);
}
我正在使用 Qt 5.13。
Qt WebEngine使用chromium pdf查看器所以分析the source code我找到了实现页面移动的功能:window.viewer.viewport_.goToPage(page)
可以使用QWebEnginePage的runJavaScript()
方法执行。
综合以上,解决方案是:
#include <QtWebEngineWidgets>
class PdfViewer: public QWidget{
Q_OBJECT
public:
PdfViewer(const QString &pdf_path, QWidget *parent=nullptr)
: QWidget(parent), m_View(new QWebEngineView(this)), m_ExitButton(new QPushButton())
{
QUrl url = QUrl::fromLocalFile(pdf_path);
m_View->settings()->setAttribute(QWebEngineSettings::PluginsEnabled, true);
m_View->settings()->setAttribute(QWebEngineSettings::FullScreenSupportEnabled, true);
m_View->settings()->setAttribute(QWebEngineSettings::PdfViewerEnabled, true);
m_View->load(url);
m_ExitButton->setIcon(QIcon("Ok.png"));
QVBoxLayout *layout = new QVBoxLayout();
layout->addWidget(m_View);
layout->addWidget(m_ExitButton);
this->setLayout(layout);
connect(m_ExitButton, &QPushButton::clicked, this, &PdfViewer::close);
connect(m_View, &QWebEngineView::loadFinished, this, &PdfViewer::on_finished);
}
private Q_SLOTS:
void on_finished(bool ok){
if(ok){
QTimer::singleShot(100, this, [this](){ goToPage(9); });
}
}
private:
void goToPage(int page){
m_View->page()->runJavaScript(QString("window.viewer.viewport_.goToPage(%1)").arg(page));
}
QWebEngineView *m_View;
QPushButton *m_ExitButton;
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QString fileName = QFileDialog::getOpenFileName(nullptr,
QObject::tr("Open Image"),
QDir::homePath(),
QObject::tr("PDF Files (*.pdf)"));
if(fileName.isEmpty())
return 0;
PdfViewer w(fileName);
w.resize(640, 480);
w.show();
return a.exec();
}
#include "main.moc"
这是 QtWebEngine 中缺少的功能,但现在最新的 Qt 5.15 版本(或 Qt 6.2)支持它。 https://bugreports.qt.io/browse/QTBUG-86152