UNPKG

@compdfkit_pdf_sdk/react_native

Version:

ComPDFKit for React Native is a comprehensive SDK that allows you to quickly add PDF functionality to Android, iOS, and React Native applications.

348 lines (326 loc) 13.4 kB
/** * Copyright © 2014-2026 PDF Technologies, Inc. All Rights Reserved. * * THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW * AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT. * UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES. * This notice may not be removed from this file. */ import { NativeModules, findNodeHandle } from 'react-native'; import { CPDFAnnotationFactory } from '../annotation/CPDFAnnotationFactory'; import { CPDFAnnotation } from '../annotation/CPDFAnnotation'; import { CPDFWidgetFactory } from '../annotation/form/CPDFWidgetFactory'; import { CPDFWidget } from '../annotation/form/CPDFWidget'; import type { CPDFRectF } from '../util/CPDFRectF'; import { CPDFTextLine } from './CPDFTextLine'; const { CPDFViewManager } = NativeModules; /** * @class CPDFPage * The `CPDFPage` class represents a page in a PDF document. * It provides methods to retrieve annotations and form widgets present on the page. * @example * // Get the first page * const pageIndex = 0; * const cpdfPage : CPDFPage = pdfReaderRef?.current?._pdfDocument.pageAtIndex(pageIndex); * */ export class CPDFPage { pageIndex: number private _viewerRef: any; constructor(viewerRef: any, pageIndex: number) { this.pageIndex = pageIndex; this._viewerRef = viewerRef; } /** * Retrieves all text on the current page. * @example * const page = pdfReaderRef?.current?._pdfDocument.pageAtIndex(0); * const text = await page?.getAllText(); */ getAllText = async (): Promise<string> => { const tag = findNodeHandle(this._viewerRef); if (tag != null) { try { return await CPDFViewManager.getPageText(tag, this.pageIndex); } catch (e) { return ''; } } return Promise.reject(new Error('Unable to find the native view reference')); } /** * Retrieves text inside the specified rectangle on the current page. * @param rect The rectangle in page coordinates. */ getTextInRect = async (rect: CPDFRectF): Promise<string> => { const tag = findNodeHandle(this._viewerRef); if (tag != null) { try { return await CPDFViewManager.getPageTextInRect(tag, this.pageIndex, rect); } catch (e) { return ''; } } return Promise.reject(new Error('Unable to find the native view reference')); } /** * Retrieves all text lines on the current page. */ getTextLines = async (): Promise<CPDFTextLine[]> => { const tag = findNodeHandle(this._viewerRef); if (tag != null) { try { const data = await CPDFViewManager.getPageTextLines(tag, this.pageIndex); if (!Array.isArray(data)) { return []; } return data.map((item: any) => CPDFTextLine.fromJson(item)); } catch (e) { return []; } } return Promise.reject(new Error('Unable to find the native view reference')); } /** * Retrieves text for a line returned by [getTextLines]. * @param line The text line to extract. */ getTextByLine = async (line: CPDFTextLine): Promise<string> => { if (line.pageIndex !== this.pageIndex) { return Promise.reject( new Error( `The line pageIndex (${line.pageIndex}) does not match this pageIndex (${this.pageIndex}).` ) ); } const tag = findNodeHandle(this._viewerRef); if (tag != null) { try { return await CPDFViewManager.getSearchText(tag, line.pageIndex, line.location, line.length); } catch (e) { return ''; } } return Promise.reject(new Error('Unable to find the native view reference')); } /** * Retrieves all annotations on the current page. * * This method fetches all annotations present on the current page of the PDF document * and returns a list of corresponding CPDFAnnotation instances. * * @example * const pageIndex = 0; * const page = pdfReaderRef?.current?._pdfDocument.pageAtIndex(pageIndex); * const annotations = await page?.getAnnotations(); * * @returns {Promise<CPDFAnnotation[]>} A promise that resolves with all annotations on the current page, * or an empty array if retrieval fails. */ getAnnotations = async (): Promise<CPDFAnnotation[]> => { const tag = findNodeHandle(this._viewerRef); if (tag != null) { try { const data = await CPDFViewManager.getAnnotations(tag, this.pageIndex); return CPDFAnnotationFactory.createFromArray(data); } catch (e) { return []; } } return Promise.reject(new Error('Unable to find the native view reference')); } /** * Retrieves all form widgets on the current page. * * This method fetches all form widgets available on the current page of the PDF document * and returns a list of corresponding `CPDFWidget` instances. * * @example * const pageIndex = 0; * const page = pdfReaderRef?.current?._pdfDocument.pageAtIndex(pageIndex); * const widgets = await page?.getWidgets(); * * @see CPDFWidget - Base class for all form widgets * @see CPDFTextWidget - Text input field widget * @see CPDFSignatureWidget - Signature widget * @see CPDFRadiobuttonWidget - Radio button widget * @see CPDFPushbuttonWidget - Button widget * @see CPDFListboxWidget - List box widget * @see CPDFComboboxWidget - Combo box widget * @see CPDFCheckboxWidget - Checkbox widget * * @returns {Promise<CPDFWidget[]>} A promise that resolves to an array of `CPDFWidget` instances * representing form widgets on the current page. Returns an empty array if retrieval fails. * Rejects with an error if the native view reference is unavailable. */ getWidgets = async (): Promise<CPDFWidget[]> => { const tag = findNodeHandle(this._viewerRef); if (tag != null) { try { const data = await CPDFViewManager.getForms(tag, this.pageIndex); return CPDFWidgetFactory.createFromArray(data); } catch (e) { console.error('Failed to retrieve form widgets:', e); return []; } } return Promise.reject(new Error('Unable to find the native view reference')); } /** * Removes an annotation from the current page. * @param annotation The annotation to be removed. * @example * const pageIndex = 0; * const page = pdfReaderRef?.current?._pdfDocument.pageAtIndex(pageIndex); * const annotations = await page?.getAnnotations(); * const annotationToRemove = annotations[0]; * await page?.removeAnnotation(annotationToRemove); */ removeAnnotation(annotation: CPDFAnnotation): Promise<boolean> { const tag = findNodeHandle(this._viewerRef); if (tag != null) { return CPDFViewManager.removeAnnotation(tag, annotation.page, annotation.uuid); } return Promise.reject(new Error('Unable to find the native view reference')); } /** * Removes a form widget from the current page. * @example * const pageIndex = 0; * const page = pdfReaderRef?.current?._pdfDocument.pageAtIndex(pageIndex); * const widgets = await page?.getWidgets(); * const widgetToRemove = widgets[0]; * await page?.removeWidget(widgetToRemove); * @see CPDFWidget - Base class for all form widgets * @param widget The widget to be removed. * @returns */ removeWidget(widget: CPDFWidget): Promise<boolean> { const tag = findNodeHandle(this._viewerRef); if (tag != null) { return CPDFViewManager.removeWidget(tag, widget.page, widget.uuid); } return Promise.reject(new Error('Unable to find the native view reference')); } /** * Gets the rotation angle of the current page. * @example * const pageIndex = 0; * const page = pdfReaderRef?.current?._pdfDocument.pageAtIndex(pageIndex); * const rotation = await page?.getRotation(); * @returns */ getRotation(): Promise<number> { const tag = findNodeHandle(this._viewerRef); if (tag != null) { return CPDFViewManager.getPageRotation(tag, this.pageIndex); } return Promise.reject(new Error('Unable to find the native view reference')); } /** * Sets the rotation angle of the current page. * @example * const pageIndex = 0; * const page = pdfReaderRef?.current?._pdfDocument.pageAtIndex(pageIndex); * const success = await page?.setRotation(90); * @param rotation The rotation angle in degrees (0, 90, 180, 270). 360 is treated as 0. * @returns */ setRotation(rotation: number): Promise<boolean> { const tag = findNodeHandle(this._viewerRef); if (tag != null) { const validRotations = [0, 90, 180, 270]; if (rotation == 360) { rotation = 0; } if (!validRotations.includes(rotation)) { return Promise.reject(new Error('Invalid rotation value. Valid values are 0, 90, 180, 270.')); } return CPDFViewManager.setPageRotation(tag, this.pageIndex, rotation); } return Promise.reject(new Error('Unable to find the native view reference')); } } export class CPDFPageSize { readonly width: number; readonly height: number; readonly name: string; readonly isCustom: boolean; private constructor(name: string, width: number, height: number, isCustom = false) { this.name = name; this.width = width; this.height = height; this.isCustom = isCustom; } static readonly letter = new CPDFPageSize('letter', 612, 792); static readonly note = new CPDFPageSize('note', 540, 720); static readonly legal = new CPDFPageSize('legal', 612, 1008); static readonly a0 = new CPDFPageSize('a0', 2380, 3368); static readonly a1 = new CPDFPageSize('a1', 1684, 2380); static readonly a2 = new CPDFPageSize('a2', 1190, 1684); static readonly a3 = new CPDFPageSize('a3', 842, 1190); static readonly a4 = new CPDFPageSize('a4', 595, 842); static readonly a5 = new CPDFPageSize('a5', 421, 595); static readonly a6 = new CPDFPageSize('a6', 297, 421); static readonly a7 = new CPDFPageSize('a7', 210, 297); static readonly a8 = new CPDFPageSize('a8', 148, 210); static readonly a9 = new CPDFPageSize('a9', 105, 148); static readonly a10 = new CPDFPageSize('a10', 74, 105); static readonly b0 = new CPDFPageSize('b0', 2836, 4008); static readonly b1 = new CPDFPageSize('b1', 2004, 2836); static readonly b2 = new CPDFPageSize('b2', 1418, 2004); static readonly b3 = new CPDFPageSize('b3', 1002, 1418); static readonly b4 = new CPDFPageSize('b4', 709, 1002); static readonly b5 = new CPDFPageSize('b5', 501, 709); static readonly archE = new CPDFPageSize('archE', 2592, 3456); static readonly archD = new CPDFPageSize('archD', 1728, 2592); static readonly archC = new CPDFPageSize('archC', 1296, 1728); static readonly archB = new CPDFPageSize('archB', 864, 1296); static readonly archA = new CPDFPageSize('archA', 648, 864); static readonly flsa = new CPDFPageSize('flsa', 612, 936); static readonly flse = new CPDFPageSize('flse', 612, 936); static readonly halfLetter = new CPDFPageSize('halfLetter', 396, 612); static readonly s11x17 = new CPDFPageSize('11x17', 792, 1224); static readonly ledger = new CPDFPageSize('ledger', 1224, 792); static readonly values: CPDFPageSize[] = [ CPDFPageSize.letter, CPDFPageSize.note, CPDFPageSize.legal, CPDFPageSize.a0, CPDFPageSize.a1, CPDFPageSize.a2, CPDFPageSize.a3, CPDFPageSize.a4, CPDFPageSize.a5, CPDFPageSize.a6, CPDFPageSize.a7, CPDFPageSize.a8, CPDFPageSize.a9, CPDFPageSize.a10, CPDFPageSize.b0, CPDFPageSize.b1, CPDFPageSize.b2, CPDFPageSize.b3, CPDFPageSize.b4, CPDFPageSize.b5, CPDFPageSize.archE, CPDFPageSize.archD, CPDFPageSize.archC, CPDFPageSize.archB, CPDFPageSize.archA, CPDFPageSize.flsa, CPDFPageSize.flse, CPDFPageSize.halfLetter, CPDFPageSize.s11x17, CPDFPageSize.ledger ]; static custom(width: number, height: number): CPDFPageSize { if (width <= 0 || height <= 0) { throw new Error('Width and height must be positive numbers.'); } return new CPDFPageSize('custom', width, height, true); } toString(): string { return `${this.name} (${this.width} x ${this.height})${this.isCustom ? ' [custom]' : ''}`; } }