最近尝试使用pdflib输出pdf文档,但是pdflib的方法很多,要将打印输出与pdf匹配,需要编写很多代码,而且一旦需要修改,也是个麻烦事,所以就想了个偷懒的办法,如下:

1、在项目中加入pdflib支持,具体方法就不赘述了,网上有很多。

2、添加几个变量:

 BOOL m_bPrintAsPdf; // 是否输出pdf,初始化为FALSECString m_strPdfFileName;HANDLE m_hPdfDevMode;HANDLE m_hPdfDevNames;

3、在输出pdf文档的响应函数中:

 if(m_hPdfDevMode == NULL || m_hPdfDevNames == NULL){ // 使用windows自带的虚拟打印机作为输出媒介,如果没有可以手动安装,但是名称要一致GetPrinterDevice(_T("Microsoft XPS Document Writer"), &m_hPdfDevNames, &m_hPdfDevMode);}TCHAR BASED_CODE szFilter[] = _T("PDF Files(*.pdf)|*.pdf||");CFileDialog OpenFileDlg(FALSE, _T("pdf"), _T(""), OFN_HIDEREADONLY, szFilter, this);if(OpenFileDlg.DoModal() == IDCANCEL) return;m_strPdfFileName = OpenFileDlg.GetPathName();m_bPrintAsPdf = TRUE;CMyView::OnFilePrint();return;

4、在OnPreparePrinting函数中改成:

 if(m_bPrintAsPdf){PRINTDLG pd;AfxGetApp()->GetPrinterDeviceDefaults(&pd);AfxGetApp()->SelectPrinter(m_hPdfDevNames, m_hPdfDevMode, FALSE);pInfo->m_bDirect = TRUE;pInfo->m_pPD->m_pd.Flags |= PD_PRINTSETUP | PD_RETURNDC;// Perform default MFC handling.BOOL b = DoPreparePrinting(pInfo);// Reinstall MFC's printer.AfxGetApp()->SelectPrinter(pd.hDevNames, pd.hDevMode, FALSE);pInfo->m_bDirect = FALSE;return b;}elsereturn DoPreparePrinting(pInfo);

5、在OnPrint函数中:

 if(m_bPrintAsPdf){CRect rectClient = pInfo->m_rectDraw;CDC memDC;memDC.CreateCompatibleDC(pDC);CBitmap bmp;bmp.CreateCompatibleBitmap(pDC, rectClient.Width(), rectClient.Height());CBitmap* pOldBmp = memDC.SelectObject(&bmp);memDC.FillSolidRect(rectClient, RGB(255,255,255));// PrintOut就是打印输出函数PrintOut(&memDC, pInfo);// 下面将每一页保存成图片CImage TempImageObj;TempImageObj.Attach((HBITMAP)bmp.Detach());CString strPngFile;// AppDirectory是我的应用程序所在路径,获取方法这里不再描述strPngFile.Format("%s\\temp%d.png", AppDirectory, pInfo->m_nCurPage);if(E_FAIL == TempImageObj.Save(strPngFile)){DWORD dwError = GetLastError();LPVOID lpMsgBuf; FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,NULL, GetLastError(), NULL, (LPTSTR) &lpMsgBuf, 0, NULL );MessageBox((LPCTSTR)lpMsgBuf, "ERROR", MB_OK | MB_ICONINFORMATION);LocalFree( lpMsgBuf );}memDC.SelectObject(pOldBmp);ReleaseDC(&memDC);// 所有图片全部生成,要保存到pdf文件了if(pInfo->m_nCurPage == pInfo->GetMaxPage()){m_bPrintAsPdf = FALSE;char szPdfFileName[500], szPngFileName[500];sprintf_s(szPdfFileName, 500, _T("%s"), m_strPdfFile);PDFlib pdf;float fTemp,fMaxData=0,fMinlength;pdf.set_parameter("license", "w700602-009100-731090-Y6WPH2-5SE4A2");if(pdf.open_file(szPdfFileName) == -1)MessageBox("打开文件出错!");pdf.set_info("Creator", "admin");pdf.set_info("Author", "my home");pdf.set_info("Title", "Convert to PDF");pdf.set_info("Subject", "PDF Creator");int i;for(i = 0; i < pInfo->GetMaxPage(); i++){strPngFile.Format("%s\\temp%d.png", AppDirectory, i + 1);sprintf_s(szPngFileName, 500, _T("%s"), strPngFile);int iImage = pdf.load_image("png", szPngFileName, "");if(iImage == -1){MessageBox("Save pdf file failed!");break;}pdf.begin_page_ext(rectClient.Width(), rectClient.Height(), "");pdf.place_image(iImage, 0, 0, 1);pdf.end_page_ext("");// 将临时图片文件删除DeleteFile(szPngFileName);}pdf.close();}return;}elsePrintOut(pDC, pInfo);

试了下,效果还不错。PS: 当然可以使用各种pdf虚拟打印机,不过放在安装包里也不方便,所以我选择了这种方式。

输出pdf文件的一个简单方法相关推荐

  1. PDF文件压缩的简单方法

    我们日常办公中会经常遇到PDF文件,上网查阅资料时,作者为了保证文章格式的稳定性,一般都是上传PDF格式文件,供用户浏览.我们下载之后,需要使用或者发送,但是PDF文件过大,在内存限制情况下会导致PD ...

  2. pdf文件压缩的简单方法,一分钟学会

    pdf文件在办公中的应用十分广泛,我们都知道pdf文件本身比较特殊,如果遇到过大的pdf文件,想要改变文件大小的话,只能对其进行压缩,压缩的方法其实挺简单的,今天来跟小编一起学习pdf文件压缩的简单方 ...

  3. WinCC变量归档的历史数据查询结果输出PDF文件的一个方法

    提示:本文不涉及具体VBS实现代码,因为这些代码在网上可随意找到(不要只做一个伸手党),本文仅提供初学者一个思路来实现历史数据查询结果直接输出PDF. 曾经看过其他软件可以提供用户历史数据查询生成后直 ...

  4. drawboard pdf拆分文件_电脑在线如何分割PDF页面?免费分割3M以内PDF文件页面的简单方法...

    PDF现在真的是一个比较常用的文件格式,兼容性比较好.PDF文件可以保证打印或发送给对方的时候,排版等格式不会变.现在也有很多相关的PDF功能,供我们选择.但是我们不用下载安装也行,电脑直接在线操作也 ...

  5. 怎样将几个pdf文件合成一个?

    如果你是一名办公领域的从业者,那么PDF应该是你经常需要使用到的文件.受一些内容的限制,有时候我们需要把一些内容分别做成几个的PDF来使用,同时也会收到很多pdf文件,但是随着PDF文件的越来越多,使 ...

  6. 如何把三个pdf文件合成一个?

    如何把三个pdf文件合成一个?PDF对于小伙伴们来说是很熟悉的文件格式,平时在网站上下载素材时多数都是pdf格式.pdf格式的文件有非常人性化的功能,兼容性高.传输便捷.安全性好.排版整洁,pdf在我 ...

  7. android选择多个文件_一分钟合并多个Excel、PDF文件,3种方法任你选择,好用到没朋友...

    一分钟合并多个Excel.PDF文件,3种方法任你选择,好用到没朋友 前情提要: Excel.PDF多个文件怎样合并成一个文件?需求场景: PDF文件合并 当一份完成的PDF资料分为很多份的时候,我们 ...

  8. 标签打印软件输出PDF文件过大时如何解决?

    在用标签打印软件制作标签输出PDF文件时,如果数据过多可能会出现输出的PDF文件过大,这种情况如何解决呢?在标签打印软件中,输出PDF文件时可以对PDF文件进行压缩和拆分,压缩方式有六种,分别为:默认 ...

  9. pdf格式怎么转换成jpg格式?pdf转换jpg的简单方法?

    pdf转换jpg的简单方法?有时候我们需要把PDF文件转换为jpg图片格式.可能还有些小伙伴不知道怎么去完成这项转换的,PDF转图片其实很简单,下面给大家分享一个简单的pdf转图片方法: 搜索一下:~ ...

最新文章

  1. TSM备份Windows数据
  2. 海归技术大佬:硅谷科技公司到底牛在哪里?讲透“奈飞文化”8个原则!
  3. 线程池用过吗?ThreadPoolExecutor谈谈你的理解? —— 为什么用线程池?优势?|| 线程池如何使用?
  4. sklearn 相关性分析_用sklearn机器学习预测泰坦尼克号生存概率
  5. python helloword_python学习笔记- python中的类
  6. 驱动程序和应用程序之间的体系结构不匹配_修复Win10上的黑屏问题全攻略,并不高深,一看就会...
  7. 标准C语言库 Glibc 2.15
  8. 蚂蚁之江要退地?官方回应:假的
  9. 【TDA4系列】CCS 最新版本安装与教程地址
  10. 程序员的恶性循环:加班-没空学习-老是写同等水平代码-无法提升代码质量-老是出BUG-老是需要修改-加班-......
  11. java删除文件夹或文件
  12. pyqt5转pyqt6需要注意的事项
  13. html页面字体缩小模糊怎么解决,ps字体模糊怎么变清晰 设置一下字体大小,是否一样...
  14. Ardunio——ULN2003驱动板和直流电机风扇——控制风扇转速
  15. iOS app加密探究爱加密iOS app加密原理
  16. 推荐四款常见的电子教室软件,大家觉得哪款好用
  17. 游戏动画中有哪些动画原理?
  18. 计算机x线影像ppt,计算机X线摄影课件
  19. hathitrust 下载工具 (大量英文原版名著扫描免费下载)
  20. 建立时间setup time/保持时间 hold time

热门文章

  1. 在金融业务中跨行清算系统的实现过程
  2. linux c 禁止对外通信,Linux c 屏蔽信号、切换信号
  3. 工程师如何实现财务自由:为什么绝大多数人追求财务自由而不得,为什么有些人很有钱仍然拼命工作...
  4. 意大利赢了,老婆笑了,黄健翔疯了……
  5. pageoffice在Edge浏览器、谷歌浏览器42及以上版本和火狐浏览器52及以上版本兼容处理
  6. Git、GitHub、Gitee、GitLab的学习
  7. 存储器Flash页、扇区、块的区别
  8. java编程的一个猜数字有趣小游戏
  9. 中微SC8F5771模拟IIC通信——指令运行速度的探索(附编译软件与烧录软件)
  10. ESP32-CAM拍照输出RGB565数据,wifi传输到stm32控制tft屏显示拍照图像