diff --git a/fpdfsdk/src/fpdfeditpage.cpp b/fpdfsdk/src/fpdfeditpage.cpp
index d9cbbe4..3f22b56 100644
--- a/fpdfsdk/src/fpdfeditpage.cpp
+++ b/fpdfsdk/src/fpdfeditpage.cpp
@@ -1,316 +1,316 @@
-// 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()->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()->GetInteger() / 90;
-		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()->GetInteger() / 90;
-						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()->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()->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()->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
-
-	}
-
-}
+// 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()->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()->GetInteger() / 90;
+		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()->GetInteger() / 90;
+						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()->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()->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()->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
+
+	}
+
+}
