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