1e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Copyright 2014 PDFium Authors. All rights reserved. 2e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Use of this source code is governed by a BSD-style license that can be 3e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// found in the LICENSE file. 4e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 5e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 7e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include "../../public/fpdf_text.h" 8e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include "../include/fsdk_define.h" 9e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 10e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#ifdef _WIN32 11e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include <tchar.h> 12e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif 13e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 14e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov // jabdelmalek: commented out to build on Linux. Not used. 15e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov // extern HANDLE g_hModule; 16e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 17e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovDLLEXPORT FPDF_TEXTPAGE STDCALL FPDFText_LoadPage(FPDF_PAGE page) 18e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 19e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!page) return NULL; 20e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov IPDF_TextPage* textpage=NULL; 21e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPDF_ViewerPreferences viewRef(((CPDF_Page*)page)->m_pDocument); 22e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov textpage=IPDF_TextPage::CreateTextPage((CPDF_Page*)page,viewRef.IsDirectionR2L()); 23e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov textpage->ParseTextPage(); 24e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return textpage; 25e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 26e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovDLLEXPORT void STDCALL FPDFText_ClosePage(FPDF_TEXTPAGE text_page) 27e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 28e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (text_page){ 29e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov IPDF_TextPage* textpage=(IPDF_TextPage*)text_page; 30e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov delete textpage; 31e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov text_page=NULL; 32e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 33e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 34e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovDLLEXPORT int STDCALL FPDFText_CountChars(FPDF_TEXTPAGE text_page) 35e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 36e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!text_page) return -1; 37e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov IPDF_TextPage* textpage=(IPDF_TextPage*)text_page; 38e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return textpage->CountChars(); 39e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 40e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovDLLEXPORT unsigned int STDCALL FPDFText_GetUnicode(FPDF_TEXTPAGE text_page, int index) 41e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 42e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!text_page) return -1; 43e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov IPDF_TextPage* textpage=(IPDF_TextPage*)text_page; 44e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 45e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (index<0 || index>=textpage->CountChars()) return 0; 46e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 47e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FPDF_CHAR_INFO charinfo; 48e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov textpage->GetCharInfo(index,charinfo); 49e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return charinfo.m_Unicode; 50e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 51e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovDLLEXPORT double STDCALL FPDFText_GetFontSize(FPDF_TEXTPAGE text_page, int index) 52e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 53e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!text_page) return 0; 54e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov IPDF_TextPage* textpage=(IPDF_TextPage*)text_page; 55e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 56e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (index<0 || index>=textpage->CountChars()) return 0; 57e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 58e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FPDF_CHAR_INFO charinfo; 59e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov textpage->GetCharInfo(index,charinfo); 60e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return charinfo.m_FontSize; 61e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 62e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 63e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovDLLEXPORT void STDCALL FPDFText_GetCharBox(FPDF_TEXTPAGE text_page, int index,double* left, 64e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov double* right, double* bottom, double* top) 65e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 66e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!text_page) return; 67e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov IPDF_TextPage* textpage=(IPDF_TextPage*)text_page; 68e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 69e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (index<0 || index>=textpage->CountChars()) return ; 70e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FPDF_CHAR_INFO charinfo; 71e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov textpage->GetCharInfo(index,charinfo); 72e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *left=charinfo.m_CharBox.left; 73e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *right=charinfo.m_CharBox.right; 74e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *bottom=charinfo.m_CharBox.bottom; 75e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *top=charinfo.m_CharBox.top; 76e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 77e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 78e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov//select 79e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovDLLEXPORT int STDCALL FPDFText_GetCharIndexAtPos(FPDF_TEXTPAGE text_page,double x,double y,double xTorelance,double yTorelance) 80e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 81e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!text_page) return -3; 82e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov IPDF_TextPage* textpage=(IPDF_TextPage*)text_page; 83e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return textpage->GetIndexAtPos((FX_FLOAT)x,(FX_FLOAT)y,(FX_FLOAT)xTorelance,(FX_FLOAT)yTorelance); 84e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 85e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 86e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovDLLEXPORT int STDCALL FPDFText_GetText(FPDF_TEXTPAGE text_page,int start,int count,unsigned short* result) 87e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 88e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!text_page) return 0; 89e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov IPDF_TextPage* textpage=(IPDF_TextPage*)text_page; 90e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 91e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (start>=textpage->CountChars()) return 0; 92e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 93e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CFX_WideString str=textpage->GetPageText(start,count); 94e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if(str.GetLength()>count) 95e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov str = str.Left(count); 96e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 97e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CFX_ByteString cbUTF16str = str.UTF16LE_Encode(); 98e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FXSYS_memcpy(result,cbUTF16str.GetBuffer(cbUTF16str.GetLength()),cbUTF16str.GetLength()); 99e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cbUTF16str.ReleaseBuffer(cbUTF16str.GetLength()); 100e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 101e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return cbUTF16str.GetLength()/sizeof(unsigned short); 102e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 103e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 104e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovDLLEXPORT int STDCALL FPDFText_CountRects(FPDF_TEXTPAGE text_page,int start,int count) 105e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 106e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!text_page) return 0; 107e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov IPDF_TextPage* textpage=(IPDF_TextPage*)text_page; 108e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return textpage->CountRects(start,count); 109e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 110e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 111e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovDLLEXPORT void STDCALL FPDFText_GetRect(FPDF_TEXTPAGE text_page,int rect_index, double* left,double* top, 112e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov double* right, double* bottom) 113e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 114e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!text_page) return; 115e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov IPDF_TextPage* textpage=(IPDF_TextPage*)text_page; 116e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CFX_FloatRect rect; 117e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov textpage->GetRect(rect_index,rect.left,rect.top,rect.right,rect.bottom); 118e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *left=rect.left; 119e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *top=rect.top; 120e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *right=rect.right; 121e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *bottom=rect.bottom; 122e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 123e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 124e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovDLLEXPORT int STDCALL FPDFText_GetBoundedText(FPDF_TEXTPAGE text_page,double left, double top, 125e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov double right, double bottom,unsigned short* buffer,int buflen) 126e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 127e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!text_page) return 0; 128e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov IPDF_TextPage* textpage=(IPDF_TextPage*)text_page; 129e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CFX_FloatRect rect((FX_FLOAT)left,(FX_FLOAT)bottom,(FX_FLOAT)right,(FX_FLOAT)top); 130e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CFX_WideString str=textpage->GetTextByRect(rect); 131e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 132e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (buflen<=0 || buffer==NULL) 133e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 134e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return str.GetLength(); 135e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 136e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 137e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CFX_ByteString cbUTF16Str = str.UTF16LE_Encode(); 138e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov int len = cbUTF16Str.GetLength()/sizeof(unsigned short); 139e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov int size = buflen > len ? len : buflen; 140e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FXSYS_memcpy(buffer,cbUTF16Str.GetBuffer(size*sizeof(unsigned short)),size*sizeof(unsigned short)); 141e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cbUTF16Str.ReleaseBuffer(size*sizeof(unsigned short)); 142e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 143e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return size; 144e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 145e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 146e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 147e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov//Search 148e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov//-1 for end 149e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovDLLEXPORT FPDF_SCHHANDLE STDCALL FPDFText_FindStart(FPDF_TEXTPAGE text_page,FPDF_WIDESTRING findwhat,unsigned long flags,int start_index) 150e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 151e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!text_page) return NULL; 152e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov IPDF_TextPageFind* textpageFind=NULL; 153e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov textpageFind=IPDF_TextPageFind::CreatePageFind((IPDF_TextPage*)text_page); 154e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_STRSIZE len = CFX_WideString::WStringLength(findwhat); 155e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov textpageFind->FindFirst(CFX_WideString::FromUTF16LE(findwhat, len),flags,start_index); 156e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return textpageFind; 157e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 158e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovDLLEXPORT FPDF_BOOL STDCALL FPDFText_FindNext(FPDF_SCHHANDLE handle) 159e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 160e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!handle) return FALSE; 161e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov IPDF_TextPageFind* textpageFind=(IPDF_TextPageFind*)handle; 162e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return textpageFind->FindNext(); 163e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 164e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovDLLEXPORT FPDF_BOOL STDCALL FPDFText_FindPrev(FPDF_SCHHANDLE handle) 165e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 166e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!handle) return FALSE; 167e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov IPDF_TextPageFind* textpageFind=(IPDF_TextPageFind*)handle; 168e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return textpageFind->FindPrev(); 169e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 170e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovDLLEXPORT int STDCALL FPDFText_GetSchResultIndex(FPDF_SCHHANDLE handle) 171e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 172e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!handle) return 0; 173e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov IPDF_TextPageFind* textpageFind=(IPDF_TextPageFind*)handle; 174e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return textpageFind->GetCurOrder(); 175e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 176e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovDLLEXPORT int STDCALL FPDFText_GetSchCount(FPDF_SCHHANDLE handle) 177e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 178e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!handle) return 0; 179e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov IPDF_TextPageFind* textpageFind=(IPDF_TextPageFind*)handle; 180e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return textpageFind->GetMatchedCount(); 181e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 182e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovDLLEXPORT void STDCALL FPDFText_FindClose(FPDF_SCHHANDLE handle) 183e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 184e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!handle) return; 185e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov IPDF_TextPageFind* textpageFind=(IPDF_TextPageFind*)handle; 186e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov delete textpageFind; 187e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov handle=NULL; 188e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 189e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 190e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov//web link 191e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovDLLEXPORT FPDF_PAGELINK STDCALL FPDFLink_LoadWebLinks(FPDF_TEXTPAGE text_page) 192e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 193e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!text_page) return NULL; 194e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov IPDF_LinkExtract* pageLink=NULL; 195e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pageLink=IPDF_LinkExtract::CreateLinkExtract(); 196e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pageLink->ExtractLinks((IPDF_TextPage*)text_page); 197e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return pageLink; 198e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 199e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovDLLEXPORT int STDCALL FPDFLink_CountWebLinks(FPDF_PAGELINK link_page) 200e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 201e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!link_page) return 0; 202e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov IPDF_LinkExtract* pageLink=(IPDF_LinkExtract*)link_page; 203e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return pageLink->CountLinks(); 204e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 205e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovDLLEXPORT int STDCALL FPDFLink_GetURL(FPDF_PAGELINK link_page,int link_index, unsigned short* buffer,int buflen) 206e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 207e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!link_page) return 0; 208e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov IPDF_LinkExtract* pageLink=(IPDF_LinkExtract*)link_page; 209e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CFX_WideString url=pageLink->GetURL(link_index); 210e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 211e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CFX_ByteString cbUTF16URL = url.UTF16LE_Encode(); 212e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov int len= cbUTF16URL.GetLength()/sizeof(unsigned short); 213e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (buffer==NULL || buflen<=0) 214e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return len; 215e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov int size=len<buflen ? len :buflen; 216e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (size>0) 217e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 218e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FXSYS_memcpy(buffer,cbUTF16URL.GetBuffer(size*sizeof(unsigned short)),size*sizeof(unsigned short)); 219e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cbUTF16URL.ReleaseBuffer(size*sizeof(unsigned short)); 220e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 221e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return size; 222e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 223e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovDLLEXPORT int STDCALL FPDFLink_CountRects(FPDF_PAGELINK link_page,int link_index) 224e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 225e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!link_page) return 0; 226e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov IPDF_LinkExtract* pageLink=(IPDF_LinkExtract*)link_page; 227e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CFX_RectArray rectArray; 228e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pageLink->GetRects(link_index,rectArray); 229e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return rectArray.GetSize(); 230e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 231e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovDLLEXPORT void STDCALL FPDFLink_GetRect(FPDF_PAGELINK link_page,int link_index, int rect_index, double* left, 232e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov double* top,double* right, double* bottom) 233e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 234e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!link_page) return; 235e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov IPDF_LinkExtract* pageLink=(IPDF_LinkExtract*)link_page; 236e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CFX_RectArray rectArray; 237e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pageLink->GetRects(link_index,rectArray); 238e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (rect_index >= 0 && rect_index < rectArray.GetSize()) { 239e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CFX_FloatRect rect=rectArray.GetAt(rect_index); 240e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *left=rect.left; 241e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *right=rect.right; 242e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *top=rect.top; 243e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *bottom=rect.bottom; 244e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 245e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 246e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovDLLEXPORT void STDCALL FPDFLink_CloseWebLinks(FPDF_PAGELINK link_page) 247e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 248e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!link_page) return; 249e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov IPDF_LinkExtract* pageLink=(IPDF_LinkExtract*)link_page; 250e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov delete pageLink; 251e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pageLink =NULL; 252e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 253e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 254