summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/pdf2book/FileConverter.java131
-rw-r--r--src/pdf2book/Main.java223
2 files changed, 354 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;
+ }
+}
diff --git a/src/pdf2book/Main.java b/src/pdf2book/Main.java
new file mode 100644
index 0000000..6e73312
--- /dev/null
+++ b/src/pdf2book/Main.java
@@ -0,0 +1,223 @@
+package pdf2book;
+
+import java.awt.BorderLayout;
+import java.awt.EventQueue;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.File;
+import java.io.IOException;
+
+import javax.swing.JFrame;
+import javax.swing.JPanel;
+import javax.swing.border.EmptyBorder;
+import javax.swing.BoxLayout;
+import javax.swing.ButtonGroup;
+import javax.swing.DefaultListModel;
+import javax.swing.JButton;
+import javax.swing.JFileChooser;
+import javax.swing.JLabel;
+import javax.swing.JRadioButton;
+import java.awt.Color;
+import javax.swing.JMenuBar;
+import javax.swing.JMenu;
+import javax.swing.JMenuItem;
+import java.awt.Dimension;
+import javax.swing.JScrollPane;
+import javax.swing.ScrollPaneConstants;
+import javax.swing.JList;
+
+public class Main extends JFrame {
+
+ private JPanel contentPane;
+ private boolean isQuarters = true;
+ private JList<String> logList;
+ private DefaultListModel<String> model = new DefaultListModel<String>();
+ private File original;
+ private File arranged;
+ private final JFileChooser fc = new JFileChooser();
+
+ /**
+ * Launch the application.
+ */
+ public static void main(String[] args) {
+ EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ try {
+ Main frame = new Main();
+ frame.setVisible(true);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ });
+ }
+
+ /**
+ * Create the frame.
+ */
+ public Main() {
+ setTitle("pdf2tinybook");
+ final JFileChooser fc = new JFileChooser();
+
+ setMaximumSize(new Dimension(500, 500));
+ setResizable(false);
+ setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+ setBounds(100, 100, 450, 300);
+
+
+ // Menu bar
+ JMenuBar menuBar = new JMenuBar();
+ setJMenuBar(menuBar);
+ JMenu fileMenu = new JMenu("File");
+ menuBar.add(fileMenu);
+ JMenuItem quitFileItem = new JMenuItem("Quit");
+ quitFileItem.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent arg0) {
+ System.exit(0);
+ }
+ });
+ fileMenu.add(quitFileItem);
+
+ JMenu helpMenu = new JMenu("Help");
+ menuBar.add(helpMenu);
+
+ JMenuItem rektHelpItem = new JMenuItem("Get rekt");
+ helpMenu.add(rektHelpItem);
+ contentPane = new JPanel();
+ contentPane.setBackground(Color.WHITE);
+ contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
+ contentPane.setLayout(new BorderLayout(0, 0));
+ setContentPane(contentPane);
+
+
+ // Main panel
+ JPanel mainPanel = new JPanel();
+ mainPanel.setBackground(Color.WHITE);
+ contentPane.add(mainPanel, BorderLayout.CENTER);
+ mainPanel.setLayout(new BorderLayout(0, 0));
+ JPanel centerPanel = new JPanel();
+ centerPanel.setBackground(Color.WHITE);
+ mainPanel.add(centerPanel);
+ centerPanel.setLayout(new BoxLayout(centerPanel, BoxLayout.X_AXIS));
+
+
+ // Log panel
+ logList = new JList<String>(model);
+ logList.setBackground(new Color(220, 220, 220));
+ JScrollPane scrollPane = new JScrollPane(logList);
+ scrollPane.setPreferredSize(new Dimension(259, 150));
+ scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
+ mainPanel.add(scrollPane, BorderLayout.SOUTH);
+
+
+ // Options Panel
+ JPanel optionsPanel = new JPanel();
+ centerPanel.add(optionsPanel);
+ optionsPanel.setBackground(Color.WHITE);
+ optionsPanel.setLayout(new BoxLayout(optionsPanel, BoxLayout.Y_AXIS));
+ JRadioButton radioQuarters = new JRadioButton("Quarters");
+ optionsPanel.add(radioQuarters);
+ radioQuarters.setBackground(Color.WHITE);
+ radioQuarters.setSelected(true);
+ radioQuarters.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent arg0) {
+ if (!isQuarters)
+ model.insertElementAt("Pages set to quarters.", 0);
+ isQuarters = true;
+ }
+ });
+ JRadioButton radioSixteenths = new JRadioButton("Sixteenths");
+ optionsPanel.add(radioSixteenths);
+ radioSixteenths.setBackground(Color.WHITE);
+ radioSixteenths.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent arg0) {
+ if (isQuarters)
+ model.insertElementAt("Pages set to sixteenths.", 0);
+ isQuarters = false;
+ }
+ });
+ ButtonGroup radioGroup = new ButtonGroup();
+ radioGroup.add(radioQuarters);
+ radioGroup.add(radioSixteenths);
+ JLabel spacerLabel = new JLabel(" ");
+ spacerLabel.setBackground(Color.WHITE);
+ optionsPanel.add(spacerLabel);
+ // Selection button
+ JButton choiceButton = new JButton("Choose PDF...");
+ choiceButton.addActionListener(new ActionListener() {
+
+ @Override
+ public void actionPerformed(ActionEvent arg0) {
+ int returnVal = fc.showOpenDialog(Main.this);
+ if (returnVal == JFileChooser.APPROVE_OPTION) {
+
+ original = fc.getSelectedFile();
+
+ int i = original.getName().lastIndexOf('.');
+ String extension = i > 0 ? original.getName().substring(i+1).toLowerCase() : original.getName();
+
+ if (extension.equals("pdf")) {
+ model.insertElementAt("Opening: " + original.getName() + ".", 0);
+ }
+ else {
+ model.insertElementAt("Selected file isn't a PDF...", 0);
+ original = null;
+ }
+ }
+ }
+
+ });
+ optionsPanel.add(choiceButton);
+
+
+ // Spacer panel
+ JPanel spacerPanel = new JPanel();
+ spacerPanel.setBackground(Color.WHITE);
+ centerPanel.add(spacerPanel);
+
+
+ // Convert
+ JPanel convertPanel = new JPanel();
+ centerPanel.add(convertPanel);
+ convertPanel.setLayout(new BoxLayout(convertPanel, BoxLayout.X_AXIS));
+ JButton convertButton = new JButton("Convert");
+ convertButton.setMinimumSize(new Dimension(89, 30));
+ convertButton.setMaximumSize(new Dimension(89, 30));
+ convertButton.setPreferredSize(new Dimension(89, 30));
+ convertButton.addActionListener(new ActionListener() {
+
+ @Override
+ public void actionPerformed(ActionEvent arg0) {
+
+ if (original != null) {
+
+ int returnVal = fc.showSaveDialog(Main.this);
+ if (returnVal == JFileChooser.APPROVE_OPTION) {
+ arranged = fc.getSelectedFile();
+ }
+
+ try {
+ FileConverter converter = new FileConverter(original, arranged);
+ converter.convert(isQuarters);
+ model.insertElementAt("Saved to: " + arranged.getAbsolutePath(), 0);
+ arranged = null;
+ original = null;
+ model.insertElementAt("Select a new file.", 0);
+ } catch (IOException e) {
+ model.insertElementAt("Something went wrong... Conversion aborted.", 0);
+ arranged = null;
+ original = null;
+ model.insertElementAt("Selected file closed.", 0);
+ }
+ }
+ else {
+ model.insertElementAt("Please select a file to convert.", 0);
+ }
+ }
+ });
+ convertPanel.add(convertButton);
+ }
+}