diff options
| author | Pherrephatta | 2021-07-01 12:34:07 -0400 |
|---|---|---|
| committer | Pherrephatta | 2021-07-01 12:34:07 -0400 |
| commit | ca1db86cbc4f16d7f6acdae8b9c3fcecf4a0a23c (patch) | |
| tree | 2c1e25bd2d956f27ad847a7d926ffdf0aaf20836 | |
| -rw-r--r-- | jar/pdfbox-app-2.0.24.jar | bin | 0 -> 9929598 bytes | |||
| -rw-r--r-- | src/pdf2book/FileConverter.java | 131 | ||||
| -rw-r--r-- | src/pdf2book/Main.java | 223 |
3 files changed, 354 insertions, 0 deletions
diff --git a/jar/pdfbox-app-2.0.24.jar b/jar/pdfbox-app-2.0.24.jar Binary files differnew file mode 100644 index 0000000..9fd1108 --- /dev/null +++ b/jar/pdfbox-app-2.0.24.jar 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); + } +} |
