我想在 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;
}
看看这个: https://github.com/lailablomme/Laila.PfdiumCore/blob/main/Laila.PdfiumCore.Printer/Printer.vb
这是如何使用 PDFiumSharp 进行打印的一个很好的示例。