summaryrefslogtreecommitdiff
path: root/src/pdf2book/FileConverter.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/pdf2book/FileConverter.java')
-rw-r--r--src/pdf2book/FileConverter.java131
1 files changed, 131 insertions, 0 deletions
diff --git a/src/pdf2book/FileConverter.java b/src/pdf2book/FileConverter.java
new file mode 100644
index 0000000..a4ca54a
--- /dev/null
+++ b/src/pdf2book/FileConverter.java
@@ -0,0 +1,131 @@
+package pdf2book;
+
+import org.apache.pdfbox.pdmodel.PDDocument;
+import org.apache.pdfbox.pdmodel.PDPage;
+
+import java.io.File;
+import java.io.IOException;
+
+import java.util.ArrayList;
+
+public class FileConverter {
+
+ private File inputFile;
+ private File outputFile;
+
+ FileConverter(File inputFile, File outputFile) throws IOException {
+ this.inputFile = inputFile;
+ this.outputFile = outputFile;
+ }
+
+ boolean convert(boolean isQuarters) throws IOException {
+
+ //Loading an existing PDF document
+ PDDocument original = PDDocument.load(inputFile); //Input file name goes here
+
+ //Rearrange pages to make the division
+ while (original.getNumberOfPages() % 4 != 0) {
+ original.addPage(new PDPage());
+ }
+ ArrayList<PDDocument> originalDivisions = new ArrayList<PDDocument>();
+ originalDivisions.add(new PDDocument());
+ int size = original.getNumberOfPages() / 4;
+ int divisionNumber = 0;
+
+ for (int i = 0; i < size; i++) {
+ originalDivisions.get(divisionNumber).addPage(original.getPage(4 * i));
+ originalDivisions.get(divisionNumber).addPage(original.getPage(4 * i + 1));
+ originalDivisions.get(divisionNumber).addPage(original.getPage(4 * i + 2));
+ originalDivisions.get(divisionNumber).addPage(original.getPage(4 * i + 3));
+ if ((i + 1) * Math.ceil(size / 8.0) / size >= divisionNumber + 1) {
+ if(i + 1 < size) {
+ originalDivisions.add(new PDDocument());
+ }
+ divisionNumber++;
+ }
+ }
+
+ //Add pages to correct count
+ ArrayList<PDDocument> arrangedDivisions = new ArrayList<PDDocument>();
+ for (PDDocument doc : originalDivisions) {
+ PDDocument temp = new PDDocument();
+ for (int i = 0; i < (32 - doc.getNumberOfPages()) / 2; i++) {
+ temp.addPage(new PDPage());
+ }
+ for (int i = 0; i < doc.getNumberOfPages(); i++) {
+ temp.addPage(doc.getPage(i));
+ }
+ for (int i = 0; i < (32 - doc.getNumberOfPages()) / 2; i++) {
+ temp.addPage(new PDPage());
+ }
+ arrangedDivisions.add(temp);
+ }
+
+ //Rearrange Pages
+ ArrayList<PDDocument> rearrangedDivisions = isQuarters ?
+ rearrangeQuarters(arrangedDivisions) :
+ rearrangeSixteenths(arrangedDivisions);
+
+ //Combine Pages
+ PDDocument rearranged = new PDDocument();
+ for (PDDocument doc : rearrangedDivisions) {
+ for (int i = 0; i < doc.getNumberOfPages(); i++) {
+ rearranged.addPage(doc.getPage(i));
+ }
+ }
+
+ //Save PDF document and close
+ rearranged.save(outputFile); //Output file name goes here
+
+ //Close all documents
+ for (PDDocument doc : rearrangedDivisions) {
+ doc.close();
+ }
+ for (PDDocument doc : arrangedDivisions) {
+ doc.close();
+ }
+ for (PDDocument doc : originalDivisions) {
+ doc.close();
+ }
+ rearranged.close();
+ original.close();
+
+ return true;
+ }
+
+ ArrayList<PDDocument> rearrangeQuarters(ArrayList<PDDocument> arrangedDivisions) throws IOException {
+ ArrayList<PDDocument> rearrangedDivisions = new ArrayList<PDDocument>();
+ for (PDDocument doc : arrangedDivisions) {
+ PDDocument temp = new PDDocument();
+ for (int i = 0; i < 16; i+=4) {
+ for (int j = 0; j < 4; j+=2) {
+ temp.addPage(doc.getPage(i + j));
+ temp.addPage(doc.getPage(31 - i - j));
+ }
+ for (int j = 1; j < 4; j+=2) {
+ temp.addPage(doc.getPage(i + j));
+ temp.addPage(doc.getPage(31 - i - j));
+ }
+ }
+ rearrangedDivisions.add(temp);
+ }
+ return rearrangedDivisions;
+ }
+
+ ArrayList<PDDocument> rearrangeSixteenths(ArrayList<PDDocument> arrangedDivisions) throws IOException {
+ ArrayList<PDDocument> rearrangedDivisions = new ArrayList<PDDocument>();
+ for (PDDocument doc : arrangedDivisions) {
+ PDDocument temp = new PDDocument();
+ for (int i = 0; i < 16; i+=2) {
+ temp.addPage(doc.getPage(i));
+ temp.addPage(doc.getPage(31 - i));
+ }
+ for (int i = 1; i < 16; i+=2) {
+ temp.addPage(doc.getPage(i));
+ temp.addPage(doc.getPage(31 - i));
+ }
+ rearrangedDivisions.add(temp);
+ }
+ return rearrangedDivisions;
+ }
+}