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