#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的更多相关文章

  1. C# 打印PDF文件之使用不同打印机打印所有页面或部分页面

    C# 打印PDF文件之使用不同打印机打印所有页面或部分页面 最近在逛国外各大编程社区论坛的时候,发现很多人都在问一个关于PDF文件打印的问题:打印时如何选择非默认打印机并设置打印页面的范围.而一般情况 ...

  2. Winform 打印PDF顺序混乱,获取打印队列

    工作中PDF打印顺序混乱着实让我疼痛了好久,其实决绝方法非常简单,但没有想到这个点子的时候确实让我走了很多弯路 这里文章写出来并不是为了炫耀什么,只是觉得发现些好东西就分享出来而已,同时也做个记录,方 ...

  3. 关于这两天研究Java打印pdf方法的记录

    这两天在研究Java调用打印机打印PDF文件的方法,学到了不少东西,特别来记录一下. 关于Java打印网上最多的而且也是Java正统的打印方法就是使用PrintService,一套比較标准的打印代码例 ...

  4. PDFBox创建并打印PDF文件, 以及缩放问题的处理.

    PDFBox带了一些很方便的API, 可以直接创建 读取 编辑 打印PDF文件. 创建PDF文件 public static byte[] createHelloPDF() { ByteArrayOu ...

  5. C#调用Python脚本打印pdf文件

     介绍:通过pdf地址先将文件下载到本地,然后调用打印机打印,最后将下载的文件删除. 环境:windows系统.(windows64位) windows系统中安装python3.6.2环境 资料: O ...

  6. C# 打印PDF文档的10种方法

    操作PDF文档时,打印是常见的需求之一.针对不同的打印需求,可分多种情况来进行,如设置静默打印.指定打印页码范围和打印纸张大小.双面打印.黑白打印等等.经过测试,下面将对常见的几种PDF打印需求做一些 ...

  7. C#使用iTextSharp+ZXing.Net+FreeSpire.PDF生成和打印pdf文档

    项目需求(Winform)可以批量打印某个模板,经过百度和摸索,使用iTextSharp+ZXing.Net+FreeSpire.PDF三个类库实现了生成pdf.生成条形码和打印pdf功能. 首先在项 ...

  8. 安卓打印实现打印pdf文档

    先声明一下,此处的打印非pos打印机打印和蓝牙打印机打印,如果想查找打印小票的pos打印机请进入下面的传送门,蓝牙打印目前没做过,有做过的请指教. pos打印机传送门: 1. https://www. ...

  9. CRM UI 打印PDF

    这是项目上看到的绝技^_^ 1.画SF.这步就不说了 2.确定参数,写SF打印PDF函数 FUNCTION zsrv_print_to_pdf . *"------------------- ...

  10. Chrome 打印PDF技巧

    Chrome 打印PDF技巧 原文地址:https://github.com/zhongxia245/blog/issues/22 欢迎star 本教程,使用Mac电脑进行演示. 常规的Chrome打 ...

随机推荐

  1. [转]微信小程序支付简单小结与梳理

    本文转自:https://www.cnblogs.com/onetwo/p/6667424.html 公司最近在做微信小程序,被分配到做支付这一块,现在对这一块做一个简单的总结和梳理. 支付,对于购物 ...

  2. 以中间件,路由,跨进程事件的姿势使用WebSocket

    通过参考koa中间件,socket.io远程事件调用,以一种新的姿势来使用WebSocket. 浏览器端 浏览器端使用WebSocket很简单 // Create WebSocket connecti ...

  3. win10 uwp 让焦点在点击在页面空白处时回到textbox中

    在网上 有一个大神问我这样的问题:在做UWP的项目,怎么能让焦点在点击在页面空白处时回到textbox中? 虽然我的小伙伴认为他这是一个 xy 问题,但是我还是回答他这个问题. 首先需要知道什么是空白 ...

  4. JavaScript学习笔记系列2:Dom操作(一)

    一.什么是Dom? DOM------>Document Object Model 直接翻译就是文档对象模型. DOM------>定义了表示和修改文档所需的对象.这些对象的行为和属性以及 ...

  5. SpringBean 工作原理详解

    本文来自Github开源项目https://github.com/Snailclimb/JavaGuide,只供自己学习总结无商业用途,如有侵权,联系删除 前言 在 Spring 中,那些组成应用程序 ...

  6. 撩课-Web大前端每天5道面试题-Day19

    1.实现一个函数clone,可以对JavaScript中的5种主要的数据类型(包括Number.String.Object.Array.Boolean)进行值复制 考察点1:对于基本数据类型和引用数据 ...

  7. knockout事件绑定

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  8. <!DOCTYPE html>声明下div高度100%

    问题:在HTML页面中声明<!DOCTYPE html>,页面中div属性设置100%页面显示不正常 body { max-width: 720px; margin: 0 auto; } ...

  9. 纪念Vamai

      知道Vamei这位博主去世的消息有些日子啦,在他的豆瓣主页也留下了只言片语,他写的协议森林让我印象深刻,在博客园也是我关注列表里的一位. 本来没打算写一篇文来说Vamei去世的事情,不过意外之是加 ...

  10. c#如何仅在datatgirdview控件的头部(列名处)添加右键菜单

    近期在弄ArcgisAE实习,其中有一个功能是需要操作图层的属性字段的,为了方便操作图层的属性,最好是在图层的属性表中,也就是在显示图层属性的DataGirdView控件的头部添加一个右键菜单来实现相 ...