Skip to content

Commit 313a3be

Browse files
committed
iText dependency has been removed form android platform.
1 parent 3e3b6fa commit 313a3be

File tree

3 files changed

+125
-49
lines changed

3 files changed

+125
-49
lines changed

android/build.gradle

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,4 @@ repositories {
3434

3535
dependencies {
3636
compile 'com.facebook.react:react-native:0.20.+'
37-
compile 'com.itextpdf:itextg:5.5.9'
38-
compile 'com.itextpdf.tool:xmlworker:5.5.9'
3937
}
Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
/*
2+
* Created on 11/15/17.
3+
* Written by Islam Salah with assistance from members of Blink22.com
4+
*/
5+
6+
package android.print;
7+
8+
import android.content.Context;
9+
import android.os.Build;
10+
import android.os.Handler;
11+
import android.os.ParcelFileDescriptor;
12+
import android.util.Log;
13+
import android.webkit.WebView;
14+
import android.webkit.WebViewClient;
15+
16+
import java.io.File;
17+
18+
/**
19+
* Converts HTML to PDF.
20+
* <p>
21+
* Can convert only one task at a time, any requests to do more conversions before
22+
* ending the current task are ignored.
23+
*/
24+
public class PdfConverter implements Runnable {
25+
26+
private static final String TAG = "PdfConverter";
27+
private static PdfConverter sInstance;
28+
29+
private Context mContext;
30+
private String mHtmlString;
31+
private File mPdfFile;
32+
private PrintAttributes mPdfPrintAttrs;
33+
private boolean mIsCurrentlyConverting;
34+
private WebView mWebView;
35+
36+
private PdfConverter() {
37+
}
38+
39+
public static synchronized PdfConverter getInstance() {
40+
if (sInstance == null)
41+
sInstance = new PdfConverter();
42+
43+
return sInstance;
44+
}
45+
46+
@Override
47+
public void run() {
48+
if (mContext == null || mHtmlString == null || mPdfFile == null) return;
49+
50+
mWebView = new WebView(mContext);
51+
mWebView.setWebViewClient(new WebViewClient() {
52+
@Override
53+
public void onPageFinished(WebView view, String url) {
54+
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) return;
55+
56+
PrintDocumentAdapter documentAdapter = mWebView.createPrintDocumentAdapter();
57+
documentAdapter.onLayout(null, getPdfPrintAttrs(), null, new PrintDocumentAdapter.LayoutResultCallback() {}, null);
58+
documentAdapter.onWrite(new PageRange[]{PageRange.ALL_PAGES}, getOutputFileDescriptor(), null, new PrintDocumentAdapter.WriteResultCallback() {
59+
@Override
60+
public void onWriteFinished(PageRange[] pages) {
61+
destroy();
62+
}
63+
});
64+
}
65+
});
66+
mWebView.loadData(mHtmlString, "text/HTML", "UTF-8");
67+
}
68+
69+
public PrintAttributes getPdfPrintAttrs() {
70+
return mPdfPrintAttrs != null ? mPdfPrintAttrs : getDefaultPrintAttrs();
71+
}
72+
73+
public void setPdfPrintAttrs(PrintAttributes printAttrs) {
74+
this.mPdfPrintAttrs = printAttrs;
75+
}
76+
77+
public void convert(Context context, String htmlString, File file) {
78+
if (mIsCurrentlyConverting)
79+
return;
80+
81+
mContext = context;
82+
mHtmlString = htmlString;
83+
mPdfFile = file;
84+
mIsCurrentlyConverting = true;
85+
runOnUiThread(this);
86+
}
87+
88+
private ParcelFileDescriptor getOutputFileDescriptor() {
89+
try {
90+
mPdfFile.createNewFile();
91+
return ParcelFileDescriptor.open(mPdfFile, ParcelFileDescriptor.MODE_TRUNCATE | ParcelFileDescriptor.MODE_READ_WRITE);
92+
} catch (Exception e) {
93+
Log.d(TAG, "Failed to open ParcelFileDescriptor", e);
94+
}
95+
return null;
96+
}
97+
98+
private PrintAttributes getDefaultPrintAttrs() {
99+
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) return null;
100+
101+
return new PrintAttributes.Builder()
102+
.setMediaSize(PrintAttributes.MediaSize.NA_GOVT_LETTER)
103+
.setResolution(new PrintAttributes.Resolution("RESOLUTION_ID", "RESOLUTION_ID", 600, 600))
104+
.setMinMargins(PrintAttributes.Margins.NO_MARGINS)
105+
.build();
106+
107+
}
108+
109+
private void runOnUiThread(Runnable runnable) {
110+
Handler handler = new Handler(mContext.getMainLooper());
111+
handler.post(runnable);
112+
}
113+
114+
private void destroy() {
115+
mContext = null;
116+
mHtmlString = null;
117+
mPdfFile = null;
118+
mPdfPrintAttrs = null;
119+
mIsCurrentlyConverting = false;
120+
mWebView = null;
121+
}
122+
}

android/src/main/java/com/christopherdro/htmltopdf/RNHTMLtoPDFModule.java

Lines changed: 3 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -7,33 +7,17 @@
77
import com.facebook.react.bridge.ReadableMap;
88
import com.facebook.react.bridge.Promise;
99
import com.facebook.react.bridge.WritableMap;
10-
import com.facebook.react.bridge.ReadableArray;
1110

1211
import java.io.File;
13-
import java.io.FileOutputStream;
14-
import java.io.InputStream;
15-
import java.io.ByteArrayInputStream;
1612
import java.util.UUID;
17-
import java.util.HashSet;
18-
import java.util.Set;
19-
import java.nio.charset.Charset;
2013

21-
import com.itextpdf.text.Document;
22-
import com.itextpdf.text.pdf.PdfWriter;
23-
import com.itextpdf.text.pdf.codec.Base64;
24-
import com.itextpdf.tool.xml.XMLWorkerHelper;
25-
import com.itextpdf.text.FontFactory;
26-
import com.itextpdf.tool.xml.XMLWorkerFontProvider;
2714

2815
import android.os.Environment;
16+
import android.print.PdfConverter;
2917

3018
public class RNHTMLtoPDFModule extends ReactContextBaseJavaModule {
3119

32-
private Promise promise;
3320
private final ReactApplicationContext mReactContext;
34-
private Set<String> customFonts = new HashSet<>();
35-
36-
XMLWorkerFontProvider fontProvider = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS);
3721

3822
public RNHTMLtoPDFModule(ReactApplicationContext reactContext) {
3923
super(reactContext);
@@ -59,15 +43,6 @@ public void convert(final ReadableMap options, final Promise promise) {
5943
fileName = UUID.randomUUID().toString();
6044
}
6145

62-
if (options.hasKey("fonts")) {
63-
if (options.getArray("fonts") != null) {
64-
final ReadableArray fonts = options.getArray("fonts");
65-
for (int i = 0; i < fonts.size(); i++) {
66-
customFonts.add(fonts.getString(i));
67-
}
68-
}
69-
}
70-
7146
if (options.hasKey("directory") && options.getString("directory").equals("docs")) {
7247
File path = new File(Environment.getExternalStorageDirectory(), Environment.DIRECTORY_DOCUMENTS);
7348
if (!path.exists()) path.mkdir();
@@ -77,15 +52,9 @@ public void convert(final ReadableMap options, final Promise promise) {
7752
}
7853

7954
String filePath = convertToPDF(htmlString, destinationFile);
80-
String base64 = "";
81-
82-
if (options.hasKey("base64") && options.getBoolean("base64") == true) {
83-
base64 = Base64.encodeFromFile(filePath);
84-
}
8555

8656
WritableMap resultMap = Arguments.createMap();
8757
resultMap.putString("filePath", filePath);
88-
resultMap.putString("base64", base64);
8958

9059
promise.resolve(resultMap);
9160
} catch (Exception e) {
@@ -95,21 +64,8 @@ public void convert(final ReadableMap options, final Promise promise) {
9564

9665
private String convertToPDF(String htmlString, File file) throws Exception {
9766
try {
98-
Document doc = new Document();
99-
InputStream in = new ByteArrayInputStream(htmlString.getBytes());
100-
101-
PdfWriter pdf = PdfWriter.getInstance(doc, new FileOutputStream(file));
102-
103-
FontFactory.setFontImp(fontProvider);
104-
for (String font : customFonts) {
105-
fontProvider.register( font );
106-
}
107-
108-
doc.open();
109-
XMLWorkerHelper.getInstance().parseXHtml(pdf, doc, in, null, Charset.forName("UTF-8"), fontProvider);
110-
doc.close();
111-
in.close();
112-
67+
PdfConverter.getInstance()
68+
.convert(mReactContext, htmlString, file);
11369
String absolutePath = file.getAbsolutePath();
11470

11571
return absolutePath;

0 commit comments

Comments
 (0)