1+ /*
2+ * PSPDFKitPackage.java
3+ *
4+ * PSPDFKit
5+ *
6+ * Copyright © 2017-2022 PSPDFKit GmbH. All rights reserved.
7+ *
8+ * THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
9+ * AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE PSPDFKIT LICENSE AGREEMENT.
10+ * UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
11+ * This notice may not be removed from this file.
12+ */
13+
14+ package com .pspdfkit .react ;
15+
16+ import android .annotation .SuppressLint ;
17+ import android .content .Context ;
18+ import android .net .Uri ;
19+ import android .webkit .URLUtil ;
20+
21+ import androidx .annotation .NonNull ;
22+ import androidx .annotation .Nullable ;
23+
24+ import com .facebook .react .bridge .Arguments ;
25+ import com .facebook .react .bridge .Promise ;
26+ import com .facebook .react .bridge .ReactApplicationContext ;
27+ import com .facebook .react .bridge .ReactContextBaseJavaModule ;
28+ import com .facebook .react .bridge .ReactMethod ;
29+ import com .facebook .react .bridge .ReadableArray ;
30+ import com .facebook .react .bridge .ReadableMap ;
31+ import com .facebook .react .bridge .WritableMap ;
32+ import com .pspdfkit .document .html .HtmlToPdfConverter ;
33+ import com .pspdfkit .document .processor .NewPage ;
34+ import com .pspdfkit .document .processor .PagePattern ;
35+ import com .pspdfkit .document .processor .PdfProcessor ;
36+ import com .pspdfkit .document .processor .PdfProcessorTask ;
37+ import com .pspdfkit .react .helper .RNConfigurationHelper ;
38+ import com .pspdfkit .react .helper .RNFileHelper ;
39+ import com .pspdfkit .utils .Size ;
40+
41+ import java .io .File ;
42+ import java .util .Objects ;
43+
44+ public class RNProcessor extends ReactContextBaseJavaModule {
45+ public RNProcessor (ReactApplicationContext reactContext ) {
46+ super (reactContext );
47+ }
48+
49+ @ NonNull
50+ @ Override
51+ public String getName () {
52+ return "RNProcessor" ;
53+ }
54+
55+ @ ReactMethod
56+ public void getTemporaryDirectory (Promise callback ) {
57+ try {
58+ Context context = Objects .requireNonNull (getCurrentActivity ()).getApplication ().getApplicationContext ();
59+ WritableMap result = Arguments .createMap ();
60+ result .putString ("tempDir" , context .getCacheDir ().getAbsolutePath ());
61+ callback .resolve (result );
62+ } catch (Exception e ) {
63+ callback .reject (e );
64+ }
65+ }
66+
67+ @ ReactMethod
68+ public void generateBlankPDF (@ NonNull ReadableMap configuration , Promise callback ) {
69+ try {
70+ File outputFile = RNFileHelper .getFilePath (getContext (), configuration , callback );
71+
72+ if (outputFile == null ) {
73+ callback .reject ("E_MISSING_FOLDER" , "Cannot create documents folder" );
74+ return ;
75+ }
76+
77+ double width = configuration .getDouble ("width" );
78+ double height = configuration .getDouble ("height" );
79+
80+
81+ WritableMap result = Arguments .createMap ();
82+ result .putString ("fileURL" , outputFile .getAbsolutePath ());
83+
84+ final PdfProcessorTask task = PdfProcessorTask .newPage (NewPage .patternPage (new Size ((float ) width , (float ) height ), PagePattern .BLANK ).build ());
85+
86+ PdfProcessor .processDocumentAsync (task , outputFile )
87+ .doFinally (() -> callback .resolve (result ))
88+ .doOnError (callback ::reject )
89+ .subscribe ();
90+ } catch (Exception e ) {
91+ callback .reject (e );
92+ }
93+ }
94+
95+ @ SuppressLint ("CheckResult" )
96+ @ ReactMethod
97+ public void generatePDFFromHtmlString (@ NonNull ReadableMap configuration , String htmlString , Promise callback ) {
98+ try {
99+ File outputFile = RNFileHelper .getFilePath (getContext (), configuration , callback );
100+
101+ WritableMap result = Arguments .createMap ();
102+ assert outputFile != null ;
103+ result .putString ("fileURL" , outputFile .toURI ().toString ());
104+
105+ HtmlToPdfConverter .fromHTMLString (getContext (), htmlString )
106+ .title ("Converted document" )
107+ .convertToPdfAsync (outputFile )
108+ .doFinally (() -> callback .resolve (result ))
109+ .doOnError ((error ) -> callback .reject (error ))
110+ .subscribe ();
111+
112+ } catch (Exception e ) {
113+ callback .reject (e );
114+ }
115+ }
116+
117+ @ SuppressLint ({"CheckResult" , "SetJavaScriptEnabled" })
118+ @ ReactMethod
119+ public void generatePDFFromHtmlURL (@ NonNull ReadableMap configuration , String originUri , Promise callback ) {
120+ try {
121+ if (!URLUtil .isValidUrl (originUri )) {
122+ callback .reject ("E_NEW_INVALID_URL" , "Please provide valid URL." );
123+ return ;
124+ }
125+
126+ Uri originURL = Uri .parse (originUri );
127+ File outputFile = RNFileHelper .getFilePath (getContext (), configuration , callback );
128+
129+ if (outputFile == null ) {
130+ callback .reject ("E_NEW_INVALID_FILE_PATH" , "Please provide valid file path." );
131+ return ;
132+ }
133+
134+ RNFileHelper .deleteExistingFileIfNeeded (outputFile , configuration , callback );
135+
136+ WritableMap result = Arguments .createMap ();
137+ result .putString ("fileURL" , outputFile .getAbsolutePath ());
138+
139+ Context context = Objects .requireNonNull (getCurrentActivity ()).getApplication ().getApplicationContext ();
140+
141+ final HtmlToPdfConverter converter = HtmlToPdfConverter .fromUri (context , originURL );
142+ boolean isJavascriptEnabled = !configuration .hasKey ("enableJavascript" ) || configuration .getBoolean ("enableJavaScript" );
143+ converter .setJavaScriptEnabled (isJavascriptEnabled );
144+
145+ converter .convertToPdfAsync (outputFile )
146+ .doFinally (() -> callback .resolve (result ))
147+ .doOnError ((error ) -> callback .reject (error ))
148+ .subscribe (() -> {
149+ callback .resolve (result );
150+ }, throwable -> {
151+ callback .reject (throwable );
152+ });
153+
154+ } catch (
155+ Exception e ) {
156+ callback .reject (e );
157+ }
158+
159+ }
160+
161+ @ SuppressLint ("CheckResult" )
162+ @ ReactMethod
163+ public void generatePDFFromTemplate (@ NonNull ReadableMap configuration , Promise callback ) {
164+ try {
165+ File outputFile = RNFileHelper .getFilePath (getContext (), configuration , callback );
166+
167+ if (outputFile == null ) {
168+ callback .reject ("ERROR_NEW_INVALID_FILE_PATH" , "Please provide valid file path." );
169+ return ;
170+ }
171+
172+ WritableMap result = Arguments .createMap ();
173+ result .putString ("fileURL" , outputFile .toURI ().toString ());
174+ RNFileHelper .deleteExistingFileIfNeeded (outputFile , configuration , callback );
175+ Context context = Objects .requireNonNull (getCurrentActivity ()).getApplication ().getApplicationContext ();
176+
177+ RNConfigurationHelper configHelper = new RNConfigurationHelper (configuration , context );
178+
179+ ReadableArray templates = configuration .getArray ("templates" );
180+
181+ if (templates != null ) {
182+ PdfProcessorTask pdfProcessorTask = PdfProcessorTask .empty ();
183+
184+ for (int i = 0 ; i < templates .size (); i ++) {
185+ configHelper .configuration = templates .getMap (i );
186+ pdfProcessorTask .addNewPage (configHelper .parseConfiguration (), i );
187+ }
188+ PdfProcessor .processDocumentAsync (pdfProcessorTask , outputFile )
189+ .doFinally (() -> callback .resolve (result ))
190+ .doOnError ((error ) -> callback .reject (error ))
191+ .subscribe ();
192+ return ;
193+ }
194+
195+ callback .reject ("ERROR_NEW_INVALID_CONFIGURATION" , "Please provide valid configuration object." );
196+ } catch (Exception e ) {
197+ callback .reject (e );
198+ }
199+ }
200+
201+ @ ReactMethod
202+ public void generatePDFFromImages (@ NonNull ReadableMap configuration , Promise callback ) {
203+ try {
204+ File outputFile = RNFileHelper .getFilePath (getContext (), configuration , callback );
205+ Context context = Objects .requireNonNull (getCurrentActivity ()).getApplication ().getApplicationContext ();
206+
207+ WritableMap result = Arguments .createMap ();
208+ assert outputFile != null ;
209+
210+ result .putString ("fileURL" , outputFile .toURI ().toString ());
211+ RNFileHelper .deleteExistingFileIfNeeded (outputFile , configuration , callback );
212+
213+ final PdfProcessorTask pdfProcessorTask = PdfProcessorTask .empty ();
214+
215+ @ Nullable ReadableArray images = configuration .getArray ("images" );
216+
217+ if (images == null ) {
218+ callback .reject ("ERROR_MISSING_IMAGES" , "Please provide array of image objects." );
219+ return ;
220+ }
221+
222+ for (int i = 0 ; i < images .size (); i ++) {
223+ RNConfigurationHelper configHelper = new RNConfigurationHelper (configuration , context );
224+ NewPage newPage = configHelper .parseConfiguration ("image" , configuration .getArray ("images" ).getMap (i ));
225+ if (newPage != null ) {
226+ pdfProcessorTask .addNewPage (newPage , i );
227+ }
228+ }
229+
230+ PdfProcessor .processDocumentAsync (pdfProcessorTask , outputFile )
231+ .doOnError ((error ) -> callback .reject (error ))
232+ .doFinally (() -> callback .resolve (result ))
233+ .subscribe ();
234+
235+ } catch (Exception e ) {
236+ callback .reject (e );
237+ }
238+ }
239+
240+ private Context getContext () {
241+ return Objects .requireNonNull (getCurrentActivity ()).getApplication ().getApplicationContext ();
242+ }
243+ }
0 commit comments