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