DLLEXPORT int STDCALL FPDF_RenderPageBitmap_Start(FPDF_BITMAP bitmap, FPDF_PAGE page, int start_x, int start_y, int size_x, int size_y, int rotate, int flags, IFSDK_PAUSE* pause) { if (!bitmap || !pause || pause->version != 1) return FPDF_RENDER_FAILED; CPDF_Page* pPage = CPDFPageFromFPDFPage(page); if (!pPage) return FPDF_RENDER_FAILED; CPDF_PageRenderContext* pContext = new CPDF_PageRenderContext; pPage->SetRenderContext(WrapUnique(pContext)); CFX_FxgeDevice* pDevice = new CFX_FxgeDevice; pContext->m_pDevice.reset(pDevice); CFX_DIBitmap* pBitmap = CFXBitmapFromFPDFBitmap(bitmap); pDevice->Attach(pBitmap, !!(flags & FPDF_REVERSE_BYTE_ORDER), nullptr, false); IFSDK_PAUSE_Adapter IPauseAdapter(pause); FPDF_RenderPage_Retail(pContext, page, start_x, start_y, size_x, size_y, rotate, flags, FALSE, &IPauseAdapter); if (pContext->m_pRenderer) { return CPDF_ProgressiveRenderer::ToFPDFStatus( pContext->m_pRenderer->GetStatus()); } return FPDF_RENDER_FAILED; }
DLLEXPORT int STDCALL FPDF_RenderPage_Continue(FPDF_PAGE page,IFSDK_PAUSE * pause) { if (page == NULL) return FPDF_RENDER_FAILED; if (!pause) return FPDF_RENDER_FAILED; if (pause->version !=1) return FPDF_RENDER_FAILED; CPDF_Page* pPage = (CPDF_Page*)page; // FXMT_CSLOCK_OBJ(&pPage->m_PageLock); CRenderContext * pContext = (CRenderContext*)pPage->GetPrivateData((void*)1); if (pContext && pContext->m_pRenderer) { IFSDK_PAUSE_Adapter IPauseAdapter(pause); pContext->m_pRenderer->Continue(&IPauseAdapter); CPDF_ProgressiveRenderer::RenderStatus status = CPDF_ProgressiveRenderer::Failed; status = pContext->m_pRenderer->GetStatus(); return status; } return FPDF_RENDER_FAILED; }
DLLEXPORT void STDCALL FPDF_RenderPageBitmap(FPDF_BITMAP bitmap, FPDF_PAGE page, int start_x, int start_y, int size_x, int size_y, int rotate, int flags) { if (bitmap == NULL || page == NULL) return; CPDF_Page* pPage = (CPDF_Page*)page; CRenderContext* pContext = new CRenderContext; pPage->SetPrivateData((void*)1, pContext, DropContext); #ifdef _SKIA_SUPPORT_ pContext->m_pDevice = new CFX_SkiaDevice; if (flags & FPDF_REVERSE_BYTE_ORDER) ((CFX_SkiaDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)bitmap,0,TRUE); else ((CFX_SkiaDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)bitmap); #else pContext->m_pDevice = new CFX_FxgeDevice; if (flags & FPDF_REVERSE_BYTE_ORDER) ((CFX_FxgeDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)bitmap,0,TRUE); else ((CFX_FxgeDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)bitmap); #endif Func_RenderPage(pContext, page, start_x, start_y, size_x, size_y, rotate, flags,TRUE,NULL); delete pContext; pPage->RemovePrivateData((void*)1); }
DLLEXPORT FPDF_PAGE STDCALL FPDFPage_New(FPDF_DOCUMENT document, int page_index, double width, double height) { CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); if (!pDoc) return nullptr; if (page_index < 0) page_index = 0; if (pDoc->GetPageCount() < page_index) page_index = pDoc->GetPageCount(); CPDF_Dictionary* pPageDict = pDoc->CreateNewPage(page_index); if (!pPageDict) return NULL; CPDF_Array* pMediaBoxArray = new CPDF_Array; pMediaBoxArray->Add(new CPDF_Number(0)); pMediaBoxArray->Add(new CPDF_Number(0)); pMediaBoxArray->Add(new CPDF_Number(FX_FLOAT(width))); pMediaBoxArray->Add(new CPDF_Number(FX_FLOAT(height))); pPageDict->SetAt("MediaBox", pMediaBoxArray); pPageDict->SetAt("Rotate", new CPDF_Number(0)); pPageDict->SetAt("Resources", new CPDF_Dictionary); CPDF_Page* pPage = new CPDF_Page; pPage->Load(pDoc, pPageDict); pPage->ParseContent(); return pPage; }
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; }
FX_BOOL GetContentsRect( CPDF_Document * pDoc, CPDF_Dictionary* pDict, CPDF_RectArray * pRectArray ) { CPDF_Page* pPDFPage = FX_NEW CPDF_Page; pPDFPage->Load( pDoc, pDict, FALSE ); pPDFPage->ParseContent(); FX_POSITION pos = pPDFPage->GetFirstObjectPosition(); while (pos) { CPDF_PageObject* pPageObject = pPDFPage->GetNextObject(pos); if (!pPageObject)continue; CPDF_Rect rc; rc.left = pPageObject->m_Left; rc.right = pPageObject->m_Right; rc.bottom = pPageObject->m_Bottom; rc.top = pPageObject->m_Top; if (IsValiableRect(rc, pDict->GetRect("MediaBox"))) { pRectArray->Add(rc); } } delete pPDFPage; return TRUE; }
void CFFL_InteractiveFormFiller::QueryWherePopup( const CPWL_Wnd::PrivateData* pAttached, float fPopupMin, float fPopupMax, bool* bBottom, float* fPopupRet) { auto* pData = static_cast<const CFFL_PrivateData*>(pAttached); CPDFSDK_Widget* pWidget = pData->pWidget; CPDF_Page* pPage = pWidget->GetPDFPage(); CFX_FloatRect rcPageView(0, pPage->GetPageHeight(), pPage->GetPageWidth(), 0); rcPageView.Normalize(); CFX_FloatRect rcAnnot = pWidget->GetRect(); float fTop = 0.0f; float fBottom = 0.0f; switch (pWidget->GetRotate() / 90) { default: case 0: fTop = rcPageView.top - rcAnnot.top; fBottom = rcAnnot.bottom - rcPageView.bottom; break; case 1: fTop = rcAnnot.left - rcPageView.left; fBottom = rcPageView.right - rcAnnot.right; break; case 2: fTop = rcAnnot.bottom - rcPageView.bottom; fBottom = rcPageView.top - rcAnnot.top; break; case 3: fTop = rcPageView.right - rcAnnot.right; fBottom = rcAnnot.left - rcPageView.left; break; } constexpr float kMaxListBoxHeight = 140; const float fMaxListBoxHeight = pdfium::clamp(kMaxListBoxHeight, fPopupMin, fPopupMax); if (fBottom > fMaxListBoxHeight) { *fPopupRet = fMaxListBoxHeight; *bBottom = true; return; } if (fTop > fMaxListBoxHeight) { *fPopupRet = fMaxListBoxHeight; *bBottom = false; return; } if (fTop > fBottom) { *fPopupRet = fTop; *bBottom = false; } else { *fPopupRet = fBottom; *bBottom = true; } }
DLLEXPORT FPDF_BOOL STDCALL FPDFPage_HasTransparency(FPDF_PAGE page) { if(!page) return FALSE; CPDF_Page* pPage = (CPDF_Page*)page; return pPage->BackgroundAlphaNeeded(); }
DLLEXPORT FPDF_PAGEOBJECT STDCALL FPDFPage_GetObject(FPDF_PAGE page, int index) { CPDF_Page* pPage = CPDFPageFromFPDFPage(page); if (!IsPageObject(pPage)) return nullptr; return pPage->GetPageObjectList()->GetPageObjectByIndex(index); }
bool CFFL_InteractiveFormFiller::IsFillingAllowed(CPDFSDK_Widget* pWidget) { if (pWidget->GetFieldType() == FormFieldType::kPushButton) return false; CPDF_Page* pPage = pWidget->GetPDFPage(); uint32_t dwPermissions = pPage->GetDocument()->GetUserPermissions(); return (dwPermissions & FPDFPERM_FILL_FORM) || (dwPermissions & FPDFPERM_ANNOT_FORM) || (dwPermissions & FPDFPERM_MODIFY); }
DLLEXPORT int STDCALL FPDFPage_CountObject(FPDF_PAGE page) { CPDF_Page* pPage = CPDFPageFromFPDFPage(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(); }
DLLEXPORT FPDF_PAGEOBJECT STDCALL FPDFPage_GetObject(FPDF_PAGE page, int index) { CPDF_Page* pPage = CPDFPageFromFPDFPage(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); }
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(); }
void PDF_GetTextStream_Unicode(CFX_WideTextBuf& buffer, CPDF_Document* pDoc, CPDF_Dictionary* pPage, FX_DWORD flags) { buffer.EstimateSize(0, 10240); CPDF_Page page; page.Load(pDoc, pPage); CPDF_ParseOptions options; options.m_bTextOnly = TRUE; options.m_bSeparateForm = FALSE; page.ParseContent(&options); _PDF_GetTextStream_Unicode(buffer, &page, TRUE, NULL); }
DLLEXPORT void STDCALL FPDF_RenderPage_Close(FPDF_PAGE page) { CPDF_Page* pPage = CPDFPageFromFPDFPage(page); if (!pPage) return; CPDF_PageRenderContext* pContext = pPage->GetRenderContext(); if (!pContext) return; pContext->m_pDevice->RestoreState(false); pPage->SetRenderContext(std::unique_ptr<CPDF_PageRenderContext>()); }
DLLEXPORT void STDCALL FPDF_RenderPage_Close(FPDF_PAGE page) { CPDF_Page* pPage = CPDFPageFromFPDFPage(page); if (!pPage) return; CRenderContext* pContext = (CRenderContext*)pPage->GetPrivateData((void*)1); if (!pContext) return; pContext->m_pDevice->RestoreState(); delete pContext; pPage->RemovePrivateData((void*)1); }
static void nativeSetTransformAndClip(JNIEnv* env, jclass thiz, jlong documentPtr, jint pageIndex, jlong transformPtr, jint clipLeft, jint clipTop, jint clipRight, jint clipBottom) { FPDF_DOCUMENT document = reinterpret_cast<FPDF_DOCUMENT>(documentPtr); CPDF_Page* page = (CPDF_Page*) FPDF_LoadPage(document, pageIndex); if (!page) { jniThrowException(env, "java/lang/IllegalStateException", "cannot open page"); return; } double width = 0; double height = 0; const int result = FPDF_GetPageSizeByIndex(document, pageIndex, &width, &height); if (!result) { jniThrowException(env, "java/lang/IllegalStateException", "cannot get page size"); return; } CFX_AffineMatrix matrix; SkMatrix* skTransform = reinterpret_cast<SkMatrix*>(transformPtr); SkScalar transformValues[6]; if (!skTransform->asAffine(transformValues)) { jniThrowException(env, "java/lang/IllegalArgumentException", "transform matrix has perspective. Only affine matrices are allowed."); return; } // PDF's coordinate system origin is left-bottom while in graphics it // is the top-left. So, translate the PDF coordinates to ours. matrix.Set(1, 0, 0, -1, 0, page->GetPageHeight()); // Apply the transformation what was created in our coordinates. matrix.Concat(transformValues[SkMatrix::kAScaleX], transformValues[SkMatrix::kASkewY], transformValues[SkMatrix::kASkewX], transformValues[SkMatrix::kAScaleY], transformValues[SkMatrix::kATransX], transformValues[SkMatrix::kATransY]); // Translate the result back to PDF coordinates. matrix.Concat(1, 0, 0, -1, 0, page->GetPageHeight()); FS_MATRIX transform = {matrix.a, matrix.b, matrix.c, matrix.d, matrix.e, matrix.f}; FS_RECTF clip = {(float) clipLeft, (float) clipTop, (float) clipRight, (float) clipBottom}; FPDFPage_TransFormWithClip(page, &transform, &clip); FPDF_ClosePage(page); }
DLLEXPORT FPDF_PAGE STDCALL FPDF_LoadPage(FPDF_DOCUMENT document, int page_index) { if (document == NULL) return NULL; if (page_index < 0 || page_index >= FPDF_GetPageCount(document)) return NULL; CPDF_Document* pDoc = (CPDF_Document*)document; if (pDoc == NULL) return NULL; CPDF_Dictionary* pDict = pDoc->GetPage(page_index); if (pDict == NULL) return NULL; CPDF_Page* pPage = new CPDF_Page; pPage->Load(pDoc, pDict); pPage->ParseContent(); return pPage; }
DLLEXPORT void STDCALL FPDF_RenderPage_Close(FPDF_PAGE page) { if (page == NULL) return; CPDF_Page* pPage = (CPDF_Page*)page; // FXMT_CSLOCK_OBJ(&pPage->m_PageLock); CRenderContext * pContext = (CRenderContext*)pPage->GetPrivateData((void*)1); if (pContext) { pContext->m_pDevice->RestoreState(); delete pContext; pPage->RemovePrivateData((void*)1); } }
DLLEXPORT void STDCALL FPDF_PageToDevice(FPDF_PAGE page, int start_x, int start_y, int size_x, int size_y, int rotate, double page_x, double page_y, int* device_x, int* device_y) { if (page == NULL || device_x == NULL || device_y == NULL) return; CPDF_Page* pPage = (CPDF_Page*)page; CPDF_Matrix page2device; pPage->GetDisplayMatrix(page2device, start_x, start_y, size_x, size_y, rotate); FX_FLOAT device_x_f, device_y_f; page2device.Transform(((FX_FLOAT)page_x), ((FX_FLOAT)page_y), device_x_f, device_y_f); *device_x = FXSYS_round(device_x_f); *device_y = FXSYS_round(device_y_f); }
DLLEXPORT int STDCALL FPDF_GetPageSizeByIndex(FPDF_DOCUMENT document, int page_index, double* width, double* height) { CPDF_Document* pDoc = (CPDF_Document*)document; if(pDoc == NULL) return FALSE; CPDF_Dictionary* pDict = pDoc->GetPage(page_index); if (pDict == NULL) return FALSE; CPDF_Page page; page.Load(pDoc, pDict); *width = page.GetPageWidth(); *height = page.GetPageHeight(); return TRUE; }
DLLEXPORT void STDCALL FPDF_DeviceToPage(FPDF_PAGE page, int start_x, int start_y, int size_x, int size_y, int rotate, int device_x, int device_y, double* page_x, double* page_y) { if (page == NULL || page_x == NULL || page_y == NULL) return; CPDF_Page* pPage = (CPDF_Page*)page; CPDF_Matrix page2device; pPage->GetDisplayMatrix(page2device, start_x, start_y, size_x, size_y, rotate); CPDF_Matrix device2page; device2page.SetReverse(page2device); FX_FLOAT page_x_f, page_y_f; device2page.Transform((FX_FLOAT)(device_x), (FX_FLOAT)(device_y), page_x_f, page_y_f); *page_x = (page_x_f); *page_y = (page_y_f); }
DLLEXPORT int STDCALL FPDF_RenderPage_Continue(FPDF_PAGE page, IFSDK_PAUSE* pause) { if (!pause || pause->version != 1) return FPDF_RENDER_FAILED; CPDF_Page* pPage = CPDFPageFromFPDFPage(page); if (!pPage) return FPDF_RENDER_FAILED; CPDF_PageRenderContext* pContext = pPage->GetRenderContext(); if (pContext && pContext->m_pRenderer) { IFSDK_PAUSE_Adapter IPauseAdapter(pause); pContext->m_pRenderer->Continue(&IPauseAdapter); return CPDF_ProgressiveRenderer::ToFPDFStatus( pContext->m_pRenderer->GetStatus()); } return FPDF_RENDER_FAILED; }
FPDF_EXPORT void FPDF_CALLCONV FPDFPage_InsertClipPath(FPDF_PAGE page, FPDF_CLIPPATH clipPath) { CPDF_Page* pPage = CPDFPageFromFPDFPage(page); if (!pPage) return; CPDF_Dictionary* pPageDict = pPage->GetDict(); CPDF_Object* pContentObj = GetPageContent(pPageDict); if (!pContentObj) return; std::ostringstream strClip; CPDF_ClipPath* pClipPath = CPDFClipPathFromFPDFClipPath(clipPath); for (size_t i = 0; i < pClipPath->GetPathCount(); ++i) { CPDF_Path path = pClipPath->GetPath(i); if (path.GetPoints().empty()) { // Empty clipping (totally clipped out) strClip << "0 0 m W n "; } else { OutputPath(strClip, path); if (pClipPath->GetClipType(i) == FXFILL_WINDING) strClip << "W n\n"; else strClip << "W* n\n"; } } CPDF_Document* pDoc = pPage->GetDocument(); if (!pDoc) return; CPDF_Stream* pStream = pDoc->NewIndirect<CPDF_Stream>(nullptr, 0, pDoc->New<CPDF_Dictionary>()); pStream->SetDataFromStringstream(&strClip); if (CPDF_Array* pArray = ToArray(pContentObj)) { pArray->InsertAt(0, pStream->MakeReference(pDoc)); } else if (pContentObj->IsStream() && !pContentObj->IsInline()) { CPDF_Array* pContentArray = pDoc->NewIndirect<CPDF_Array>(); pContentArray->Add(pStream->MakeReference(pDoc)); pContentArray->Add(pContentObj->MakeReference(pDoc)); pPageDict->SetFor(pdfium::page_object::kContents, pContentArray->MakeReference(pDoc)); } }
DLLEXPORT int STDCALL FPDF_RenderPageBitmap_Start(FPDF_BITMAP bitmap, FPDF_PAGE page, int start_x, int start_y, int size_x, int size_y, int rotate, int flags, IFSDK_PAUSE* pause) { if (!bitmap || !pause || pause->version != 1) return FPDF_RENDER_FAILED; CPDF_Page* pPage = CPDFPageFromFPDFPage(page); if (!pPage) return FPDF_RENDER_FAILED; CRenderContext* pContext = new CRenderContext; pPage->SetPrivateData((void*)1, pContext, DropContext); #ifdef _SKIA_SUPPORT_ pContext->m_pDevice = new CFX_SkiaDevice; if (flags & FPDF_REVERSE_BYTE_ORDER) ((CFX_SkiaDevice*)pContext->m_pDevice) ->Attach((CFX_DIBitmap*)bitmap, 0, TRUE); else ((CFX_SkiaDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)bitmap); #else pContext->m_pDevice = new CFX_FxgeDevice; if (flags & FPDF_REVERSE_BYTE_ORDER) ((CFX_FxgeDevice*)pContext->m_pDevice) ->Attach((CFX_DIBitmap*)bitmap, 0, TRUE); else ((CFX_FxgeDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)bitmap); #endif IFSDK_PAUSE_Adapter IPauseAdapter(pause); FPDF_RenderPage_Retail(pContext, page, start_x, start_y, size_x, size_y, rotate, flags, FALSE, &IPauseAdapter); if (pContext->m_pRenderer) return CPDF_ProgressiveRenderer::ToFPDFStatus( pContext->m_pRenderer->GetStatus()); return FPDF_RENDER_FAILED; }
DLLEXPORT void STDCALL FPDFPage_InsertObject(FPDF_PAGE page, FPDF_PAGEOBJECT page_obj) { CPDF_PageObject* pPageObj = reinterpret_cast<CPDF_PageObject*>(page_obj); if (!pPageObj) return; std::unique_ptr<CPDF_PageObject> pPageObjHolder(pPageObj); CPDF_Page* pPage = CPDFPageFromFPDFPage(page); if (!IsPageObject(pPage)) return; pPage->GetPageObjectList()->push_back(std::move(pPageObjHolder)); switch (pPageObj->GetType()) { case CPDF_PageObject::TEXT: { break; } case CPDF_PageObject::PATH: { CPDF_PathObject* pPathObj = pPageObj->AsPath(); pPathObj->CalcBoundingBox(); break; } case CPDF_PageObject::IMAGE: { CPDF_ImageObject* pImageObj = pPageObj->AsImage(); pImageObj->CalcBoundingBox(); break; } case CPDF_PageObject::SHADING: { CPDF_ShadingObject* pShadingObj = pPageObj->AsShading(); pShadingObj->CalcBoundingBox(); break; } case CPDF_PageObject::FORM: { CPDF_FormObject* pFormObj = pPageObj->AsForm(); pFormObj->CalcBoundingBox(); break; } default: { ASSERT(false); break; } } }
void PDF_GetPageText_Unicode(CFX_WideStringArray& lines, CPDF_Document* pDoc, CPDF_Dictionary* pPage, int iMinWidth, FX_DWORD flags) { lines.RemoveAll(); if (pPage == NULL) { return; } CPDF_Page page; page.Load(pDoc, pPage); CPDF_ParseOptions options; options.m_bTextOnly = TRUE; options.m_bSeparateForm = FALSE; page.ParseContent(&options); CFX_FloatRect page_bbox = page.GetPageBBox(); if (flags & PDF2TXT_AUTO_ROTATE) { CheckRotate(page, page_bbox); } CTextPage texts; texts.m_bAutoWidth = flags & PDF2TXT_AUTO_WIDTH; texts.m_bKeepColumn = flags & PDF2TXT_KEEP_COLUMN; texts.m_bBreakSpace = TRUE; FX_POSITION pos = page.GetFirstObjectPosition(); while (pos) { CPDF_PageObject* pObject = page.GetNextObject(pos); if (!(flags & PDF2TXT_INCLUDE_INVISIBLE)) { CFX_FloatRect rect(pObject->m_Left, pObject->m_Bottom, pObject->m_Right, pObject->m_Top); if (!page_bbox.Contains(rect)) { continue; } } texts.ProcessObject(pObject); } texts.WriteOutput(lines, iMinWidth); }
CFX_WideString PDF_GetFirstTextLine_Unicode(CPDF_Document* pDoc, CPDF_Dictionary* pPage) { CFX_WideTextBuf buffer; buffer.EstimateSize(0, 1024); CPDF_Page page; page.Load(pDoc, pPage); CPDF_ParseOptions options; options.m_bTextOnly = TRUE; options.m_bSeparateForm = FALSE; page.ParseContent(&options); CPDF_TextStream textstream(buffer, FALSE, NULL); FX_POSITION pos = page.GetFirstObjectPosition(); while (pos) { CPDF_PageObject* pObject = page.GetNextObject(pos); if (pObject->m_Type != PDFPAGE_TEXT) { continue; } if (textstream.ProcessObject((CPDF_TextObject*)pObject, TRUE)) { break; } } return buffer.GetWideString(); }
DLLEXPORT FPDF_PAGE STDCALL FPDF_LoadPage(FPDF_DOCUMENT document, int page_index) { if (document == NULL) return NULL; if (page_index < 0 || page_index >= FPDF_GetPageCount(document)) return NULL; // CPDF_Parser* pParser = (CPDF_Parser*)document; CPDF_Document* pDoc = (CPDF_Document*)document; if (pDoc == NULL) return NULL; CPDF_Dictionary* pDict = pDoc->GetPage(page_index); if (pDict == NULL) return NULL; CPDF_Page* pPage = FX_NEW CPDF_Page; pPage->Load(pDoc, pDict); try { pPage->ParseContent(); } catch (...) { delete pPage; return NULL; } // CheckUnSupportError(pDoc, 0); return pPage; }
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFLink_Enumerate(FPDF_PAGE page, int* start_pos, FPDF_LINK* link_annot) { if (!start_pos || !link_annot) return false; CPDF_Page* pPage = CPDFPageFromFPDFPage(page); if (!pPage || !pPage->GetDict()) return false; CPDF_Array* pAnnots = pPage->GetDict()->GetArrayFor("Annots"); if (!pAnnots) return false; for (size_t i = *start_pos; i < pAnnots->size(); i++) { CPDF_Dictionary* pDict = ToDictionary(pAnnots->GetDirectObjectAt(i)); if (!pDict) continue; if (pDict->GetStringFor("Subtype") == "Link") { *start_pos = static_cast<int>(i + 1); *link_annot = FPDFLinkFromCPDFDictionary(pDict); return true; } } return false; }