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