QT操作PDF文件
Qt 早期本身不提供原生的 PDF 操作功能。从 Qt 5.15 开始,Qt 提供了 PDF 模块,可以显示和提取 PDF 内容。Qt中有如下几种方式实现 PDF 文件的生成、读取和操作。
1、使用 QPrinter 生成 PDF
2、使用 Qt PDF 模块 (Qt 5.15+)
3、使用第三方库(比如:Poppler)
一、使用 QPrinter 生成 PDF
1、基本 PDF 生成
#include <QPrinter>
#include <QPainter>
#include <QApplication>
void generateSimplePdf() {
QPrinter printer(QPrinter::PrinterResolution);
printer.setOutputFormat(QPrinter::PdfFormat);
printer.setOutputFileName("output.pdf");
QPainter painter;
if (!painter.begin(&printer)) {
qDebug() << "Failed to open printer";
return;
}
// 绘制文本
painter.setFont(QFont("Arial", 12));
painter.drawText(100, 100, "Hello PDF from Qt!");
// 绘制图形
painter.drawRect(50, 50, 100, 150);
painter.drawEllipse(200, 200, 50, 50);
painter.end();
qDebug() << "PDF generated successfully";
}
2、生成多页 PDF
void generateMultiPagePdf() {
QPrinter printer(QPrinter::PrinterResolution);
printer.setOutputFormat(QPrinter::PdfFormat);
printer.setOutputFileName("multipage.pdf");
QPainter painter;
painter.begin(&printer);
// 第一页
painter.drawText(100, 100, "Page 1");
printer.newPage();
// 第二页
painter.drawText(100, 100, "Page 2");
printer.newPage();
// 第三页
painter.drawText(100, 100, "Page 3");
painter.end();
}
3、高级PDF生成(含页眉页脚)
void generatePdfWithHeaderFooter(const QString &filePath) {
QPrinter printer(QPrinter::PrinterResolution);
printer.setOutputFormat(QPrinter::PdfFormat);
printer.setOutputFileName(filePath);
QPainter painter(&printer);
// 设置页面边距
const int margin = 50;
QRect contentRect(margin, margin,
printer.width() - 2*margin,
printer.height() - 2*margin);
// 页眉区域
QRect headerRect(contentRect.left(), contentRect.top()-40,
contentRect.width(), 30);
// 页脚区域
QRect footerRect(contentRect.left(), contentRect.bottom()+10,
contentRect.width(), 30);
// 内容
QString content = "这里是文档的主要内容...\n";
for (int i = 0; i < 50; i++) {
content += QString("这是第 %1 行内容\n").arg(i+1);
}
// 分页绘制
int yPos = contentRect.top();
bool firstPage = true;
foreach (const QString &line, content.split('\n')) {
// 检查是否需要新页
if (yPos + 20 > contentRect.bottom()) {
// 绘制页脚
painter.drawText(footerRect, Qt::AlignCenter,
QString("第 %1 页").arg(printer.pageNum()));
printer.newPage();
yPos = contentRect.top();
firstPage = false;
// 绘制新页的页眉
painter.drawText(headerRect, Qt::AlignCenter, "文档标题");
}
painter.drawText(contentRect.left(), yPos, line);
yPos += 20;
}
// 最后一页的页脚
painter.drawText(footerRect, Qt::AlignCenter,
QString("第 %1 页").arg(printer.pageNum()));
painter.end();
}
二、使用 Qt PDF 模块
从 Qt 5.15 开始,Qt 提供了 PDF 模块,可以显示和提取 PDF 内容。
在 .pro 文件中添加
QT += pdf
1、显示 PDF
#include <QPdfDocument>
#include <QPdfView>
void displayPdf(QWidget *parent, const QString &pdfPath) {
// 创建文档对象
QPdfDocument *pdfDocument = new QPdfDocument(parent);
// 创建视图
QPdfView *pdfView = new QPdfView(parent);
pdfView->setDocument(pdfDocument);
// 加载PDF文件
if (pdfDocument->load(pdfPath) != QPdfDocument::NoError) {
qDebug() << "无法加载PDF文件";
return;
}
pdfView->show();
}
2、提取 PDF 文本
#include <QPdfDocument>
void extractPdfText() {
QPdfDocument doc;
if (doc.load("document.pdf") != QPdfDocument::NoError) {
qDebug() << "Failed to load PDF";
return;
}
for (int i = 0; i < doc.pageCount(); ++i) {
QString text = doc.getAllText(i).text();
qDebug() << "Page" << i+1 << "text:" << text;
}
}