如何在Windows上使用pdfium打印pdf文件

问题描述 投票:0回答:1

我想在 Windows 上打印 pdf 文件,并且我知道 pdfium 可以将 pdf 渲染为位图。我是 Windows 打印新手。

我看到有人用pdfium做了一个pdfviewer,所以我模仿他们并尝试编写这样的代码,但它不起作用,我不知道哪里出了问题。

int LoadDocumentByPath(string file_name) {
    HANDLE     hPrinter {};
    PRINTER_INFO_2A *pPrinterData {};
    BYTE pdBuffer[102400];
    DWORD cbBuf = sizeof(pdBuffer);
    DWORD cbNeeded = 0;
    DOC_INFO_1 DocInfo;
    pPrinterData = (PRINTER_INFO_2A *) &pdBuffer[0];

 
    string printer { getDefaultPrinterName() };
    if (!OpenPrinterA(const_cast<char *>(printer.c_str()), &hPrinter, NULL)) {
        cout << "open failed";
        return 1;
    }
    if (GetPrinterA(hPrinter, 2, &pdBuffer[0], cbBuf, &cbNeeded)) {
        ClosePrinter(hPrinter);
    }

    // get default printer device context
    auto hdc = CreateDCA("WINSPOOL", printer.c_str(), pPrinterData->pPortName, NULL);
    
    DocInfo.pDocName = LPSTR("My Document\0");
    DocInfo.pOutputFile = NULL;
    DocInfo.pDatatype = NULL;
    StartDocPrinterA(hPrinter, 1, (LPBYTE) &DocInfo);
    StartPagePrinter(hPrinter);
    
    FPDF_LIBRARY_CONFIG config {};
    config.version = 2;
    config.m_pUserFontPaths = NULL;
    config.m_pIsolate = NULL;
    config.m_v8EmbedderSlot = 0;
    FPDF_InitLibraryWithConfig(&config);
    // load pdf file
    const FPDF_DOCUMENT doc = FPDF_LoadDocument(file_name.c_str(), nullptr);

    FPDF_FORMFILLINFO form_callbacks = { 0 };
    form_callbacks.version = 2;
    FPDF_FORMHANDLE form = FPDFDOC_InitFormFillEnvironment(doc, &form_callbacks);
    FPDF_PAGE page = FPDF_LoadPage(doc, 0);
    int width = (int) FPDF_GetPageWidth(page);
    int height = (int) FPDF_GetPageHeight(page);

    auto memHdc = CreateCompatibleDC(hdc);
    auto render = CreateCompatibleBitmap(hdc, width, height);
    auto hbmold = SelectObject(memHdc, render);
    RECT r { .left = 0, .top = 0, .right = width, .bottom = height };
    FillRect(memHdc, &r, static_cast<HBRUSH>(::GetStockObject(WHITE_BRUSH)));

    FPDF_RenderPage(memHdc, page, 0, 0, width, height, 0, 0);
    
    SetStretchBltMode(hdc, STRETCH_DELETESCANS);
    StretchBlt(hdc, 0 ,0, width, height, memHdc, 0, 0, width, height, SRCCOPY);
    SelectObject(memHdc, hbmold);

    EndPagePrinter(hPrinter);
    EndDocPrinter(hPrinter);
    ClosePrinter(hPrinter);

    FPDF_CloseDocument(doc);
    FPDF_DestroyLibrary();
    return 0;
}
c++ windows printing pdfium
1个回答
0
投票

看看这个: https://github.com/lailablomme/Laila.PfdiumCore/blob/main/Laila.PdfiumCore.Printer/Printer.vb

这是如何使用 PDFiumSharp 进行打印的一个很好的示例。

© www.soinside.com 2019 - 2024. All rights reserved.