Skip to content

Commit b20a3c8

Browse files
author
PSPDFKit
committed
Release 2.4.0
1 parent 75869d1 commit b20a3c8

File tree

94 files changed

+13397
-5393
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

94 files changed

+13397
-5393
lines changed

.eslintignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
./android
2+
./ios
3+
./assets
4+
./node_modules/**/*.js

.eslintrc.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
module.exports = {
2+
root: true,
3+
extends: '@react-native-community',
4+
rules: {
5+
'react/no-string-refs': 'off',
6+
'no-alert': 'off',
7+
},
8+
};

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,3 +49,5 @@ PSPDFKit/PSPDFKitUI.xcframework
4949

5050
# UWP license file
5151
samples/Catalog/windows/Catalog/License.xaml
52+
53+
.fake

.prettierrc.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
module.exports = {
2+
bracketSpacing: true,
3+
bracketSameLine: false,
4+
singleQuote: true,
5+
trailingComma: 'all',
6+
arrowParens: 'avoid',
7+
"endOfLine": "auto",
8+
"printWidth": 80,
9+
"tabWidth": 2,
10+
};

CHANGELOG.md

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,17 @@
11
## Newest Release
22

3-
### 2.3.1 - 22 Jul 2022
3+
### 2.4.0 - 25 Oct 2022
44

5-
- Updates for PSPDFKit 8.2.1 for Android. (#34430)
5+
- Adds PDF generation from HTML, images and template. (#36736)
6+
- Updates for PSPDFKit 8.4.1 for Android
7+
- Updates for PSPDFKit 12.0 for iOS
68

79
## Previous Releases
810

11+
### 2.3.1 - 22 Jul 2022
12+
13+
- Updates for PSPDFKit 8.2.1 for Android. (#34430)
14+
915
### 2.3.0 - 19 Jul 2022
1016

1117
- Adds Android Toolbar menu customization from `PSPDFKitView` properties. (#33417)

android/.project

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,12 @@
2222
</natures>
2323
<filteredResources>
2424
<filter>
25-
<id>0</id>
25+
<id>1666692500644</id>
2626
<name></name>
2727
<type>30</type>
2828
<matcher>
2929
<id>org.eclipse.core.resources.regexFilterMatcher</id>
30-
<arguments>node_modules|.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__</arguments>
30+
<arguments>node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__</arguments>
3131
</matcher>
3232
</filter>
3333
</filteredResources>

android/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
* Contains gradle configuration constants
1616
*/
1717
ext {
18-
PSPDFKIT_VERSION = '8.2.1'
18+
PSPDFKIT_VERSION = '8.4.1'
1919
}
2020

2121
buildscript {

android/src/main/java/com/pspdfkit/react/PSPDFKitPackage.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ public List<NativeModule> createNativeModules(ReactApplicationContext reactConte
3232
List<NativeModule> modules = new ArrayList<>();
3333
modules.add(new PSPDFKitModule(reactContext));
3434
modules.add(new TestingModule(reactContext));
35+
modules.add(new RNProcessor(reactContext));
3536
return modules;
3637
}
3738

Lines changed: 243 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,243 @@
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+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package com.pspdfkit.react.helper;
2+
3+
/*
4+
* PSPDFKitPackage.java
5+
*
6+
* PSPDFKit
7+
*
8+
* Copyright © 2017-2022 PSPDFKit GmbH. All rights reserved.
9+
*
10+
* THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
11+
* AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE PSPDFKIT LICENSE AGREEMENT.
12+
* UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
13+
* This notice may not be removed from this file.
14+
*/
15+
16+
import android.graphics.Color;
17+
18+
public class ColorHelper {
19+
public static int rgb(String color) {
20+
try{
21+
String splitStr = color.substring(color.indexOf('(') + 1, color.indexOf(')'));
22+
String[] components = splitStr.split(",");
23+
24+
int[] colorValues = new int[components.length];
25+
for (int i = 0; i < components.length; i++) {
26+
double channelColor = Double.parseDouble(components[i].trim());
27+
if(channelColor > 1) {
28+
colorValues[i] = Integer.parseInt(components[i].trim());
29+
continue;
30+
}
31+
colorValues[i] = (int)(channelColor * 255);
32+
}
33+
34+
return Color.rgb(colorValues[0], colorValues[1], colorValues[2]);
35+
} catch(Exception ex) {
36+
return Color.parseColor("#FFFFFF");
37+
}
38+
}
39+
}

0 commit comments

Comments
 (0)