1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
7 #include "../../public/fpdf_edit.h"
8 #include "../../public/fpdf_formfill.h"
9 #include "../include/fsdk_define.h"
10 #include "../include/fpdfxfa/fpdfxfa_doc.h"
11 #include "../include/fpdfxfa/fpdfxfa_app.h"
12 #include "../include/fpdfxfa/fpdfxfa_page.h"
14 #if _FX_OS_ == _FX_ANDROID_
20 DLLEXPORT FPDF_DOCUMENT STDCALL FPDF_CreateNewDocument()
22 CPDF_Document* pDoc = FX_NEW CPDF_Document;
28 CFX_ByteString DateStr;
30 if(FSDK_IsSandBoxPolicyEnabled(FPDF_POLICY_MACHINETIME_ACCESS))
32 if ( -1 != time( ¤tTime ) )
34 tm * pTM = localtime( ¤tTime );
37 DateStr.Format( "D:%04d%02d%02d%02d%02d%02d", pTM->tm_year+1900, pTM->tm_mon+1,
38 pTM->tm_mday, pTM->tm_hour, pTM->tm_min, pTM->tm_sec );
43 CPDF_Dictionary* pInfoDict = NULL;
44 pInfoDict = pDoc->GetInfo();
47 if(FSDK_IsSandBoxPolicyEnabled(FPDF_POLICY_MACHINETIME_ACCESS))
48 pInfoDict->SetAt("CreationDate", new CPDF_String(DateStr));
49 pInfoDict->SetAt("Creator",FX_NEW CPDF_String(L"PDFium"));
52 CPDFXFA_App* pApp = CPDFXFA_App::GetInstance();
53 CPDFXFA_Document* document = FX_NEW CPDFXFA_Document(pDoc, pApp);
57 DLLEXPORT void STDCALL FPDFPage_Delete(FPDF_DOCUMENT document, int page_index)
59 CPDF_Document* pDoc = ((CPDFXFA_Document*)document)->GetPDFDoc();
62 if (page_index < 0 || page_index >= pDoc->GetPageCount())
65 pDoc->DeletePage(page_index);
68 DLLEXPORT FPDF_PAGE STDCALL FPDFPage_New(FPDF_DOCUMENT document, int page_index, double width, double height)
73 // CPDF_Parser* pParser = (CPDF_Parser*)document;
74 CPDF_Document* pDoc = ((CPDFXFA_Document*)document)->GetPDFDoc();
77 if(pDoc->GetPageCount()<page_index)
78 page_index = pDoc->GetPageCount();
79 // if (page_index < 0 || page_index >= pDoc->GetPageCount())
82 CPDF_Dictionary* pPageDict = pDoc->CreateNewPage(page_index);
85 CPDF_Array* pMediaBoxArray = FX_NEW CPDF_Array;
86 pMediaBoxArray->Add(FX_NEW CPDF_Number(0));
87 pMediaBoxArray->Add(FX_NEW CPDF_Number(0));
88 pMediaBoxArray->Add(FX_NEW CPDF_Number(FX_FLOAT(width)));
89 pMediaBoxArray->Add(FX_NEW CPDF_Number(FX_FLOAT(height)));
91 pPageDict->SetAt("MediaBox", pMediaBoxArray);
92 pPageDict->SetAt("Rotate", FX_NEW CPDF_Number(0));
93 pPageDict->SetAt("Resources", FX_NEW CPDF_Dictionary);
95 // CPDF_Page* pPage = FX_NEW CPDF_Page;
96 // pPage->Load(pDoc,pPageDict);
97 // pPage->ParseContent();
99 CPDFXFA_Page* pPage = FX_NEW CPDFXFA_Page((CPDFXFA_Document*)document, page_index);
100 pPage->LoadPDFPage(pPageDict);
105 DLLEXPORT int STDCALL FPDFPage_GetRotation(FPDF_PAGE page)
107 CPDF_Page* pPage = ((CPDFXFA_Page*)page)->GetPDFPage();
108 if (!pPage || !pPage->m_pFormDict || !pPage->m_pFormDict->KeyExist("Type") || !pPage->m_pFormDict->GetElement("Type")->GetDirect()
109 || pPage->m_pFormDict->GetElement("Type")->GetDirect()->GetString().Compare("Page"))
113 CPDF_Dictionary* pDict = pPage->m_pFormDict;
118 if (pDict->KeyExist("Rotate"))
119 rotate = pDict->GetElement("Rotate")->GetDirect()? pDict->GetElement("Rotate")->GetDirect()->GetInteger() / 90 : 0;
122 if(pDict->KeyExist("Parent"))
124 CPDF_Dictionary* pPages = (CPDF_Dictionary*)pDict->GetElement("Parent")->GetDirect();
127 if(pPages->KeyExist("Rotate"))
129 rotate = pPages->GetElement("Rotate")->GetDirect()? pPages->GetElement("Rotate")->GetDirect()->GetInteger() / 90 : 0;
132 else if(pPages->KeyExist("Parent"))
133 pPages = (CPDF_Dictionary*)pPages->GetElement("Parent")->GetDirect();
147 DLLEXPORT void STDCALL FPDFPage_InsertObject(FPDF_PAGE page, FPDF_PAGEOBJECT page_obj)
149 CPDF_Page* pPage = ((CPDFXFA_Page*)page)->GetPDFPage();
150 if (!pPage || !pPage->m_pFormDict || !pPage->m_pFormDict->KeyExist("Type") || !pPage->m_pFormDict->GetElement("Type")->GetDirect()
151 || pPage->m_pFormDict->GetElement("Type")->GetDirect()->GetString().Compare("Page"))
155 CPDF_PageObject* pPageObj = (CPDF_PageObject*)page_obj;
158 FX_POSITION LastPersition = pPage->GetLastObjectPosition();
160 pPage->InsertObject(LastPersition, pPageObj);
161 switch(pPageObj->m_Type)
163 case FPDF_PAGEOBJ_PATH:
165 CPDF_PathObject* pPathObj = (CPDF_PathObject*)pPageObj;
166 pPathObj->CalcBoundingBox();
169 case FPDF_PAGEOBJ_TEXT:
171 // CPDF_PathObject* pPathObj = (CPDF_PathObject*)pPageObj;
172 // pPathObj->CalcBoundingBox();
175 case FPDF_PAGEOBJ_IMAGE:
177 CPDF_ImageObject* pImageObj = (CPDF_ImageObject*)pPageObj;
178 pImageObj->CalcBoundingBox();
181 case FPDF_PAGEOBJ_SHADING:
183 CPDF_ShadingObject* pShadingObj = (CPDF_ShadingObject*)pPageObj;
184 pShadingObj->CalcBoundingBox();
187 case FPDF_PAGEOBJ_FORM:
189 CPDF_FormObject* pFormObj = (CPDF_FormObject*)pPageObj;
190 pFormObj->CalcBoundingBox();
197 // pPage->ParseContent();
198 //pPage->GenerateContent();
202 DLLEXPORT int STDCALL FPDFPage_CountObject(FPDF_PAGE page)
204 CPDF_Page* pPage = ((CPDFXFA_Page*)page)->GetPDFPage();
205 if (!pPage || !pPage->m_pFormDict || !pPage->m_pFormDict->KeyExist("Type") || !pPage->m_pFormDict->GetElement("Type")->GetDirect()
206 || pPage->m_pFormDict->GetElement("Type")->GetDirect()->GetString().Compare("Page"))
210 return pPage->CountObjects();
214 DLLEXPORT FPDF_PAGEOBJECT STDCALL FPDFPage_GetObject(FPDF_PAGE page, int index)
216 CPDF_Page* pPage = ((CPDFXFA_Page*)page)->GetPDFPage();
217 if (!pPage || !pPage->m_pFormDict || !pPage->m_pFormDict->KeyExist("Type")
218 || pPage->m_pFormDict->GetElement("Type")->GetDirect()->GetString().Compare("Page"))
222 return pPage->GetObjectByIndex(index);
226 DLLEXPORT FPDF_BOOL STDCALL FPDFPage_HasTransparency(FPDF_PAGE page)
228 if(!page) return FALSE;
229 CPDF_Page* pPage = ((CPDFXFA_Page*)page)->GetPDFPage();
230 if (!pPage) return FALSE;
232 return pPage->BackgroundAlphaNeeded();
235 DLLEXPORT FPDF_BOOL STDCALL FPDFPageObj_HasTransparency(FPDF_PAGEOBJECT pageObject)
237 if(!pageObject) return FALSE;
238 CPDF_PageObject* pPageObj = (CPDF_PageObject*)pageObject;
240 const CPDF_GeneralStateData* pGeneralState = pPageObj->m_GeneralState;
241 int blend_type = pGeneralState ? pGeneralState->m_BlendType : FXDIB_BLEND_NORMAL;
242 if (blend_type != FXDIB_BLEND_NORMAL) return TRUE;
244 CPDF_Dictionary* pSMaskDict = pGeneralState ? (CPDF_Dictionary*)pGeneralState->m_pSoftMask : NULL;
245 if(pSMaskDict) return TRUE;
247 if(pGeneralState && pGeneralState->m_FillAlpha != 1.0f)
250 if(pPageObj->m_Type == PDFPAGE_PATH)
252 if(pGeneralState && pGeneralState->m_StrokeAlpha != 1.0f)
256 if(pPageObj->m_Type == PDFPAGE_FORM)
258 CPDF_FormObject* pFormObj = (CPDF_FormObject*)pPageObj;
259 if(pFormObj->m_pForm && (pFormObj->m_pForm->m_Transparency & PDFTRANS_ISOLATED))
261 if(pFormObj->m_pForm && (!(pFormObj->m_pForm->m_Transparency & PDFTRANS_ISOLATED) && (pFormObj->m_pForm->m_Transparency & PDFTRANS_GROUP)))
267 DLLEXPORT FPDF_BOOL STDCALL FPDFPage_GenerateContent(FPDF_PAGE page)
269 CPDF_Page* pPage = ((CPDFXFA_Page*)page)->GetPDFPage();
270 if (!pPage || !pPage->m_pFormDict || !pPage->m_pFormDict->KeyExist("Type") || !pPage->m_pFormDict->GetElement("Type")->GetDirect()
271 || pPage->m_pFormDict->GetElement("Type")->GetDirect()->GetString().Compare("Page"))
275 CPDF_PageContentGenerate CG(pPage);
276 CG.GenerateContent();
281 DLLEXPORT void STDCALL FPDFPageObj_Transform(FPDF_PAGEOBJECT page_object,
282 double a, double b, double c, double d, double e, double f)
284 CPDF_PageObject* pPageObj = (CPDF_PageObject*)page_object;
287 //PDF_ImageObject* pImageObj = FX_NEW CPDF_ImageObject;
288 CFX_AffineMatrix matrix((FX_FLOAT)a,(FX_FLOAT)b,(FX_FLOAT)c,(FX_FLOAT)d,(FX_FLOAT)e,(FX_FLOAT)f);
289 pPageObj->Transform(matrix);
291 DLLEXPORT void STDCALL FPDFPage_TransformAnnots(FPDF_PAGE page,
292 double a, double b, double c, double d, double e, double f)
296 CPDF_Page* pPage = ((CPDFXFA_Page*)page)->GetPDFPage();
298 CPDF_AnnotList AnnotList(pPage);
299 for (int i=0; i<AnnotList.Count();i++)
301 CPDF_Annot* pAnnot = AnnotList.GetAt(i);
302 // transformAnnots Rectangle
304 pAnnot->GetRect(rect);
305 CFX_AffineMatrix matrix((FX_FLOAT)a,(FX_FLOAT)b,(FX_FLOAT)c,(FX_FLOAT)d,(FX_FLOAT)e,(FX_FLOAT)f);
306 rect.Transform(&matrix);
307 CPDF_Array *pRectArray = NULL;
308 pRectArray = pAnnot->GetAnnotDict()->GetArray("Rect");
309 if (!pRectArray) pRectArray=CPDF_Array::Create();
310 pRectArray->SetAt(0, new CPDF_Number(rect.left));
311 pRectArray->SetAt(1, new CPDF_Number(rect.bottom));
312 pRectArray->SetAt(2, new CPDF_Number(rect.right));
313 pRectArray->SetAt(3, new CPDF_Number(rect.top));
314 pAnnot->GetAnnotDict()->SetAt("Rect",pRectArray);
316 //Transform AP's rectangle
323 DLLEXPORT void STDCALL FPDFPage_SetRotation(FPDF_PAGE page, int rotate)
327 CPDF_Page* pPage = ((CPDFXFA_Page*)page)->GetPDFPage();
330 if (!pPage || !pPage->m_pFormDict || !pPage->m_pFormDict->KeyExist("Type") || !pPage->m_pFormDict->GetElement("Type")->GetDirect()
331 || pPage->m_pFormDict->GetElement("Type")->GetDirect()->GetString().Compare("Page"))
335 CPDF_Dictionary* pDict = pPage->m_pFormDict;
338 pDict->SetAt("Rotate", FX_NEW CPDF_Number(rotate * 90));