How to use pdfium to print pdf file on Windows

339 Views Asked by At

I want to print pdf file on windows and I Know the pdfium can render pdf to bitmap.I'm new to Windows printing.

I see somebody use pdfium to make a pdfviewer, so I imitate them and try to write code like this , but it doesn't work, I don't know what's wrong.

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;
}
0

There are 0 best solutions below