C++ PDF转图片

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

pdfium_render - Rust

pdfium_render::pdfium - Rust

Class: PDFium::Page --- Documentation for pdfium (0.0.2)

@taggun/pdfium - npm

https://blogs.embarcadero.com/pdfium-pdf-engine-for-your-delphi-c-builder-firemonkey-applications/

pypdfium2 · PyPI


创作不易,小小的支持一下吧!

相关推荐
澄澈天空1 小时前
C++ MFC添加RichEditControl控件后,程序启动失败
c++·mfc
Lzc7742 小时前
C++初阶——简单实现vector
c++·简单实现vector
一个小白12 小时前
C++——list模拟实现
开发语言·c++
程序员老舅2 小时前
C++ Qt项目教程:WebServer网络测试工具
c++·qt·测试工具·webserver·qt项目·qt项目实战
靡不有初1113 小时前
CCF-CSP第18次认证第一题——报数【两个与string相关的函数的使用】
c++·学习·ccfcsp
菜鸟单飞3 小时前
介绍一款非常实用的PDF阅读软件!
windows·pdf·电脑
cookies_s_s4 小时前
Linux--进程(进程虚拟地址空间、页表、进程控制、实现简易shell)
linux·运维·服务器·数据结构·c++·算法·哈希算法
不想编程小谭5 小时前
力扣LeetCode: 2506 统计相似字符串对的数目
c++·算法·leetcode
曼巴UE56 小时前
UE5.3 C++ TArray系列(一)
开发语言·c++·ue5
阿巴~阿巴~6 小时前
多源 BFS 算法详解:从原理到实现,高效解决多源最短路问题
开发语言·数据结构·c++·算法·宽度优先