summaryrefslogtreecommitdiff
path: root/fpdfsdk/src/fpdftext.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'fpdfsdk/src/fpdftext.cpp')
-rw-r--r--fpdfsdk/src/fpdftext.cpp278
1 files changed, 278 insertions, 0 deletions
diff --git a/fpdfsdk/src/fpdftext.cpp b/fpdfsdk/src/fpdftext.cpp
new file mode 100644
index 0000000000..6042fcc7b1
--- /dev/null
+++ b/fpdfsdk/src/fpdftext.cpp
@@ -0,0 +1,278 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../include/fsdk_define.h"
+#include "../include/fpdftext.h"
+
+#ifdef _WIN32
+#include <tchar.h>
+#endif
+
+ // jabdelmalek: commented out to build on Linux. Not used.
+ // extern HANDLE g_hModule;
+
+DLLEXPORT FPDF_TEXTPAGE STDCALL FPDFText_LoadPage(FPDF_PAGE page)
+{
+ if (!page) return NULL;
+ IPDF_TextPage* textpage=NULL;
+ try
+ {
+ CPDF_ViewerPreferences viewRef(((CPDF_Page*)page)->m_pDocument);
+ textpage=IPDF_TextPage::CreateTextPage((CPDF_Page*)page,viewRef.IsDirectionR2L());
+ textpage->ParseTextPage();
+ }
+ catch (...)
+ {
+ if (textpage)
+ delete textpage;
+ return NULL;
+ }
+ return textpage;
+}
+DLLEXPORT void STDCALL FPDFText_ClosePage(FPDF_TEXTPAGE text_page)
+{
+ if (text_page){
+ IPDF_TextPage* textpage=(IPDF_TextPage*)text_page;
+ delete textpage;
+ text_page=NULL;
+ }
+}
+DLLEXPORT int STDCALL FPDFText_CountChars(FPDF_TEXTPAGE text_page)
+{
+ if (!text_page) return -1;
+ IPDF_TextPage* textpage=(IPDF_TextPage*)text_page;
+ return textpage->CountChars();
+}
+DLLEXPORT unsigned int STDCALL FPDFText_GetUnicode(FPDF_TEXTPAGE text_page, int index)
+{
+ if (!text_page) return -1;
+ IPDF_TextPage* textpage=(IPDF_TextPage*)text_page;
+
+ if (index<0 || index>=textpage->CountChars()) return 0;
+
+ FPDF_CHAR_INFO charinfo;
+ textpage->GetCharInfo(index,charinfo);
+ return charinfo.m_Unicode;
+}
+DLLEXPORT double STDCALL FPDFText_GetFontSize(FPDF_TEXTPAGE text_page, int index)
+{
+ if (!text_page) return 0;
+ IPDF_TextPage* textpage=(IPDF_TextPage*)text_page;
+
+ if (index<0 || index>=textpage->CountChars()) return 0;
+
+ FPDF_CHAR_INFO charinfo;
+ textpage->GetCharInfo(index,charinfo);
+ return charinfo.m_FontSize;
+}
+
+DLLEXPORT void STDCALL FPDFText_GetCharBox(FPDF_TEXTPAGE text_page, int index,double* left,
+ double* right, double* bottom, double* top)
+{
+ if (!text_page) return;
+ IPDF_TextPage* textpage=(IPDF_TextPage*)text_page;
+
+ if (index<0 || index>=textpage->CountChars()) return ;
+ FPDF_CHAR_INFO charinfo;
+ textpage->GetCharInfo(index,charinfo);
+ *left=charinfo.m_CharBox.left;
+ *right=charinfo.m_CharBox.right;
+ *bottom=charinfo.m_CharBox.bottom;
+ *top=charinfo.m_CharBox.top;
+}
+
+//select
+DLLEXPORT int STDCALL FPDFText_GetCharIndexAtPos(FPDF_TEXTPAGE text_page,double x,double y,double xTorelance,double yTorelance)
+{
+ if (!text_page) return -3;
+ IPDF_TextPage* textpage=(IPDF_TextPage*)text_page;
+ return textpage->GetIndexAtPos((FX_FLOAT)x,(FX_FLOAT)y,(FX_FLOAT)xTorelance,(FX_FLOAT)yTorelance);
+}
+
+DLLEXPORT int STDCALL FPDFText_GetText(FPDF_TEXTPAGE text_page,int start,int count,unsigned short* result)
+{
+ if (!text_page) return 0;
+ IPDF_TextPage* textpage=(IPDF_TextPage*)text_page;
+
+ if (start>=textpage->CountChars()) return 0;
+
+ CFX_WideString str=textpage->GetPageText(start,count);
+ if(str.GetLength()>count)
+ str = str.Left(count);
+
+ CFX_ByteString cbUTF16str = str.UTF16LE_Encode();
+ FXSYS_memcpy(result,cbUTF16str.GetBuffer(cbUTF16str.GetLength()),cbUTF16str.GetLength());
+ cbUTF16str.ReleaseBuffer(cbUTF16str.GetLength());
+
+ return cbUTF16str.GetLength()/sizeof(unsigned short);
+}
+
+DLLEXPORT int STDCALL FPDFText_CountRects(FPDF_TEXTPAGE text_page,int start,int count)
+{
+ if (!text_page) return 0;
+ IPDF_TextPage* textpage=(IPDF_TextPage*)text_page;
+ return textpage->CountRects(start,count);
+
+}
+DLLEXPORT void STDCALL FPDFText_GetRect(FPDF_TEXTPAGE text_page,int rect_index, double* left,double* top,
+ double* right, double* bottom)
+{
+ if (!text_page) return;
+ IPDF_TextPage* textpage=(IPDF_TextPage*)text_page;
+ CFX_FloatRect rect;
+ textpage->GetRect(rect_index,rect.left,rect.top,rect.right,rect.bottom);
+ *left=rect.left;
+ *top=rect.top;
+ *right=rect.right;
+ *bottom=rect.bottom;
+}
+
+DLLEXPORT int STDCALL FPDFText_GetBoundedText(FPDF_TEXTPAGE text_page,double left, double top,
+ double right, double bottom,unsigned short* buffer,int buflen)
+{
+ if (!text_page) return 0;
+ IPDF_TextPage* textpage=(IPDF_TextPage*)text_page;
+ CFX_FloatRect rect((FX_FLOAT)left,(FX_FLOAT)bottom,(FX_FLOAT)right,(FX_FLOAT)top);
+ CFX_WideString str=textpage->GetTextByRect(rect);
+
+ if (buflen<=0 || buffer==NULL)
+ {
+ return str.GetLength();
+ }
+
+ CFX_ByteString cbUTF16Str = str.UTF16LE_Encode();
+ int len = cbUTF16Str.GetLength()/sizeof(unsigned short);
+ int size = buflen > len ? len : buflen;
+ FXSYS_memcpy(buffer,cbUTF16Str.GetBuffer(size*sizeof(unsigned short)),size*sizeof(unsigned short));
+ cbUTF16Str.ReleaseBuffer(size*sizeof(unsigned short));
+
+ return size;
+
+}
+
+//Search
+//-1 for end
+DLLEXPORT FPDF_SCHHANDLE STDCALL FPDFText_FindStart(FPDF_TEXTPAGE text_page,FPDF_WIDESTRING findwhat,unsigned long flags,int start_index)
+{
+ if (!text_page) return NULL;
+ IPDF_TextPageFind* textpageFind=NULL;
+ try
+ {
+ textpageFind=IPDF_TextPageFind::CreatePageFind((IPDF_TextPage*)text_page);
+ textpageFind->FindFirst(CFX_WideString::FromUTF16LE(findwhat),flags,start_index);
+ }
+ catch (...)
+ {
+ if (textpageFind)
+ delete textpageFind;
+ return NULL;
+ }
+ return textpageFind;
+}
+DLLEXPORT FPDF_BOOL STDCALL FPDFText_FindNext(FPDF_SCHHANDLE handle)
+{
+ if (!handle) return FALSE;
+ IPDF_TextPageFind* textpageFind=(IPDF_TextPageFind*)handle;
+ return textpageFind->FindNext();
+}
+DLLEXPORT FPDF_BOOL STDCALL FPDFText_FindPrev(FPDF_SCHHANDLE handle)
+{
+ if (!handle) return FALSE;
+ IPDF_TextPageFind* textpageFind=(IPDF_TextPageFind*)handle;
+ return textpageFind->FindPrev();
+}
+DLLEXPORT int STDCALL FPDFText_GetSchResultIndex(FPDF_SCHHANDLE handle)
+{
+ if (!handle) return 0;
+ IPDF_TextPageFind* textpageFind=(IPDF_TextPageFind*)handle;
+ return textpageFind->GetCurOrder();
+}
+DLLEXPORT int STDCALL FPDFText_GetSchCount(FPDF_SCHHANDLE handle)
+{
+ if (!handle) return 0;
+ IPDF_TextPageFind* textpageFind=(IPDF_TextPageFind*)handle;
+ return textpageFind->GetMatchedCount();
+}
+DLLEXPORT void STDCALL FPDFText_FindClose(FPDF_SCHHANDLE handle)
+{
+ if (!handle) return;
+ IPDF_TextPageFind* textpageFind=(IPDF_TextPageFind*)handle;
+ delete textpageFind;
+ handle=NULL;
+}
+
+//web link
+DLLEXPORT FPDF_PAGELINK STDCALL FPDFLink_LoadWebLinks(FPDF_TEXTPAGE text_page)
+{
+ if (!text_page) return NULL;
+ IPDF_LinkExtract* pageLink=NULL;
+ try
+ {
+ pageLink=IPDF_LinkExtract::CreateLinkExtract();
+ pageLink->ExtractLinks((IPDF_TextPage*)text_page);
+ }
+ catch (...)
+ {
+ if (pageLink)
+ delete pageLink;
+ return NULL;
+ }
+ return pageLink;
+}
+DLLEXPORT int STDCALL FPDFLink_CountWebLinks(FPDF_PAGELINK link_page)
+{
+ if (!link_page) return 0;
+ IPDF_LinkExtract* pageLink=(IPDF_LinkExtract*)link_page;
+ return pageLink->CountLinks();
+}
+DLLEXPORT int STDCALL FPDFLink_GetURL(FPDF_PAGELINK link_page,int link_index, unsigned short* buffer,int buflen)
+{
+ if (!link_page) return 0;
+ IPDF_LinkExtract* pageLink=(IPDF_LinkExtract*)link_page;
+ CFX_WideString url=pageLink->GetURL(link_index);
+
+ CFX_ByteString cbUTF16URL = url.UTF16LE_Encode();
+ int len= cbUTF16URL.GetLength()/sizeof(unsigned short);
+ if (buffer==NULL || buflen<=0)
+ return len;
+ int size=len<buflen ? len :buflen;
+ if (size>0)
+ {
+ FXSYS_memcpy(buffer,cbUTF16URL.GetBuffer(size*sizeof(unsigned short)),size*sizeof(unsigned short));
+ cbUTF16URL.ReleaseBuffer(size*sizeof(unsigned short));
+ }
+ return size;
+}
+DLLEXPORT int STDCALL FPDFLink_CountRects(FPDF_PAGELINK link_page,int link_index)
+{
+ if (!link_page) return 0;
+ IPDF_LinkExtract* pageLink=(IPDF_LinkExtract*)link_page;
+ CFX_RectArray rectArray;
+ pageLink->GetRects(link_index,rectArray);
+ return rectArray.GetSize();
+}
+DLLEXPORT void STDCALL FPDFLink_GetRect(FPDF_PAGELINK link_page,int link_index, int rect_index, double* left,
+ double* top,double* right, double* bottom)
+{
+ if (!link_page) return;
+ IPDF_LinkExtract* pageLink=(IPDF_LinkExtract*)link_page;
+ CFX_RectArray rectArray;
+ pageLink->GetRects(link_index,rectArray);
+ CFX_FloatRect rect;
+ rect=rectArray.GetAt(rect_index);
+ *left=rect.left;
+ *right=rect.right;
+ *top=rect.top;
+ *bottom=rect.bottom;
+}
+DLLEXPORT void STDCALL FPDFLink_CloseWebLinks(FPDF_PAGELINK link_page)
+{
+ if (!link_page) return;
+ IPDF_LinkExtract* pageLink=(IPDF_LinkExtract*)link_page;
+ delete pageLink;
+ pageLink =NULL;
+}
+