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

标签 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

最佳答案

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

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

关于c++ - 使用C++在打印机上打印pdf文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30828323/

相关文章:

c++ - Visual Studio 2010 - 独立函数中的链接器错误

c++ - MFC UpdateAllViews 是阻塞还是非阻塞?

c++ - 在 MFC 中的运行时更改编辑框属性

c++ - 具有 C 链接的函数能够返回类类型?

python - TensorFlow tf.sparse_tensor_dense_matmul

c++ - 无法在C++中的main中定义结构

windows - ffmpeg avformat_open_input 总是返回 "Protocol not found"rv=(-1330794744)

c++ - c嵌套结构上的g++编译错误

c++ - std::async 在 Visual Studio 2013 和 2015 之间的不同行为

c++ - 旧 MFC 项目上的 UTF-8 转换为较新的 MFC