diff options
Diffstat (limited to 'src/pdf2book/FileConverter.java')
| -rw-r--r-- | src/pdf2book/FileConverter.java | 131 |
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; + } +} |
