打印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打 ...
随机推荐
- async 和 await 的用法示例
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- MFC数据库操作
本例采用Microsoft SQL2008建立的一个数据库表 /****链接数据库操作**/ 在stdafx.h的头文件中加入 #import "C:\Program Files\Commo ...
- Visual Studio 2017 系统发布部署服务器教程
Visual Studio 2017 系统发布部署服务器教程 一.公司网站部署 --- 第一档 _Visual Studio 2017 发布网站系统教程 二.公司网站部署 --- 第二档 ...
- 我在项目中运用 IOC(依赖注入)--实战篇
上一篇<我在项目中运用 IOC(依赖注入)--入门篇>只是简单的使用 IOC.实际项目使用 IOC 的情景复杂多了,比如说,构造函数有多个参数,有多个类继承同一个接口... Unity都有 ...
- Java代理(二)
前面说到了java的静态代理,这次来看看动态代理. 假设有如下接口和实现方法: package proxy; public interface Subject { public void reques ...
- 使用AutoFac组织多项目应用程序
较复杂的应用程序都是由多个项目组织成的,项目可以划分成程序集(Assemblies)和宿主(Hosts),也就是应用程序的入口. Assemblies 通常是常见的类库项目,包括可以重用的功 ...
- python之线程queue
线程queue介绍 Queue的种类: FIFO: Queue.Queue(maxsize=0) FIFO即First in First Out,先进先出.Queue提供了一个基本的FIFO容器,使 ...
- python数据类型之简单数据类型
变量使用注意事项 慎用小写字母l和大写字母O,因为它们可能被人看成数值1和0. 应使用小写的python变量名. 字符串 在python中,用引号括起来的都是字符串,其中的引号可以是单引号和双引号. ...
- MyBatis入门(一)—— 入门案例
一.MyBatis简介 MyBatis是面向sql的持久层框架,他封装了jdbc访问数据库的过程,我们开发,只需专注于sql语句本身的拼装,其它赋值的过程全部可以交给MyBatis去完成. 与Hibe ...
- JS基础(二)
21.标准事件模型的事件类型(包括4个子模块) HTMLEvents:接口为Event,支持的事件类型包括abort.blur.change.error.focus.load.resize.scrol ...