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