Skip to content

Commit e81f807

Browse files
ShivamdhuriaSwati4star
authored andcommitted
#420-add splitting options (#567)
1 parent 8019145 commit e81f807

File tree

8 files changed

+118
-33
lines changed

8 files changed

+118
-33
lines changed

app/src/main/java/swati4star/createpdf/fragment/SplitFilesFragment.java

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
import android.app.Activity;
44
import android.content.Context;
55
import android.content.Intent;
6+
import android.graphics.pdf.PdfRenderer;
67
import android.os.Bundle;
8+
import android.os.ParcelFileDescriptor;
79
import android.support.annotation.NonNull;
810
import android.support.design.widget.BottomSheetBehavior;
911
import android.support.v4.app.Fragment;
@@ -12,6 +14,7 @@
1214
import android.view.LayoutInflater;
1315
import android.view.View;
1416
import android.view.ViewGroup;
17+
import android.widget.EditText;
1518
import android.widget.ImageView;
1619
import android.widget.LinearLayout;
1720
import android.widget.RelativeLayout;
@@ -20,6 +23,9 @@
2023
import com.airbnb.lottie.LottieAnimationView;
2124
import com.dd.morphingbutton.MorphingButton;
2225

26+
import java.io.File;
27+
import java.io.FileDescriptor;
28+
import java.io.IOException;
2329
import java.util.ArrayList;
2430

2531
import butterknife.BindView;
@@ -37,6 +43,7 @@
3743
import swati4star.createpdf.util.ViewFilesDividerItemDecoration;
3844

3945
import static android.app.Activity.RESULT_OK;
46+
import static android.os.ParcelFileDescriptor.MODE_READ_ONLY;
4047
import static swati4star.createpdf.util.CommonCodeUtils.populateUtil;
4148
import static swati4star.createpdf.util.FileUriUtils.getFilePath;
4249
import static swati4star.createpdf.util.StringUtils.showSnackbar;
@@ -73,6 +80,8 @@ public class SplitFilesFragment extends Fragment implements MergeFilesAdapter.On
7380
RecyclerView mSplittedFiles;
7481
@BindView(R.id.splitfiles_text)
7582
TextView splitFilesSuccessText;
83+
@BindView(R.id.split_config)
84+
EditText mSplitConfitEditText;
7685

7786
@Override
7887
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
@@ -111,7 +120,8 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) throw
111120

112121
@OnClick(R.id.splitFiles)
113122
public void parse() {
114-
ArrayList<String> outputFilePaths = mPDFUtils.splitPDF(mPath);
123+
ArrayList<String> outputFilePaths = mPDFUtils.splitPDFByConfig(mPath,
124+
mSplitConfitEditText.getText().toString());
115125
int numberOfPages = outputFilePaths.size();
116126
if (numberOfPages > 0) {
117127
String output = String.format(mActivity.getString(R.string.split_success), numberOfPages);
@@ -156,6 +166,33 @@ private void setTextAndActivateButtons(String path) {
156166
mPath = path;
157167
mMorphButtonUtility.setTextAndActivateButtons(path,
158168
selectFileButton, splitFilesButton);
169+
mSplitConfitEditText.setVisibility(View.VISIBLE);
170+
mSplitConfitEditText.setText(getDefaultSplitConfig(mPath));
171+
}
172+
173+
/**
174+
* Gets the total number of pages in the
175+
* selected PDF and returns them in
176+
* default format for single page pdfs
177+
* (1,2,3,4,5,)
178+
*/
179+
private String getDefaultSplitConfig(String mPath) {
180+
String splitConfig = "";
181+
ParcelFileDescriptor fileDescriptor = null;
182+
try {
183+
if (mPath != null)
184+
fileDescriptor = ParcelFileDescriptor.open(new File(mPath), MODE_READ_ONLY);
185+
if (fileDescriptor != null) {
186+
PdfRenderer renderer = new PdfRenderer(fileDescriptor);
187+
final int pageCount = renderer.getPageCount();
188+
for (int i = 1; i <= pageCount; i++) {
189+
splitConfig = splitConfig + i + ",";
190+
}
191+
}
192+
} catch (Exception er) {
193+
er.printStackTrace();
194+
}
195+
return splitConfig;
159196
}
160197

161198
@Override

app/src/main/java/swati4star/createpdf/util/PDFUtils.java

Lines changed: 53 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,13 @@
4444
import java.io.BufferedReader;
4545
import java.io.ByteArrayOutputStream;
4646
import java.io.File;
47+
import java.io.FileNotFoundException;
4748
import java.io.FileOutputStream;
4849
import java.io.IOException;
4950
import java.io.InputStream;
5051
import java.io.InputStreamReader;
5152
import java.util.ArrayList;
53+
import java.util.Arrays;
5254

5355
import swati4star.createpdf.R;
5456
import swati4star.createpdf.database.DatabaseHelper;
@@ -59,6 +61,7 @@
5961
import static swati4star.createpdf.util.Constants.MASTER_PWD_STRING;
6062
import static swati4star.createpdf.util.Constants.STORAGE_LOCATION;
6163
import static swati4star.createpdf.util.Constants.appName;
64+
import static swati4star.createpdf.util.Constants.pdfExtension;
6265
import static swati4star.createpdf.util.DialogUtils.createCustomDialogWithoutContent;
6366
import static swati4star.createpdf.util.StringUtils.getDefaultStorageLocation;
6467
import static swati4star.createpdf.util.StringUtils.getSnackbarwithAction;
@@ -118,7 +121,7 @@ public void showDetails(File file) {
118121
* Create a PDF from a Text File
119122
*
120123
* @param mTextToPDFOptions TextToPDFOptions Object
121-
* @param fileExtension file extension represented as string
124+
* @param fileExtension file extension represented as string
122125
*/
123126
public void createPdf(TextToPDFOptions mTextToPDFOptions, String fileExtension)
124127
throws DocumentException, IOException {
@@ -430,8 +433,9 @@ protected void onPostExecute(String s) {
430433

431434
/**
432435
* Main function to add images to PDF
436+
*
433437
* @param inputPath - path of input PDF
434-
* @param output - path of output PDF
438+
* @param output - path of output PDF
435439
* @param imagesUri - list of images to add
436440
* @return true, if succeeded, otherwise false
437441
*/
@@ -504,25 +508,61 @@ public boolean reorderRemovePDF(String inputPath, String output, String pages) {
504508
}
505509
}
506510

507-
public ArrayList<String> splitPDF(String path) {
511+
/**
512+
* Breaks up the splitDetail String into ranges where a ","
513+
* is found
514+
* @param path the input pdf path
515+
* @param splitDetail string that contains split configuration
516+
* @return
517+
*/
518+
public ArrayList<String> splitPDFByConfig(String path, String splitDetail) {
519+
String splitConfig = splitDetail.replaceAll("\\s+", "");
508520
ArrayList<String> outputPaths = new ArrayList<>();
521+
String delims = "[,]";
522+
String[] ranges = splitConfig.split(delims);
523+
Log.v("Ranges", Arrays.toString(ranges));
509524
try {
510525
String folderPath = mSharedPreferences.getString(STORAGE_LOCATION,
511526
getDefaultStorageLocation());
512527
PdfReader reader = new PdfReader(path);
513528
PdfCopy copy;
514529
Document document;
515-
int pages = reader.getNumberOfPages();
516-
for (int i = 1; i <= pages; i++) {
517-
document = new Document();
530+
for (String range : ranges) {
531+
int startPage;
532+
int endPage;
533+
518534
String fileName = folderPath + FileUtils.getFileName(path);
519-
fileName = fileName.replace(mContext.getString(R.string.pdf_ext),
520-
i + mContext.getString(R.string.pdf_ext));
521-
Log.v("splitting", fileName);
522-
copy = new PdfCopy(document, new FileOutputStream(fileName));
523-
document.open();
524-
copy.addPage(copy.getImportedPage(reader, i));
525-
document.close();
535+
536+
/**
537+
* If the pdf is single page only then convert whole range into int
538+
* else break the range on "-",where startpage will be substring
539+
* from first letter to "-" and endpage will be from "-" till last letter.
540+
*
541+
*/
542+
if (!range.contains("-")) {
543+
startPage = Integer.parseInt(range);
544+
document = new Document();
545+
fileName = fileName.replace(pdfExtension,
546+
"_" + startPage + pdfExtension);
547+
copy = new PdfCopy(document, new FileOutputStream(fileName));
548+
549+
document.open();
550+
copy.addPage(copy.getImportedPage(reader, startPage));
551+
document.close();
552+
553+
} else {
554+
startPage = Integer.parseInt(range.substring(0, range.indexOf("-")));
555+
endPage = Integer.parseInt(range.substring(range.indexOf("-") + 1));
556+
document = new Document();
557+
fileName = fileName.replace(pdfExtension,
558+
"_" + startPage + "-" + endPage + pdfExtension);
559+
copy = new PdfCopy(document, new FileOutputStream(fileName));
560+
document.open();
561+
for (int page = startPage; page <= endPage; page++) {
562+
copy.addPage(copy.getImportedPage(reader, page));
563+
}
564+
document.close();
565+
}
526566
outputPaths.add(fileName);
527567
new DatabaseHelper(mContext).insertRecord(fileName,
528568
mContext.getString(R.string.created));

app/src/main/res/layout/fragment_split_files.xml

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,27 +5,14 @@
55
android:layout_width="match_parent"
66
android:layout_height="match_parent">
77

8-
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
9-
xmlns:app="http://schemas.android.com/apk/res-auto"
10-
xmlns:tools="http://schemas.android.com/tools"
8+
<LinearLayout
119
android:id="@+id/tableLayout"
1210
android:layout_width="match_parent"
1311
android:layout_height="match_parent"
1412
android:orientation="vertical"
1513
android:stretchColumns="*"
1614
tools:context=".fragment.AddImagesFragment">
1715

18-
<TextView
19-
android:id="@+id/split_info"
20-
android:layout_width="match_parent"
21-
android:layout_height="wrap_content"
22-
android:gravity="center"
23-
android:textSize="15sp"
24-
android:textStyle="bold"
25-
android:padding="5dp"
26-
android:layout_marginTop="5dp"
27-
android:text="@string/split_info"/>
28-
2916
<com.dd.morphingbutton.MorphingButton
3017
android:id="@+id/selectFile"
3118
style="@style/MorphingButton"
@@ -38,6 +25,27 @@
3825
app:layout_constraintStart_toStartOf="parent"
3926
app:layout_constraintTop_toTopOf="parent" />
4027

28+
<EditText
29+
android:id="@+id/split_config"
30+
android:layout_width="match_parent"
31+
android:layout_height="wrap_content"
32+
android:layout_margin="16dp"
33+
android:ems="10"
34+
android:inputType="textPersonName"
35+
android:text="Name"
36+
android:visibility="gone" />
37+
38+
<TextView
39+
android:id="@+id/split_info"
40+
android:layout_width="match_parent"
41+
android:layout_height="wrap_content"
42+
android:layout_marginTop="5dp"
43+
android:gravity="center"
44+
android:padding="5dp"
45+
android:text="@string/split_info"
46+
android:textSize="15sp"
47+
android:textStyle="bold" />
48+
4149
<com.dd.morphingbutton.MorphingButton
4250
android:id="@+id/splitFiles"
4351
style="@style/MorphingButton"

app/src/main/res/values-es/strings.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,7 @@
275275
<string name="font_family_edit">Cambiar valor de la letra fuente por defecto</string>
276276
<string name="font_size_edit">Cambiar valor del Tamaño del Texto por defecto</string>
277277
<string name="settings_info">Puede modificar los valores por defecto de varias opciones aquí.</string>
278-
<string name="split_info">El PDF será dividido en múltiples PDFs de una sola página.</string>
278+
<string name="split_info">The PDF will be split into multiple PDFs.Format example: 1&#8211;5,6&#8211;7,8,9</string>
279279
<string name="border_width_prompt">Ingrese unidades anchura del borde</string>
280280
<string name="default_content_description">sin descripción</string>
281281
<string name="prompt_input">Ingrese aquí</string>

app/src/main/res/values-fr/strings.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,7 @@
276276
<string name="font_family_edit">Change default font family</string>
277277
<string name="font_size_edit">Change default font size</string>
278278
<string name="settings_info">You can modify the default value for various settings here.</string>
279-
<string name="split_info">The PDF will be split into multiple PDFs of single page.</string>
279+
<string name="split_info">The PDF will be split into multiple PDFs.Format example: 1&#8211;5,6&#8211;7,8,9</string>
280280
<string name="border_width_prompt">Enter border width units</string>
281281
<string name="default_content_description">no description</string>
282282
<string name="prompt_input">Enter here</string>

app/src/main/res/values-ja/strings.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,7 @@
275275
<string name="font_family_edit">Change default font family</string>
276276
<string name="font_size_edit">Change default font size</string>
277277
<string name="settings_info">You can modify the default value for various settings here.</string>
278-
<string name="split_info">The PDF will be split into multiple PDFs of single page.</string>
278+
<string name="split_info">The PDF will be split into multiple PDFs.Format example: 1&#8211;5,6&#8211;7,8,9</string>
279279
<string name="border_width_prompt">Enter border width units</string>
280280
<string name="default_content_description">no description</string>
281281
<string name="prompt_input">Enter here</string>

app/src/main/res/values-ru/strings.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,7 @@
283283
<!-- Split PDF -->
284284
<string name="split_pdf">Разделить PDF</string>
285285
<string name="split_success">Выбранный PDF файл успешно разделен на %1$d </string>
286-
<string name="split_info">PDF файл будел разделен на несколько одностраничных файлов.</string>
286+
<string name="split_info">The PDF will be split into multiple PDFs.Format example: 1&#8211;5,6&#8211;7,8,9</string>
287287

288288
<!-- Remove Pages -->
289289
<string name="remove_pages">Удалить страницы</string>

app/src/main/res/values/strings.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,7 @@
339339
<!-- Split PDF -->
340340
<string name="split_pdf">Split PDF</string>
341341
<string name="split_success">The selected PDF was split successfully. It was split into %1$d PDF(s)</string>
342-
<string name="split_info">The PDF will be split into multiple PDFs of single page.</string>
342+
<string name="split_info">The PDF will be split into multiple PDFs.Format example: 1&#8211;5,6&#8211;7,8,9</string>
343343

344344
<!-- Remove Pages -->
345345
<string name="remove_pages">Remove Pages</string>

0 commit comments

Comments
 (0)