使用c ++在打印机上打印pdf文件

时间:2015-06-14 10:31:57

标签: c++ visual-c++ mfc win32com

在我的c ++应用程序(dll)中,我在不使用打印对话的情况下打印位图,即从后端代码打印位图而不提示用户选择文件。此功能正常。 现在我尝试实现另一种方法,将打印机上已经存在的pdf文件。现有功能是特定于位图,我很困惑,我如何将pdf文件发送到打印机。以下是工作代码

DOCINFO diDocInfo = {0};
diDocInfo.cbSize = sizeof( DOCINFO );
diDocInfo.lpszDocName = L"printTest";

if( StartDoc( memDC.GetSafeHdc(), &diDocInfo ) > 0 )
{
  if( StartPage( memDC.GetSafeHdc() ) > 0 )
    {   
      CBitmap bitmap;
      CImage frontImage;
      frontImage.Load(_T("C:Test.bmp"));
      bitmap.Attach(frontImage.Detach());

      BITMAP bm;
      bitmap.GetBitmap(&bm);
     int w = bm.bmWidth; 
     int h = bm.bmHeight; 

        // create memory device context
        CDC tempDC; 
        tempDC.CreateCompatibleDC(&memDC);
        CBitmap *pBmp = tempDC.SelectObject(&bitmap);
        tempDC.SetMapMode(memDC.GetMapMode());
        memDC.SetStretchBltMode(HALFTONE);
        memDC.StretchBlt(0, 0, 994, 624, &tempDC, 0, 0, 994, 624, 13369376); 

        EndPage(memDC.GetSafeHdc());       
     }
}

我无法找到某种方法将pdf文件而不是位图传递给DC

1 个答案:

答案 0 :(得分:1)

位图是操作系统可立即访问的原始数据。 PDF文件是非常复杂的野兽,如果从头开始编写,必须解析(困难)和渲染(硬)。

您最好的行动方案是使用一些现有的PDF访问库(如MuPDF)为您做繁重的工作。有了这个,您应该生成PDF的光栅化,或者发送到GDI进行打印的矢量绘图命令。幸运的是,PDF(-1 / A)没有做到无法映射到GDI的事情;最困难的部分是处理嵌入字体;如果你不想光栅化它们,你必须将字形数据上传到用于打印的GDI上下文中。