这里PDF打印不是指在窗口中输入内容然后打印出来,也不是唤醒PDF阅读器的打印预览页面,而至获取到PDF或者打开本地PDF文件,然后打印
开发背景
获取到一段 PDF的二进制流,将二进制流的PDF进行选择打印机打印,这里也可以作为打开本地PDF文件打印
开发思路
Qt 自带的QPrinter,支持QTextDocument文档打印,支持html打印,也支持 QPixmap打印,这里思路是将PDF逐张转成QImage,然后再转成QPixmap打印。
开发探索
尝试了poppler和mupdf两种第三方包,发现都需要本地编译,mupdf官网的描述更加简单,后来找到了poppler已经编译好的包,将相关头文件以及 dll 加入项目。
loadFromData和load分别对应转换本地文件以及二进制流
QString filename = "D://2.pdf";
//Poppler::Document* document = Poppler::Document::load(print_content);
Poppler::Document* document = Poppler::Document::loadFromData(print_content);
document->setRenderHint(Poppler::Document::TextAntialiasing);
int num = document->numPages();
qDebug() << "numPages" << num ;
QPrinter Printer;
Printer.printerName();
Printer.setPageSize(QPrinter::Custom);
if(num <= 0){
return "";
}
for(int j= 0 ; j <num; j++){
Poppler::Page* pdfPage = document->page(j);
QImage image = pdfPage->renderToImage(512, 512, -1, -1, -1, -1);
QPixmap qp = QPixmap::fromImage(image);
QByteArray bytearray;
QBuffer buffer(&bytearray);
buffer.open(QIODevice::WriteOnly);
bool bOk = qp.save(&buffer,"PNG");
// 保存到本地
// image.save(&buffer, "png");
// QByteArray hexed = bytearray.toBase64();
// buffer.close();
// QString strImage(hexed);
// image.save("D:\\2.png");
QPixmap imageresult;
imageresult.loadFromData(bytearray);
QPainter painterPixmap;
painterPixmap.setWindow(image.rect());
painterPixmap.begin(&Printer);
QRect rect = painterPixmap.viewport();
QSize size = image.size();
size.scale(rect.size(), Qt::KeepAspectRatio);
painterPixmap.setWindow(image.rect());
painterPixmap.drawPixmap(0, 0 , imageresult);
painterPixmap.end();
}