⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cgi_getpdffileinfo.c

📁 从PDF文件中读取文件的关键信息
💻 C
字号:

/***********************************************************************************
Function Name:CGI_GetPDFFileInfo()
Description :获取pdf数据信息
Input   :无
Output    :无
Return    :成功返回0  失败返回1
Other   :
***********************************************************************************/
ULONG CGI_GetPDFFileInfo(char* ucPdfPathName,ST_PDFHEADERINFO * pstpdfinfo)
{
    FILE* hPDFFile = NULL;
    long pdfOffset = 0;
    long pdfTotalDictorys = 0;
    char temp[20];
    size_t ntitle = 0;
    int ulPages;
    char buffer[513];
  

    /*检查参数的合法性*/
    if ( NULL == ucPdfPathName )
    {
        CGI_ASSERT("the input parameter is invalid!");
        return IPPBX_FAILED;
    }

    if(NULL == (hPDFFile = fopen(ucPdfPathName, "r")))
    {
        CGI_ASSERT("open PDF file[%s] failed while get PDF information!",ucPdfPathName);
        return IPPBX_FAILED;
    }

    /*移动文件指针到文件末尾以读取目录偏移量*/
    fseek(hPDFFile, -20, SEEK_END);
    /*NOTES:不必检查fread的参数合法性,此时已经读取到文件的末尾了*/
    fread(buffer, sizeof(buffer), sizeof(char), hPDFFile);
    sscanf(buffer, "%s\n%ld", temp, &pdfOffset);

    /*检查目录偏移量是否合法*/
    if(0 == pdfOffset)
    {
        CGI_ASSERT("read PDF file[%s] failed while get PDF information!",ucPdfPathName);
        fclose(hPDFFile);
        return IPPBX_FAILED;
    }

    /*5是xref的长度*/
    fseek(hPDFFile, (pdfOffset + 5), SEEK_SET);
    memset(buffer, 0x0, sizeof(buffer));
    fgets(buffer, sizeof(buffer), hPDFFile);

    /*获取目录个数,1个PDF文件至少应该有8个目录*/
    sscanf(buffer, "0 %lu", &pdfTotalDictorys);
    if(pdfTotalDictorys < 8)
    {
        CGI_ASSERT("read PDF file[%s] failed while get PDF information!",ucPdfPathName);
        fclose(hPDFFile);
        return IPPBX_FAILED;
    }

    /*保存pdf页数*/
    ulPages = (pdfTotalDictorys - 1) / 4;

    /*获取Info部分的偏移*/
    fseek(hPDFFile, 40, SEEK_CUR);/*40是和固定值*/
    memset(buffer, 0x0, sizeof(buffer));
    fgets(buffer, sizeof(buffer), hPDFFile);
    sscanf(buffer, "%ld", &pdfOffset);

    /*检查目录偏移量是否合法*/
    if(0 == pdfOffset)
    {
        CGI_ASSERT("read PDF file[%s] failed while get PDF information!",ucPdfPathName);
        fclose(hPDFFile);
        return IPPBX_FAILED;
    }

    /*移动文件指针到Info节*/
    fseek(hPDFFile, pdfOffset + 9, SEEK_SET); /*9是2 0 obj的长度*/

    /*读取subject*/
    memset(buffer, 0x0, sizeof(buffer));
    fgets(buffer, sizeof(buffer), hPDFFile);
    

  /*  printf("\r\nPages=%ld,pdf info= %s !",ulPages,buffer);	 */

    pstpdfinfo->pages=ulPages;
    strcpy(pstpdfinfo->Info,buffer);
    fclose(hPDFFile);
    return IPPBX_OK;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -