2021-03-20

使用PDFium将PDF文档转化为图片,效率非常高,图片清晰无水印,并且图像DPI可随意设置

1 首先添加pdfium包含目录

2 第二步添加库目录

3 第三步就可以直接使用了

 

    ZFUNCAPI_API void PdfToBMP(char* PDFpath, char* BMPpath, int BMPdpi, BOOL JingXiang,int Range)
    {
        FPDF_DOCUMENT pdf_doc;
        FPDF_PAGE pdf_page;;
        int pageCount;
        FPDF_InitLibrary();
        pdf_doc = FPDF_LoadDocument(PDFpath, NULL);
        pageCount = FPDF_GetPageCount(pdf_doc);
        CImage reimage;
        float image_Sharpness = (float)BMPdpi / 720 * 10;
        //当指点页码无效
        pdf_page = FPDF_LoadPage(pdf_doc, 0);
        const int page_h = (int)(FPDF_GetPageHeight(pdf_page) * image_Sharpness);
        const int page_w = (int)((FPDF_GetPageWidth(pdf_page) + 1) * image_Sharpness);
        //图片要比页面的宽度多1个像素
        FPDF_BITMAP bit;
        //创建PDF图片结构体
        bit = FPDFBitmap_CreateEx(page_w, page_h, FPDFBitmap_BGR, NULL, NULL);
        //图片背景涂色
        FPDFBitmap_FillRect(bit, 0, 0, page_w, page_h, 0xffffff);
        //渲染图片
        FPDF_RenderPageBitmap(bit, pdf_page, 0, 0, page_w, page_h, 0, 0);
        unsigned char* buffer = (unsigned char*)FPDFBitmap_GetBuffer(bit);
        const int stride = FPDFBitmap_GetStride(bit);

        reimage.Destroy();
        reimage.Create(page_w, page_h, 24);
        const int step = reimage.GetPitch();
        //指向数据区的指针
        unsigned char* pucImage = (unsigned char*)reimage.GetBits();
        //数据写到目标数据区    
        if (JingXiang)
        {
            for (int nRow = 0; nRow < page_h; nRow++)
            {
                for (int nCol = 0; nCol < stride / 3; nCol++)
                {
                    for (int nCha = 0; nCha < 3; nCha++)
                    {
                        pucImage[nRow * step + nCol * 3 + nCha] = *(buffer + nRow * stride + (stride / 3 - nCol - 1) * 3 + (3 - nCha - 1));
                        //pucImage[nRow * step + nCol * 3 + nCha] = *(buffer + (page_h-nRow-1) * stride + nCol * 3 + nCha);
                    }
                }
            }
        }
        else
        {
            for (int nRow = 0; nRow < page_h; nRow++)
            {
                for (int nCol = 0; nCol < stride / 3; nCol++)
                {
                    for (int nCha = 0; nCha < 3; nCha++)
                    {
                        pucImage[nRow * step + nCol * 3 + nCha] = *(buffer + nRow * stride + nCol * 3 + nCha);
                    }
                }
            }
        }
        
        reimage.Save(BMPpath);
        FPDFBitmap_Destroy(bit);
        FPDF_ClosePage(pdf_page);
        FPDF_CloseDocument(pdf_doc);
        FPDF_DestroyLibrary();
        if (Range>0)
        {
            Mat src = imread(BMPpath);
            Mat destmat = ImgRotate(src, Range);
            imwrite(BMPpath, destmat);
            destmat.release();
            src.release();
        }
    }

参数意义  char* PDFpath PDF文件的路径  

 char* BMPpath 生成bmp文件路径

int BMPdpi 生成bmp文件精度 数据越大图像越清晰图片占内存越大

BOOL JingXiang 是否需要对图像进行镜像

int Range 对图像进行旋转

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值