Merge to master: Kill off some dodgy JS callbacks
[pdfium.git] / fpdfsdk / src / fpdftext.cpp
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         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