打印pdf
#include "pdf_print_helper.h"
pdf_print_helper::pdf_print_helper()
{
}
pdf_print_helper::~pdf_print_helper()
{
if (ctx != nullptr && init_status)
{
if (pix !=nullptr)
fz_drop_pixmap(ctx, pix);
if (doc != nullptr)
fz_drop_document(ctx, doc);
if (ctx != nullptr)
fz_drop_context(ctx);
}
}
bool pdf_print_helper::init(QString &message)
{
if (init_status)
return true;
else
{
init_status = init_mupdf_lib(message);
return init_status;
}
}
bool pdf_print_helper::init_mupdf_lib(QString &message)
{
//创建上下文
ctx = fz_new_context(NULL, NULL, FZ_STORE_UNLIMITED);
if (!ctx)
{
message = QString::fromLocal8Bit("不能创建PDF上下文!");
return false;
}
//注册文档控制
fz_try(ctx)
fz_register_document_handlers(ctx);
fz_catch(ctx)
{
message = QString::fromLocal8Bit("无法注册文档处理:") + QString::fromLocal8Bit(fz_caught_message(ctx));
fz_drop_context(ctx);
return false;
}
return true;
}
bool pdf_print_helper::print_pdf(printer_print_pdf_info &print_info, QString &message)
{
if (print_info.pdf_path.empty())
return false;
//打开文档
fz_try(ctx)
doc = fz_open_document(ctx, print_info.pdf_path.c_str());
fz_catch(ctx)
{
message = QString::fromLocal8Bit("打开文件pdf文件失败:")+ QString::fromLocal8Bit(fz_caught_message(ctx));
fz_drop_context(ctx);
return false;
}
//取得总的页数
fz_try(ctx)
page_count = fz_count_pages(ctx, doc);
fz_catch(ctx)
{
message = QString::fromLocal8Bit("不能计算pdf页数!") + QString::fromLocal8Bit(fz_caught_message(ctx));
fz_drop_document(ctx, doc);
fz_drop_context(ctx);
return false;
}
if (page_number < 0 || page_number >= page_count)
{
message = QString::fromLocal8Bit("当前页码: ") + QString::number(page_number + 1) + QString::fromLocal8Bit("超范围总数:") + QString::number(page_count);
fz_drop_document(ctx, doc);
fz_drop_context(ctx);
return false;
}
// (QPrinter::PrinterResolution);
if (print_info.printer_name.empty())
{
printer.setPrinterName(QPrinterInfo::defaultPrinterName());
}
else
printer.setPrinterName(QString::fromLocal8Bit(print_info.printer_name.c_str()));
printer.setFullPage(true);
printer.setOrientation(QPrinter::Portrait);
printer.setPaperSize(QPrinter::A4);
printer.setCopyCount(print_info.print_copies);
printer.setResolution(print_info.printer_dpi);
QPainter painter;
painter.begin(&printer);
//根据打印DPI默认300 计算缩放以及旋转
zoom = print_info.printer_dpi / 72.0f;
fz_scale(&ctm, zoom, zoom);
fz_pre_rotate(&ctm, rotate);
for (int i = 0; i < page_count; i++)
{
fz_try(ctx)
pix = fz_new_pixmap_from_page_number(ctx, doc, i, &ctm, fz_device_rgb(ctx), 0);
fz_catch(ctx)
{
message = QString::fromLocal8Bit("绘制pdf出错") + QString::fromLocal8Bit(fz_caught_message(ctx));
fz_drop_document(ctx, doc);
fz_drop_context(ctx);
return false;
}
unsigned char *samples = pix->samples;
int width = fz_pixmap_width(ctx, pix);
int height = fz_pixmap_height(ctx, pix);
QImage image(samples, width, height, pix->stride, QImage::Format_RGB888);
painter.drawImage(QRect(0, 0, width, height), image);
printer.setFullPage(true);
if (i < page_count - 1)
printer.newPage();
}
return painter.end();
}
打印pdf的更多相关文章
- C# 打印PDF文件之使用不同打印机打印所有页面或部分页面
C# 打印PDF文件之使用不同打印机打印所有页面或部分页面 最近在逛国外各大编程社区论坛的时候,发现很多人都在问一个关于PDF文件打印的问题:打印时如何选择非默认打印机并设置打印页面的范围.而一般情况 ...
- Winform 打印PDF顺序混乱,获取打印队列
工作中PDF打印顺序混乱着实让我疼痛了好久,其实决绝方法非常简单,但没有想到这个点子的时候确实让我走了很多弯路 这里文章写出来并不是为了炫耀什么,只是觉得发现些好东西就分享出来而已,同时也做个记录,方 ...
- 关于这两天研究Java打印pdf方法的记录
这两天在研究Java调用打印机打印PDF文件的方法,学到了不少东西,特别来记录一下. 关于Java打印网上最多的而且也是Java正统的打印方法就是使用PrintService,一套比較标准的打印代码例 ...
- PDFBox创建并打印PDF文件, 以及缩放问题的处理.
PDFBox带了一些很方便的API, 可以直接创建 读取 编辑 打印PDF文件. 创建PDF文件 public static byte[] createHelloPDF() { ByteArrayOu ...
- C#调用Python脚本打印pdf文件
介绍:通过pdf地址先将文件下载到本地,然后调用打印机打印,最后将下载的文件删除. 环境:windows系统.(windows64位) windows系统中安装python3.6.2环境 资料: O ...
- C# 打印PDF文档的10种方法
操作PDF文档时,打印是常见的需求之一.针对不同的打印需求,可分多种情况来进行,如设置静默打印.指定打印页码范围和打印纸张大小.双面打印.黑白打印等等.经过测试,下面将对常见的几种PDF打印需求做一些 ...
- C#使用iTextSharp+ZXing.Net+FreeSpire.PDF生成和打印pdf文档
项目需求(Winform)可以批量打印某个模板,经过百度和摸索,使用iTextSharp+ZXing.Net+FreeSpire.PDF三个类库实现了生成pdf.生成条形码和打印pdf功能. 首先在项 ...
- 安卓打印实现打印pdf文档
先声明一下,此处的打印非pos打印机打印和蓝牙打印机打印,如果想查找打印小票的pos打印机请进入下面的传送门,蓝牙打印目前没做过,有做过的请指教. pos打印机传送门: 1. https://www. ...
- CRM UI 打印PDF
这是项目上看到的绝技^_^ 1.画SF.这步就不说了 2.确定参数,写SF打印PDF函数 FUNCTION zsrv_print_to_pdf . *"------------------- ...
- Chrome 打印PDF技巧
Chrome 打印PDF技巧 原文地址:https://github.com/zhongxia245/blog/issues/22 欢迎star 本教程,使用Mac电脑进行演示. 常规的Chrome打 ...
随机推荐
- Codeforces 960G. Bandit Blues
Description 你需要构造一个长度为 \(n\) 的排列 , 使得一个数作为前缀最大值的次数为 \(A\) , 作为后缀最大值的次数为 \(B\) , 求满足要求的排列个数 . 题面 Solu ...
- composer windows安装
一.下载安装包安装 https://getcomposer.org/download/(由于墙的限制,可能下载可执行文件失败,即使成功,由于网络的原因,安装的时候也可能会失败,所以建议用第二种方法) ...
- webpack 项目实践
1,必要的环境 node 环境 下载地址(http://nodejs.cn/) npm 貌似 下载地址(https://www.npmjs.com/)不过,貌似 Node 安装可自带 npm. 2, ...
- Vue.js 的一些小技巧
给 props 属性设置多个类型 这个技巧在开发组件的时候用的较多,为了更大的容错性考虑,同时代码也更加人性化: export default { props: { width: { type: [S ...
- BZOJ3451:Tyvj1953 Normal
根据期望的线性性,答案就是 \(\sum\) 每个连通块出现次数的期望 而每个连通块次数的期望就是 \(\sum\) 连通块的根与每个点连通次数的期望 也就是对于一条路径 \((i,j)\),设 \( ...
- 新电脑装不了win7?来试试我的方法!
好久没写日记了,今天稍有时间来写个有关于硬件的技术贴. 前段时间换了个惠普暗影精灵二代,它的cpu代数如图所示: 用了几天系统自带win10,不同浏览器字体模糊的问题是个问题,故而想装 ...
- 如何发挥ERP系统中的财务监控职能?
ERP系统的管理理念与特点 ERP,是整合了企业管理理念.业务流程.基础数据.人力物力.计算机硬件和软件于一体的企业资源管理系统.ERP系统运用信息技术将企业的资金流.物资流.信息流进行有效的集成,使 ...
- Flutter与Android混合开发及Platform Channel的使用
相对于单独开发Flutter应用,混合开发对于线上项目更具有实际意义,可以把风险控制到最低,也可以进行实战上线.所以介绍 集成已有项目 混合开发涉及原生Native和Flutter进行通信传输,还有插 ...
- redis订阅与发布(把redis作为消息中间件)
订阅频道127.0.0.1:6379> subscribe chat1Reading messages... (press Ctrl-C to quit)1) "subscribe&q ...
- 带你从零学ReactNative开发跨平台App开发-[react native 仿boss直聘](十三)
ReactNative跨平台开发系列教程: 带你从零学ReactNative开发跨平台App开发(一) 带你从零学ReactNative开发跨平台App开发(二) 带你从零学ReactNative开发 ...