7#include "public/fpdf_text.h"
13#include "build/build_config.h"
14#include "core/fpdfapi/font/cpdf_font.h"
15#include "core/fpdfapi/page/cpdf_page.h"
16#include "core/fpdfapi/page/cpdf_textobject.h"
17#include "core/fpdfdoc/cpdf_viewerpreferences.h"
18#include "core/fpdftext/cpdf_linkextract.h"
19#include "core/fpdftext/cpdf_textpage.h"
20#include "core/fpdftext/cpdf_textpagefind.h"
21#include "core/fxcrt/stl_util.h"
22#include "fpdfsdk/cpdfsdk_helpers.h"
23#include "third_party/base/check_op.h"
24#include "third_party/base/numerics/safe_conversions.h"
28constexpr size_t kBytesPerCharacter =
sizeof(
unsigned short);
30CPDF_TextPage* GetTextPageForValidIndex(FPDF_TEXTPAGE text_page,
int index) {
31 if (!text_page || index < 0)
35 return static_cast<size_t>(index) < textpage->size() ? textpage :
nullptr;
50 return FPDFTextPageFromCPDFTextPage(textpage.release());
55 std::unique_ptr<CPDF_TextPage> textpage_deleter(
56 CPDFTextPageFromFPDFTextPage(text_page));
66 CPDF_TextPage* textpage = GetTextPageForValidIndex(text_page, index);
76 CPDF_TextPage* textpage = GetTextPageForValidIndex(text_page, index);
86 CPDF_TextPage* textpage = GetTextPageForValidIndex(text_page, index);
97 CPDF_TextPage* textpage = GetTextPageForValidIndex(text_page, index);
107 CPDF_TextPage* textpage = GetTextPageForValidIndex(text_page, index);
111 return textpage->GetCharFontSize(index);
118 unsigned long buflen,
120 CPDF_TextPage* textpage = GetTextPageForValidIndex(text_page, index);
125 if (!charinfo.m_pTextObj)
130 *flags = font->GetFontFlags();
132 ByteString basefont = font->GetBaseFontName();
133 const unsigned long length =
134 pdfium::base::checked_cast<
unsigned long>(basefont.GetLength() + 1);
135 if (buffer && buflen >= length)
136 memcpy(buffer, basefont
.c_str(), length);
143 CPDF_TextPage* textpage = GetTextPageForValidIndex(text_page, index);
148 if (!charinfo.m_pTextObj)
151 return charinfo.m_pTextObj->GetFont()->GetFontWeight();
156 CPDF_TextPage* textpage = GetTextPageForValidIndex(text_page, index);
158 return FPDF_TEXTRENDERMODE_UNKNOWN;
161 if (!charinfo.m_pTextObj)
162 return FPDF_TEXTRENDERMODE_UNKNOWN;
164 return static_cast<FPDF_TEXT_RENDERMODE>(
165 charinfo.m_pTextObj->GetTextRenderMode());
175 CPDF_TextPage* textpage = GetTextPageForValidIndex(text_page, index);
176 if (!textpage || !R || !G || !B || !A)
180 if (!charinfo.m_pTextObj)
183 FX_COLORREF fill_color = charinfo.m_pTextObj->color_state().GetFillColorRef();
187 *A = FXSYS_GetUnsignedAlpha(
188 charinfo.m_pTextObj->general_state().GetFillAlpha());
199 CPDF_TextPage* textpage = GetTextPageForValidIndex(text_page, index);
200 if (!textpage || !R || !G || !B || !A)
204 if (!charinfo.m_pTextObj)
207 FX_COLORREF stroke_color =
208 charinfo.m_pTextObj->color_state().GetStrokeColorRef();
212 *A = FXSYS_GetUnsignedAlpha(
213 charinfo.m_pTextObj->general_state().GetStrokeAlpha());
219 CPDF_TextPage* textpage = GetTextPageForValidIndex(text_page, index);
243 if (!left || !right || !bottom || !top)
246 CPDF_TextPage* textpage = GetTextPageForValidIndex(text_page, index);
263 CPDF_TextPage* textpage = GetTextPageForValidIndex(text_page, index);
267 *rect = FSRectFFromCFXFloatRect(textpage->GetCharLooseBounds(index));
277 CPDF_TextPage* textpage = GetTextPageForValidIndex(text_page, index);
291 CPDF_TextPage* textpage = GetTextPageForValidIndex(text_page, index);
296 *x = charinfo.m_Origin.x;
297 *y = charinfo.m_Origin.y;
312 CFX_PointF(
static_cast<
float>(x),
static_cast<
float>(y))
,
313 CFX_SizeF(
static_cast<
float>(xTolerance),
314 static_cast<
float>(yTolerance))
);
320 unsigned short* result) {
322 if (!textpage || start_index < 0 || char_count < 0 || !result)
326 if (char_available <= 0)
329 char_count =
std::min(char_count, char_available);
330 if (char_count == 0) {
338 if (str.GetLength() >
static_cast<size_t>(char_count))
339 str = str.First(
static_cast<size_t>(char_count));
342 size_t byte_str_len = byte_str.GetLength();
343 size_t ret_count = byte_str_len / kBytesPerCharacter;
346 DCHECK_LE(ret_count,
static_cast<size_t>(char_count) + 1);
348 memcpy(result, byte_str
.c_str(), byte_str_len);
349 return pdfium::base::checked_cast<
int>(ret_count);
384 unsigned short* buffer,
393 if (buflen <= 0 || !buffer)
394 return pdfium::base::checked_cast<
int>(str.GetLength());
397 int len = pdfium::base::checked_cast<
int>(cbUTF16Str.GetLength()) /
398 sizeof(
unsigned short);
399 int size = buflen > len ? len : buflen;
400 memcpy(buffer, cbUTF16Str
.c_str(), size *
sizeof(
unsigned short));
401 cbUTF16Str.ReleaseBuffer(size *
sizeof(
unsigned short));
407 FPDF_WIDESTRING findwhat,
418 auto find = CPDF_TextPageFind::Create(
419 textpage, WideStringFromFPDFWideString(findwhat), options,
420 start_index >= 0 ? absl::optional<size_t>(start_index) : absl::nullopt);
423 return FPDFSchHandleFromCPDFTextPageFind(find.release());
464 std::unique_ptr<CPDF_TextPageFind> textpageFind(
465 CPDFTextPageFindFromFPDFSchHandle(handle));
476 pagelink->ExtractLinks();
479 return FPDFPageLinkFromCPDFLinkExtract(pagelink.release());
487 return pdfium::base::checked_cast<
int>(pageLink->CountLinks());
492 unsigned short* buffer,
494 WideString wsUrl
(L""
);
495 if (link_page && link_index >= 0) {
497 wsUrl = pageLink->GetURL(link_index);
500 int required = pdfium::base::checked_cast<
int>(cbUTF16URL.GetLength() /
501 sizeof(
unsigned short));
502 if (!buffer || buflen <= 0)
505 int size =
std::min(required, buflen);
507 int buf_size = size *
sizeof(
unsigned short);
508 memcpy(buffer, cbUTF16URL
.c_str(), buf_size);
515 if (!link_page || link_index < 0)
519 return fxcrt::CollectionSize<
int>(pageLink->GetRects(link_index));
529 if (!link_page || link_index < 0 || rect_index < 0)
533 std::vector<CFX_FloatRect> rectArray = pageLink->GetRects(link_index);
534 if (rect_index >=
fxcrt::CollectionSize<
int>(rectArray))
537 *left = rectArray[rect_index].left;
538 *right = rectArray[rect_index].right;
539 *top = rectArray[rect_index].top;
540 *bottom = rectArray[rect_index].bottom;
547 int* start_char_index,
549 if (!link_page || link_index < 0)
553 auto maybe_range = page_link->GetTextRange(link_index);
554 if (!maybe_range.has_value())
558 pdfium::base::checked_cast<
int>(maybe_range.value().m_Start);
559 *char_count = pdfium::base::checked_cast<
int>(maybe_range.value().m_Count);
constexpr CFX_FloatRect(float l, float b, float r, float t)
CPDF_Document * GetDocument() const override
int GetMatchedCount() const
bool GetRect(int rectIndex, CFX_FloatRect *pRect) const
WideString GetTextByRect(const CFX_FloatRect &rect) const
int GetIndexAtPos(const CFX_PointF &point, const CFX_SizeF &tolerance) const
int CountRects(int start, int nCount)
WideString GetPageText(int start, int count) const
bool IsDirectionR2L() const
CPDF_ViewerPreferences(const CPDF_Document *pDoc)
const char * c_str() const
WideString(const wchar_t *ptr)
ByteString ToUTF16LE() const
CPDF_TextPageFind * CPDFTextPageFindFromFPDFSchHandle(FPDF_SCHHANDLE handle)
CPDF_TextPage * CPDFTextPageFromFPDFTextPage(FPDF_TEXTPAGE page)
FS_MATRIX FSMatrixFromCFXMatrix(const CFX_Matrix &matrix)
CPDF_Page * CPDFPageFromFPDFPage(FPDF_PAGE page)
CPDF_LinkExtract * CPDFLinkExtractFromFPDFPageLink(FPDF_PAGELINK link)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFText_GetStrokeColor(FPDF_TEXTPAGE text_page, int index, unsigned int *R, unsigned int *G, unsigned int *B, unsigned int *A)
FPDF_EXPORT int FPDF_CALLCONV FPDFText_GetSchResultIndex(FPDF_SCHHANDLE handle)
FPDF_EXPORT int FPDF_CALLCONV FPDFLink_GetURL(FPDF_PAGELINK link_page, int link_index, unsigned short *buffer, int buflen)
FPDF_EXPORT int FPDF_CALLCONV FPDFText_GetText(FPDF_TEXTPAGE page, int start_index, int char_count, unsigned short *result)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFLink_GetTextRange(FPDF_PAGELINK link_page, int link_index, int *start_char_index, int *char_count)
FPDF_EXPORT int FPDF_CALLCONV FPDFText_IsGenerated(FPDF_TEXTPAGE text_page, int index)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFText_GetCharOrigin(FPDF_TEXTPAGE text_page, int index, double *x, double *y)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFText_GetFillColor(FPDF_TEXTPAGE text_page, int index, unsigned int *R, unsigned int *G, unsigned int *B, unsigned int *A)
FPDF_EXPORT int FPDF_CALLCONV FPDFText_IsHyphen(FPDF_TEXTPAGE text_page, int index)
FPDF_EXPORT int FPDF_CALLCONV FPDFText_GetCharIndexAtPos(FPDF_TEXTPAGE text_page, double x, double y, double xTolerance, double yTolerance)
FPDF_EXPORT void FPDF_CALLCONV FPDFLink_CloseWebLinks(FPDF_PAGELINK link_page)
FPDF_EXPORT float FPDF_CALLCONV FPDFText_GetCharAngle(FPDF_TEXTPAGE text_page, int index)
FPDF_EXPORT int FPDF_CALLCONV FPDFText_HasUnicodeMapError(FPDF_TEXTPAGE text_page, int index)
FPDF_EXPORT int FPDF_CALLCONV FPDFText_GetBoundedText(FPDF_TEXTPAGE text_page, double left, double top, double right, double bottom, unsigned short *buffer, int buflen)
FPDF_EXPORT int FPDF_CALLCONV FPDFLink_CountRects(FPDF_PAGELINK link_page, int link_index)
FPDF_EXPORT int FPDF_CALLCONV FPDFText_GetFontWeight(FPDF_TEXTPAGE text_page, int index)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFText_GetLooseCharBox(FPDF_TEXTPAGE text_page, int index, FS_RECTF *rect)
FPDF_EXPORT double FPDF_CALLCONV FPDFText_GetFontSize(FPDF_TEXTPAGE text_page, int index)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFText_GetCharBox(FPDF_TEXTPAGE text_page, int index, double *left, double *right, double *bottom, double *top)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFLink_GetRect(FPDF_PAGELINK link_page, int link_index, int rect_index, double *left, double *top, double *right, double *bottom)
FPDF_EXPORT void FPDF_CALLCONV FPDFText_FindClose(FPDF_SCHHANDLE handle)
FPDF_EXPORT FPDF_TEXT_RENDERMODE FPDF_CALLCONV FPDFText_GetTextRenderMode(FPDF_TEXTPAGE text_page, int index)
FPDF_EXPORT int FPDF_CALLCONV FPDFText_CountRects(FPDF_TEXTPAGE text_page, int start, int count)
FPDF_EXPORT int FPDF_CALLCONV FPDFText_CountChars(FPDF_TEXTPAGE text_page)
FPDF_EXPORT FPDF_TEXTPAGE FPDF_CALLCONV FPDFText_LoadPage(FPDF_PAGE page)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFText_FindPrev(FPDF_SCHHANDLE handle)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFText_GetMatrix(FPDF_TEXTPAGE text_page, int index, FS_MATRIX *matrix)
FPDF_EXPORT void FPDF_CALLCONV FPDFText_ClosePage(FPDF_TEXTPAGE text_page)
FPDF_EXPORT FPDF_PAGELINK FPDF_CALLCONV FPDFLink_LoadWebLinks(FPDF_TEXTPAGE text_page)
FPDF_EXPORT unsigned long FPDF_CALLCONV FPDFText_GetFontInfo(FPDF_TEXTPAGE text_page, int index, void *buffer, unsigned long buflen, int *flags)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFText_GetRect(FPDF_TEXTPAGE text_page, int rect_index, double *left, double *top, double *right, double *bottom)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFText_FindNext(FPDF_SCHHANDLE handle)
FPDF_EXPORT FPDF_SCHHANDLE FPDF_CALLCONV FPDFText_FindStart(FPDF_TEXTPAGE text_page, FPDF_WIDESTRING findwhat, unsigned long flags, int start_index)
FPDF_EXPORT unsigned int FPDF_CALLCONV FPDFText_GetUnicode(FPDF_TEXTPAGE text_page, int index)
FPDF_EXPORT int FPDF_CALLCONV FPDFText_GetSchCount(FPDF_SCHHANDLE handle)
FPDF_EXPORT int FPDF_CALLCONV FPDFLink_CountWebLinks(FPDF_PAGELINK link_page)
#define FPDF_MATCHWHOLEWORD
constexpr uint8_t FXSYS_GetRValue(uint32_t bgr)
constexpr uint8_t FXSYS_GetGValue(uint32_t bgr)
constexpr uint8_t FXSYS_GetBValue(uint32_t bgr)