Qt导出和导入pdf问题

时间:2022-03-14 17:42:56
求助高手:
现在我需要实现pdf的两步操作:

1.我需要将Qt的图片导出到pdf文件保存;
2.可以打开已保存的pdf到qt窗口,每页再用图片显示出来。
不知道用什么方式可以实现?

如果Qt不行,C++实现也可以。
多谢。

23 个解决方案

#1


Qt没有原生态支持PDF
楼主可以试试imageMagick提供的Magic++的C++接口

#2


或者找找libPDF什么的

#3


这个应该只能看PDF有没有可用的接口让实现你的功能了~

#4


我看网上有人用这个实现过的,可以用Qt保存图片到pdf。
网上有现成的代码,保存文字到pdf,但是没有图片的。
有没有做过的给个建议?

#5


引用 4 楼 yanbin_1985525 的回复:
我看网上有人用这个实现过的,可以用Qt保存图片到pdf。
网上有现成的代码,保存文字到pdf,但是没有图片的。
有没有做过的给个建议?


他还不是用的其他库,你可以看看他用的什么库,借鉴下。
我建议imageMagick

#6


Qt将文字什么的保存成pdf格式是可以的,跟保存成图片一样,不过参数选pdf就可以了,但是Qt不能直接打开pdf文件进行浏览,得需要第三方库

#7


查查pdf提供了什么操作接口

#8


Qt中有demo的

#9


引用 8 楼 qustdjx 的回复:
Qt中有demo的


不是吧,能支持pdf写操作?

#10


知道的能不能给段代码,或者链接,我找了半天没找到啊。
Qt demo是在哪儿啊,告诉一下啊。

#11


http://qt-apps.org/content/show.php/qpdfview?content=152086
QT做的PDF的工程源码。

#12


qt将文字,或者图片或者widget的内容保存为pdf毫无压力,前几天刚研究了,但是没研究过读取pdf……
下面是研究用的一些代码,因为是研究,所以没有逻辑……

QPrinter printer(QPrinter::HighResolution);
//QPrinter printer(QPrinter::ScreenResolution);
printer.setPageSize(QPrinter::A4); 
printer.setOutputFormat(QPrinter::PdfFormat);
printer.setOutputFileName("test.pdf"); 

int physiclaDpiX = printer.physicalDpiX();
int physiclaDpiY = printer.physicalDpiY();
int widthMM = printer.widthMM();
int heighMM = printer.heightMM();

QPixmap p= QPixmap::grabWidget(this, 0, 0, width(), height());

QPainter painter;
painter.begin(&printer);
QRect rect = painter.viewport();
QRect rect2 = painter.window();

//QSize size = p.size();
//size.scale(rect.size(), Qt::KeepAspectRatio);     //此处保证图片显示完整

//painter.setViewport(rect.x(), rect.y(),size.width(), size.height());
//painter.setWindow(p.rect());

// 
// painter.setViewport(rect.x(), rect.y(), rect.width()/2, rect.height()/2);
//painter.setWindow(rect.x(), rect.y(), rect.width()/2, rect.height()/2);
//rect = painter.viewport();
//rect2 = painter.window();

//painter.scale(2,2); //这个会将图像(所有要画的东西)在pdf上放大一倍

painter.scale(((float)rect.width())/p.width(),((float)rect.width())/p.width());

painter.drawPixmap(0,0,p);

QPen pen; //画笔
pen.setColor(QColor(0,0,0));
pen.setWidth(2);
painter.setPen(pen);
painter.drawRect(50, 50 , 2412, 2412); // 2362(像素)/1200(pdf分辨率) = 1.9683333 inch = 5cm


printer.newPage();

painter.drawPixmap(0,0,p);

painter.end();



有一点你要知道的是,pdf默认dpi还是ppi是1200,非常大,所以需要scale,你懂得!

#13


引用 11 楼 abc19abc91 的回复:
http://qt-apps.org/content/show.php/qpdfview?content=152086
QT做的PDF的工程源码。


这个我看了,源码也下了,但是Poppler-Qt4这个库去哪儿找啊?
有现在的库拿来用吗?还是需要下载源码编译?

#14


很好的东西 还得学习呀

#15


qt C++ gui这本书里面就有讲

#16


解决不了啊,是个难题。。

#17


请问qt怎么生成pdf,内容有文本、图片、表格,怎么组织这些内容到一页pdf中啊?

#18


http://m.oschina.net/blog/14279
我最近也在搞这个,我主要是用来显示用,有资料多谢分享!

#19


各位前辈这个问题解决了么,我现在遇到使用Qt打开pdf档的图片的需求,求赐教!

#20


引用 19 楼 top_worker 的回复:
各位前辈这个问题解决了么,我现在遇到使用Qt打开pdf档的图片的需求,求赐教!
实在Linux环境下

#21


问题解决了吗?现在正在研究!好像很不好弄啊!各位大神!!请支持!

#22


上面的程序在linux下图片创建pdf是不行的

#23


//图片生成pdf
void ProcessImage::image_to_pdf(QPixmap pixmap,QString file_path)
{

    QPrinter printer_pixmap(QPrinter::HighResolution);
    printer_pixmap.setPageSize(QPrinter::A4);  //设置纸张大小为A4
    printer_pixmap.setOutputFormat(QPrinter::PdfFormat);  //设置输出格式为pdf
    printer_pixmap.setOutputFileName(file_path);   //设置输出路径


    QPainter painter_pixmap;
    painter_pixmap.begin(&printer_pixmap);
    QRect rect = painter_pixmap.viewport();
    int multiple = rect.width()/pixmap.width();
    painter_pixmap.scale(multiple, multiple); //将图像(所有要画的东西)在pdf上放大multiple-1倍
    painter_pixmap.drawPixmap(0, 0, pixmap);  //画图
    painter_pixmap.end();

}

//文本生成pdf
void ProcessImage::text_to_pdf(QString text,QString file_path)
{
    QPrinter printer_text;
    printer_text.setOutputFormat(QPrinter::PdfFormat);
    printer_text.setOutputFileName(file_path);
    QPainter painter_text;
    painter_text.begin(&printer_text);

    QPoint point(10, 10);
    painter_text.drawText(point, text);
    text.clear();
    //printer_text.newPage();  //生成新的一页,可继续插入
    painter_text.end();
}

#1


Qt没有原生态支持PDF
楼主可以试试imageMagick提供的Magic++的C++接口

#2


或者找找libPDF什么的

#3


这个应该只能看PDF有没有可用的接口让实现你的功能了~

#4


我看网上有人用这个实现过的,可以用Qt保存图片到pdf。
网上有现成的代码,保存文字到pdf,但是没有图片的。
有没有做过的给个建议?

#5


引用 4 楼 yanbin_1985525 的回复:
我看网上有人用这个实现过的,可以用Qt保存图片到pdf。
网上有现成的代码,保存文字到pdf,但是没有图片的。
有没有做过的给个建议?


他还不是用的其他库,你可以看看他用的什么库,借鉴下。
我建议imageMagick

#6


Qt将文字什么的保存成pdf格式是可以的,跟保存成图片一样,不过参数选pdf就可以了,但是Qt不能直接打开pdf文件进行浏览,得需要第三方库

#7


查查pdf提供了什么操作接口

#8


Qt中有demo的

#9


引用 8 楼 qustdjx 的回复:
Qt中有demo的


不是吧,能支持pdf写操作?

#10


知道的能不能给段代码,或者链接,我找了半天没找到啊。
Qt demo是在哪儿啊,告诉一下啊。

#11


http://qt-apps.org/content/show.php/qpdfview?content=152086
QT做的PDF的工程源码。

#12


qt将文字,或者图片或者widget的内容保存为pdf毫无压力,前几天刚研究了,但是没研究过读取pdf……
下面是研究用的一些代码,因为是研究,所以没有逻辑……

QPrinter printer(QPrinter::HighResolution);
//QPrinter printer(QPrinter::ScreenResolution);
printer.setPageSize(QPrinter::A4); 
printer.setOutputFormat(QPrinter::PdfFormat);
printer.setOutputFileName("test.pdf"); 

int physiclaDpiX = printer.physicalDpiX();
int physiclaDpiY = printer.physicalDpiY();
int widthMM = printer.widthMM();
int heighMM = printer.heightMM();

QPixmap p= QPixmap::grabWidget(this, 0, 0, width(), height());

QPainter painter;
painter.begin(&printer);
QRect rect = painter.viewport();
QRect rect2 = painter.window();

//QSize size = p.size();
//size.scale(rect.size(), Qt::KeepAspectRatio);     //此处保证图片显示完整

//painter.setViewport(rect.x(), rect.y(),size.width(), size.height());
//painter.setWindow(p.rect());

// 
// painter.setViewport(rect.x(), rect.y(), rect.width()/2, rect.height()/2);
//painter.setWindow(rect.x(), rect.y(), rect.width()/2, rect.height()/2);
//rect = painter.viewport();
//rect2 = painter.window();

//painter.scale(2,2); //这个会将图像(所有要画的东西)在pdf上放大一倍

painter.scale(((float)rect.width())/p.width(),((float)rect.width())/p.width());

painter.drawPixmap(0,0,p);

QPen pen; //画笔
pen.setColor(QColor(0,0,0));
pen.setWidth(2);
painter.setPen(pen);
painter.drawRect(50, 50 , 2412, 2412); // 2362(像素)/1200(pdf分辨率) = 1.9683333 inch = 5cm


printer.newPage();

painter.drawPixmap(0,0,p);

painter.end();



有一点你要知道的是,pdf默认dpi还是ppi是1200,非常大,所以需要scale,你懂得!

#13


引用 11 楼 abc19abc91 的回复:
http://qt-apps.org/content/show.php/qpdfview?content=152086
QT做的PDF的工程源码。


这个我看了,源码也下了,但是Poppler-Qt4这个库去哪儿找啊?
有现在的库拿来用吗?还是需要下载源码编译?

#14


很好的东西 还得学习呀

#15


qt C++ gui这本书里面就有讲

#16


解决不了啊,是个难题。。

#17


请问qt怎么生成pdf,内容有文本、图片、表格,怎么组织这些内容到一页pdf中啊?

#18


http://m.oschina.net/blog/14279
我最近也在搞这个,我主要是用来显示用,有资料多谢分享!

#19


各位前辈这个问题解决了么,我现在遇到使用Qt打开pdf档的图片的需求,求赐教!

#20


引用 19 楼 top_worker 的回复:
各位前辈这个问题解决了么,我现在遇到使用Qt打开pdf档的图片的需求,求赐教!
实在Linux环境下

#21


问题解决了吗?现在正在研究!好像很不好弄啊!各位大神!!请支持!

#22


上面的程序在linux下图片创建pdf是不行的

#23


//图片生成pdf
void ProcessImage::image_to_pdf(QPixmap pixmap,QString file_path)
{

    QPrinter printer_pixmap(QPrinter::HighResolution);
    printer_pixmap.setPageSize(QPrinter::A4);  //设置纸张大小为A4
    printer_pixmap.setOutputFormat(QPrinter::PdfFormat);  //设置输出格式为pdf
    printer_pixmap.setOutputFileName(file_path);   //设置输出路径


    QPainter painter_pixmap;
    painter_pixmap.begin(&printer_pixmap);
    QRect rect = painter_pixmap.viewport();
    int multiple = rect.width()/pixmap.width();
    painter_pixmap.scale(multiple, multiple); //将图像(所有要画的东西)在pdf上放大multiple-1倍
    painter_pixmap.drawPixmap(0, 0, pixmap);  //画图
    painter_pixmap.end();

}

//文本生成pdf
void ProcessImage::text_to_pdf(QString text,QString file_path)
{
    QPrinter printer_text;
    printer_text.setOutputFormat(QPrinter::PdfFormat);
    printer_text.setOutputFileName(file_path);
    QPainter painter_text;
    painter_text.begin(&printer_text);

    QPoint point(10, 10);
    painter_text.drawText(point, text);
    text.clear();
    //printer_text.newPage();  //生成新的一页,可继续插入
    painter_text.end();
}