pdfium FPDFPage_GenerateContent 生成文件内容

// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

// #include "x:/pdf/fpdfapi5/include/fpdfapi.h"
#include "../include/fsdk_define.h"
#include "../include/fpdfedit.h"

#if _FX_OS_ == _FX_ANDROID_
#include "time.h"
#else
#include <ctime>
#endif

DLLEXPORT FPDF_DOCUMENT STDCALL FPDF_CreateNewDocument()
{
    CPDF_Document* pDoc = FX_NEW CPDF_Document;
    if (!pDoc)
        return NULL;
    pDoc->CreateNewDoc();
    time_t currentTime;

    CFX_ByteString DateStr;

    if(FSDK_IsSandBoxPolicyEnabled(FPDF_POLICY_MACHINETIME_ACCESS))
    {
        if ( -1 != time( &currentTime ) )
        {
            tm * pTM = localtime( &currentTime );
            if ( pTM )
            {
                DateStr.Format(    "D:%04d%02d%02d%02d%02d%02d", pTM->tm_year+1900, pTM->tm_mon+1,
                    pTM->tm_mday, pTM->tm_hour, pTM->tm_min, pTM->tm_sec );
            }
        }
    }

    CPDF_Dictionary* pInfoDict = NULL;
    pInfoDict = pDoc->GetInfo();
    if (pInfoDict)
    {
        if(FSDK_IsSandBoxPolicyEnabled(FPDF_POLICY_MACHINETIME_ACCESS))
            pInfoDict->SetAt("CreationDate", new CPDF_String(DateStr));
#ifdef FOXIT_CHROME_BUILD
        pInfoDict->SetAt("Creator",FX_NEW CPDF_String(L"Google"));
#else
        pInfoDict->SetAt("Creator",FX_NEW CPDF_String(L"Foxit PDF SDK DLL 2.0 - Foxit Software"));
#endif
    }

    return pDoc;
}

DLLEXPORT void STDCALL FPDFPage_Delete(FPDF_DOCUMENT document, int page_index)
{
    CPDF_Document* pDoc = (CPDF_Document*)document;
    if (pDoc == NULL)
        return;
    if (page_index < 0 || page_index >= pDoc->GetPageCount())
        return;

    pDoc->DeletePage(page_index);
}

DLLEXPORT FPDF_PAGE STDCALL FPDFPage_New(FPDF_DOCUMENT document, int page_index, double width, double height)
{
    if (!document)
        return NULL;

//    CPDF_Parser* pParser = (CPDF_Parser*)document;
    CPDF_Document* pDoc = (CPDF_Document*)document;
    if(page_index < 0)
        page_index = 0;
    if(pDoc->GetPageCount()<page_index)
        page_index = pDoc->GetPageCount();
//    if (page_index < 0 || page_index >= pDoc->GetPageCount())
//        return NULL;

    CPDF_Dictionary* pPageDict = pDoc->CreateNewPage(page_index);
    if(!pPageDict)
        return NULL;
    CPDF_Array* pMediaBoxArray = FX_NEW CPDF_Array;
    pMediaBoxArray->Add(FX_NEW CPDF_Number(0));
    pMediaBoxArray->Add(FX_NEW CPDF_Number(0));
    pMediaBoxArray->Add(FX_NEW CPDF_Number(FX_FLOAT(width)));
    pMediaBoxArray->Add(FX_NEW CPDF_Number(FX_FLOAT(height)));

    pPageDict->SetAt("MediaBox", pMediaBoxArray);
    pPageDict->SetAt("Rotate", FX_NEW CPDF_Number(0));
    pPageDict->SetAt("Resources", FX_NEW CPDF_Dictionary);

    CPDF_Page* pPage = FX_NEW CPDF_Page;
    pPage->Load(pDoc,pPageDict);
    pPage->ParseContent();

    return pPage;
}

DLLEXPORT int STDCALL FPDFPage_GetRotation(FPDF_PAGE page)
{
    CPDF_Page* pPage = (CPDF_Page*)page;
    if (!pPage || !pPage->m_pFormDict || !pPage->m_pFormDict->KeyExist("Type") || !pPage->m_pFormDict->GetElement("Type")->GetDirect()
        || pPage->m_pFormDict->GetElement("Type")->GetDirect()->GetString().Compare("Page"))
    {
        return -1;
    }
    CPDF_Dictionary* pDict = pPage->m_pFormDict;

    int rotate = 0;
    if(pDict != NULL)
    {
        if (pDict->KeyExist("Rotate"))
            rotate = pDict->GetElement("Rotate")->GetDirect()? pDict->GetElement("Rotate")->GetDirect()->GetInteger() / 90 : 0;
        else
        {
            if(pDict->KeyExist("Parent"))
            {
                CPDF_Dictionary* pPages = (CPDF_Dictionary*)pDict->GetElement("Parent")->GetDirect();
                while(pPages)
                {
                    if(pPages->KeyExist("Rotate"))
                    {
                        rotate = pPages->GetElement("Rotate")->GetDirect()? pPages->GetElement("Rotate")->GetDirect()->GetInteger() / 90 : 0;
                        break;
                    }
                    else if(pPages->KeyExist("Parent"))
                        pPages = (CPDF_Dictionary*)pPages->GetElement("Parent")->GetDirect();
                    else break;
                }
            }
        }
    }
    else
    {
        return -1;
    }

    return rotate;
}

DLLEXPORT void STDCALL FPDFPage_InsertObject(FPDF_PAGE page, FPDF_PAGEOBJECT page_obj)
{
    CPDF_Page* pPage = (CPDF_Page*)page;
    if (!pPage || !pPage->m_pFormDict || !pPage->m_pFormDict->KeyExist("Type") || !pPage->m_pFormDict->GetElement("Type")->GetDirect()
        || pPage->m_pFormDict->GetElement("Type")->GetDirect()->GetString().Compare("Page"))
    {
        return;
    }
    CPDF_PageObject* pPageObj = (CPDF_PageObject*)page_obj;
    if(pPageObj == NULL)
        return;
    FX_POSITION LastPersition = pPage->GetLastObjectPosition();

    pPage->InsertObject(LastPersition, pPageObj);
    switch(pPageObj->m_Type)
    {
    case FPDF_PAGEOBJ_PATH:
        {
            CPDF_PathObject* pPathObj = (CPDF_PathObject*)pPageObj;
            pPathObj->CalcBoundingBox();
            break;
        }
    case FPDF_PAGEOBJ_TEXT:
        {
            //    CPDF_PathObject* pPathObj = (CPDF_PathObject*)pPageObj;
            //    pPathObj->CalcBoundingBox();
            break;
        }
    case FPDF_PAGEOBJ_IMAGE:
        {
            CPDF_ImageObject* pImageObj = (CPDF_ImageObject*)pPageObj;
            pImageObj->CalcBoundingBox();
            break;
        }
    case FPDF_PAGEOBJ_SHADING:
        {
            CPDF_ShadingObject* pShadingObj = (CPDF_ShadingObject*)pPageObj;
            pShadingObj->CalcBoundingBox();
            break;
        }
    case FPDF_PAGEOBJ_FORM:
        {
            CPDF_FormObject* pFormObj = (CPDF_FormObject*)pPageObj;
            pFormObj->CalcBoundingBox();
            break;
        }
    default:
        break;
    }

    //    pPage->ParseContent();
    //pPage->GenerateContent();

}

DLLEXPORT int STDCALL FPDFPage_CountObject(FPDF_PAGE page)
{
    CPDF_Page* pPage = (CPDF_Page*)page;
    if (!pPage || !pPage->m_pFormDict || !pPage->m_pFormDict->KeyExist("Type") || !pPage->m_pFormDict->GetElement("Type")->GetDirect()
        || pPage->m_pFormDict->GetElement("Type")->GetDirect()->GetString().Compare("Page"))
    {
        return -1;
    }
    return pPage->CountObjects();
//    return 0;
}

DLLEXPORT FPDF_PAGEOBJECT STDCALL FPDFPage_GetObject(FPDF_PAGE page, int index)
{
    CPDF_Page* pPage = (CPDF_Page*)page;
    if (!pPage || !pPage->m_pFormDict || !pPage->m_pFormDict->KeyExist("Type")
        || pPage->m_pFormDict->GetElement("Type")->GetDirect()->GetString().Compare("Page"))
    {
        return NULL;
    }
    return pPage->GetObjectByIndex(index);
//    return NULL;
}

DLLEXPORT FPDF_BOOL STDCALL FPDFPage_HasTransparency(FPDF_PAGE page)
{
    if(!page) return FALSE;
    CPDF_Page* pPage = (CPDF_Page*)page;

    return pPage->BackgroundAlphaNeeded();
}

DLLEXPORT FPDF_BOOL STDCALL FPDFPageObj_HasTransparency(FPDF_PAGEOBJECT pageObject)
{
    if(!pageObject) return FALSE;
    CPDF_PageObject* pPageObj = (CPDF_PageObject*)pageObject;

    const CPDF_GeneralStateData* pGeneralState = pPageObj->m_GeneralState;
    int blend_type = pGeneralState ? pGeneralState->m_BlendType : FXDIB_BLEND_NORMAL;
    if (blend_type != FXDIB_BLEND_NORMAL) return TRUE;

    CPDF_Dictionary* pSMaskDict = pGeneralState ? (CPDF_Dictionary*)pGeneralState->m_pSoftMask : NULL;
    if(pSMaskDict) return TRUE;

    if(pGeneralState && pGeneralState->m_FillAlpha != 1.0f)
        return TRUE;

    if(pPageObj->m_Type == PDFPAGE_PATH)
    {
        if(pGeneralState && pGeneralState->m_StrokeAlpha != 1.0f)
            return TRUE;
    }

    if(pPageObj->m_Type == PDFPAGE_FORM)
    {
        CPDF_FormObject* pFormObj = (CPDF_FormObject*)pPageObj;
        if(pFormObj->m_pForm && (pFormObj->m_pForm->m_Transparency & PDFTRANS_ISOLATED))
            return TRUE;
        if(pFormObj->m_pForm && (!(pFormObj->m_pForm->m_Transparency & PDFTRANS_ISOLATED) && (pFormObj->m_pForm->m_Transparency & PDFTRANS_GROUP)))
            return TRUE;
    }
    return FALSE;
}

DLLEXPORT FPDF_BOOL STDCALL FPDFPage_GenerateContent(FPDF_PAGE page)
{
    CPDF_Page* pPage = (CPDF_Page*)page;
    if (!pPage || !pPage->m_pFormDict || !pPage->m_pFormDict->KeyExist("Type") || !pPage->m_pFormDict->GetElement("Type")->GetDirect()
        || pPage->m_pFormDict->GetElement("Type")->GetDirect()->GetString().Compare("Page"))
    {
        return FALSE;
    }
    CPDF_PageContentGenerate CG(pPage);
    CG.GenerateContent();

    return TRUE;
}

DLLEXPORT void STDCALL FPDFPageObj_Transform(FPDF_PAGEOBJECT page_object,
             double a, double b, double c, double d, double e, double f)
{
    CPDF_PageObject* pPageObj = (CPDF_PageObject*)page_object;
    if(pPageObj == NULL)
        return;
//PDF_ImageObject* pImageObj = FX_NEW CPDF_ImageObject;
    CFX_AffineMatrix matrix((FX_FLOAT)a,(FX_FLOAT)b,(FX_FLOAT)c,(FX_FLOAT)d,(FX_FLOAT)e,(FX_FLOAT)f);
    pPageObj->Transform(matrix);
}
DLLEXPORT void STDCALL FPDFPage_TransformAnnots(FPDF_PAGE page,
                                               double a, double b, double c, double d, double e, double f)
{
    if(page == NULL)
        return;
    CPDF_Page* pPage = (CPDF_Page*)page;
    CPDF_AnnotList AnnotList(pPage);
    for (int i=0; i<AnnotList.Count();i++)
    {
        CPDF_Annot* pAnnot = AnnotList.GetAt(i);
        // transformAnnots Rectangle
        CPDF_Rect rect;
        pAnnot->GetRect(rect);
        CFX_AffineMatrix matrix((FX_FLOAT)a,(FX_FLOAT)b,(FX_FLOAT)c,(FX_FLOAT)d,(FX_FLOAT)e,(FX_FLOAT)f);
        rect.Transform(&matrix);
        CPDF_Array *pRectArray = NULL;
        pRectArray = pAnnot->m_pAnnotDict->GetArray("Rect");
        if (!pRectArray) pRectArray=CPDF_Array::Create();
        pRectArray->SetAt(0,FX_NEW CPDF_Number(rect.left));
        pRectArray->SetAt(1,FX_NEW CPDF_Number(rect.bottom));
        pRectArray->SetAt(2,FX_NEW CPDF_Number(rect.right));
        pRectArray->SetAt(3,FX_NEW CPDF_Number(rect.top));
        pAnnot->m_pAnnotDict->SetAt("Rect",pRectArray);

        //Transform AP‘s rectangle
        //To Do

    }

}

DLLEXPORT void STDCALL FPDFPage_SetRotation(FPDF_PAGE page, int rotate)
{
    CPDF_Page* pPage = (CPDF_Page*)page;
    if (!pPage || !pPage->m_pFormDict || !pPage->m_pFormDict->KeyExist("Type") || !pPage->m_pFormDict->GetElement("Type")->GetDirect()
        || pPage->m_pFormDict->GetElement("Type")->GetDirect()->GetString().Compare("Page"))
    {
        return;
    }
    CPDF_Dictionary* pDict = pPage->m_pFormDict;
    rotate %=4;

    pDict->SetAt("Rotate", FX_NEW CPDF_Number(rotate * 90));
}

// Function: FPDFPage_GenerateContent
// Generate PDF Page content.
// Parameters:
// page - Handle to a page. Returned by FPDFPage_New or FPDF_LoadPage.
// Return value:
// True if successful, false otherwise.
// Comment:
// Before you save the page to a file, or reload the page, you must call the FPDFPage_GenerateContent function.

原文地址:https://www.cnblogs.com/hshy/p/12095785.html

时间: 2025-01-14 07:32:55

pdfium FPDFPage_GenerateContent 生成文件内容的相关文章

MFC 修改默认生成文件和默认生成工程内容

修改默认生成文件和默认生成工程的内容是非常非常实用的!因为这样我们就不用每次新建一个工程都去做以前做过的一些工作,譬如用到OpenCV就要去包含它的头文件等等,当然在.h文件中默认直接加上作者.公司的描述也会显得更方便,方法如下: 首先是修改.h和.cpp文件的默认生成内容(即添加新建项时文件将会自带你添加的内容,而不是空白一片),这个问题关键在于找到其模板文件路径,本人的路径是"C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcp

Android 建立文件夹、生成文件并写入文本文件内容

一.首先添加权限 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> 二.建立文件夹.生成文件并写入文本文件内容代码 private void initData() { String filePath = "/sdcard/Test/"; String fileName = "log.txt"

C#生成PDF文档,读取TXT文件内容

using System.IO;using iTextSharp.text;using iTextSharp.text.pdf; //需要在项目里引用ICSharpCode.SharpZipLib.dll和itextsharp.dllpublic string TxtFilePath;public string SavePdfPath;//保存PDF的路径 #region 读取TXT内容        private string ReadXieyi(string FilePath)      

生成任意内容任意类型的文件

任何类型都可以,内容也是,excel虽然也可以生成,但它会把所有内容都放到第一个,所以还是老实用一般方法吧. 这个有点麻烦,我们一步步来(可以先拉到最后看一眼配置文件会比较好理解) 第一个类:调用方法 public void test(){ //参数一是需要放进去的内容,具体肯定不会这么短(根据模板多个的情况下改用list) //参数二是读取配置文件的路径 insertContent("111", "D:/dev/workspace/lzpt/resource/")

将excel文件内容存储到数据库,并可以实时在前端查看(不必生成文件)

版权声明:本文为博主原创文章,未经博主允许不得转载 本文主要讲前端内容,后端涉及较少,可以认为是使用Java. 首先是excel文件上传,这个较为简单,可以html5的数据接口FormData()进行操作.具体代码如下: <!DOCTYPE html> <html> <head> </head> <body> <input type="file" id="_file" value="&quo

[搬运自我的CSDN博客] python抓取javascript动态生成HTML内容的实践

<注:CSDN博客在美国访问特别卡,所以转移到cnblogs来发文章> 本实验在Ubuntu14.04上完成.使用的浏览器是火狐(Firefox 33.0),python版本是2.7.6. 大家都知道用urllib配合正则表达式抓取静态HTML的内容很方便,但是如果网页中有javascript动态生成的内容,urllib就无能为力了. 此时我们要借助一个额外的工具:selenium.它的工作原理是操纵(火狐)浏览器浏览目标网页,等待网页中的javascript全部执行完毕后再对HTML源码进行

MANIFEST.MF 文件内容完全详解(转)

打开Java的JAR文件我们经常可以看到文件中包含着一个META-INF目录, 这个目录下会有一些文件,其中必有一个MANIFEST.MF,这个文件描述了该Jar文件的很多信息,下面将详细介绍MANIFEST.MF文件的内 容,先来看struts.jar中包含的MANIFEST.MF文件内容: Manifest-Version: 1.0Created-By: Apache Ant 1.5.1Extension-Name: Struts FrameworkSpecification-Title:

“允许源文件与模块生成文件不同” 解决方法 ,亲测最有效的

今天写代码的时候有一处访问数据库的操作,sql语句报了错,因为少加了一个[,] 调试的时候中断在这个地方,然后发现了问题,就顺手加了上去,再运行的时候发现运行的版本还是那个少了[,]的版本 然后就有了此文 网上查找解决方案大致有三种,我尝试了两种,最后使用了自己的办法解决 网上的解决方案链接在此[http://blog.csdn.net/woaizhoulichao1/article/details/6313173] 最后删除了源文件中bin目录下的文件,整个项目就出了问题,就想到是不是生成不正

Class文件内容及常量池

当JVM运行Java程序的时候,它会加载对应的class文件,并提取class文件中的信息存放在JVM开辟出来的方法区内存中.那么这个class文件里面到底有些什么内容呢? 一.class文件内容概述 class文件是由8bits的字节流组成,全部字节构成了15个有意义的项目.这些项目之间没有任何无意义的字节,因此class文件非常紧凑.占据多字节空间的项目按照高位在前的顺序存放.下面我们详细讨论这些项目: ★ magic(魔数)    每个class文件的前4个字节称为魔数,值为0xCAFEB