cpp
C++ PDF转图片
#include "include/fpdfview.h"
#include <fstream>
#include <include/core/SkImage.h>
sk_sp<SkImage> pdfToImg(sk_sp<SkData> pdfData)
{
sk_sp<SkImage> img;
FPDF_InitLibrary(nullptr);
FPDF_DOCUMENT doc;
FPDF_PAGE page;
doc = FPDF_LoadMemDocument(pdfData->bytes(), pdfData->size(), NULL);
if (doc == NULL) {
printf("failed to open test document\n");
return img;
}
int numPages = FPDF_GetPageCount(doc);
printf("document has %d pages\n", numPages);
for (int i = 0; i < numPages; ++i) {
page = FPDF_LoadPage(doc, i);
if (page == NULL) {
printf("failed to open page %s\n", i);
continue;
}
double width = FPDF_GetPageWidth(page);
double height = FPDF_GetPageHeight(page);
printf("page %d is : %f x %f\n", i, width, height);
// 创建空白位图对象
FPDF_BITMAP bitmap = FPDFBitmap_Create(width, height, 0);
FPDFBitmap_FillRect(bitmap, 0, 0, width, height, 0xFF, 0xFF, 0xFF, 0xFF);
// 渲染图片
FPDF_RenderPageBitmap(bitmap, page, 0, 0, width, height, 0, 0);
const char *buffer = reinterpret_cast<const char *>(FPDFBitmap_GetBuffer(bitmap));
SkImageInfo imageInfo = SkImageInfo::Make(width, height, kRGBA_8888_SkColorType, kUnpremul_SkAlphaType);
// const int totalByte = (imageInfo.minRowBytes() * imageInfo.height());
SkPixmap pixmap(imageInfo, buffer, imageInfo.minRowBytes());
img = SkImage::MakeRasterCopy(pixmap);
FPDFBitmap_Destroy(bitmap);
FPDF_ClosePage(page);
break; //只读取第一页
}
FPDF_DestroyLibrary();
return img;
}
void main() {
std::string strPath("D:/test.pdf");
std::ifstream xdZipPath(strPath.c_str(), std::ios::in | std::ios::binary); // 压缩包zip路径
if (!xdZipPath.is_open()) {
std::cout << strPath << " not exist!";
return;
}
size_t bufSize = xdZipPath.seekg(0, std::ios::end).tellg();
uint8_t *buf = new uint8_t[bufSize];
xdZipPath.seekg(0, std::ios::beg).read((char *)buf, bufSize);
xdZipPath.close();
sk_sp<SkData> imgData = SkData::MakeWithCopy(buf, bufSize);
delete[] buf; // 提前释放内存
sk_sp<SkImage> img = pdfToImg(imgData);
}
参考
https://pdfium.googlesource.com/pdfium
The C# PDF Library | Pdfium.Net SDK
https://github.com/PDFium/PDFium
https://github.com/bblanchon/pdfium-binaries
Class: PDFium::Page --- Documentation for pdfium (0.0.2)
https://blogs.embarcadero.com/pdfium-pdf-engine-for-your-delphi-c-builder-firemonkey-applications/