Code: Select all
/* This Class is a standalone Java application. It reads a folder containing PDF files and generates
* an iGigBook index from it. Presumably, each file represents one song made up of one or more pages.
* The file name is assigned to song name in the index (author is set to "Unknown, Unknown"). The
* files must be PDF files, but a file extension (.PDF) is not required; however, if a file extension
* exists it will be removed for purposes of assigning the song name.
*
* WARNING: The files in the folder are renamed, so you are advised to create a backup copy of the
* folder before running this application.
*
* The files are renamed by giving each file a prefix which identifies the page number for the song
* in the index. The prefix guarantees that when you combine the PDF files (using a tool of your
* choice) you will be able to combine them in the same sequence as in the index. The prefix also
* allows you to keep your songs as separate files and not lose the relationship to the index (which
* is desirable, since once you combine the files it is difficult to reverse the process).
*
* For consistency, the files are sorted (using a TreeMap) by filename before processing (presumably
* using the ascii collating sequence, but that's up to java).
*
* There are 4 required, positional runtime arguments:
*
* (1) PDF folder name: The folder that contains the PDF song files. To be certain of the location,
* you are advised to fully qualify the name.
*
* (2) Starting page number: Since iGigBook doesn't allow you to delete and rebuild the entire index
* every time you make a change, this allows you to start where you left off (assuming you are
* building a book over time).
*
* (3) Output file name: The text file to which the iGigBook index is written. To be certain of the
* location, you are advised to fully qualify the name.
*
* (4) File rewrite indicator: r = write over the output file if it already exists (case ignored),
* Any other value = abend if the output file already exists.
*/
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.util.Collection;
import java.util.Iterator;
import java.util.TreeMap;
import com.itextpdf.text.pdf.PdfReader;
class GenIgigbookIndex {
private class ApplException extends Exception {
private int msgCode;
private ApplException(int msgCode, String msg) {
super(msg);
this.msgCode = msgCode;
}
}
private class Args {
int reqArgs = 4; // required number of arguments
File pdfFolder; // folder containing PDF files
int startPageNum; // starting page number
int minPageNum = 1; // minimum page number
int maxPageNum = 99999; // maximum page number
String filePfxMask = "00000"; // for padding the file prefix
String filePfxSep = "_"; // file prefix separator
PrintWriter outFile; // output file
String outFileStr; // output file name
String fileOverw; // overwrite or new file
}
private Args getArgs(String args[]) throws Exception {
/*
* Validate the runtime arguments and convert each into a useful object
*/
ApplException e = new ApplException(0, "");
Args validArgs = new Args();
if (args.length != validArgs.reqArgs) {
e = new ApplException(1, "Invalid number of arguments, number=" + args.length);
throw e;
}
validArgs.pdfFolder = new File(args[0]);
if (!validArgs.pdfFolder.exists()) {
e = new ApplException(2, "Invalid pdfFolder argument - folder not found, pdfFolder="
+ validArgs.pdfFolder.getAbsolutePath());
throw e;
}
if (!validArgs.pdfFolder.isDirectory()) {
e = new ApplException(3, "Invalid pdfFolder argument - must be a directory, pdfFolder="
+ validArgs.pdfFolder.getAbsolutePath());
throw e;
}
try {
validArgs.startPageNum = Integer.parseInt(args[1]);
} catch (Exception exception) {
e = new ApplException(4, "Invalid startPageNum argument - must be an integer, startPageNum=" + args[1]);
throw e;
}
if (validArgs.startPageNum < validArgs.minPageNum || validArgs.startPageNum > validArgs.maxPageNum) {
e = new ApplException(5,
"Invalid startPageNum argument - out of range, startPageNum=" + validArgs.startPageNum);
throw e;
}
validArgs.outFileStr = args[2];
validArgs.fileOverw = args[3];
File outFile = new File(validArgs.outFileStr);
if (outFile.exists() && !validArgs.fileOverw.equalsIgnoreCase("r")) {
e = new ApplException(6, "Invalid outFile argument - file already exists, outFile=" + validArgs.outFileStr);
throw e;
}
if (outFile.isDirectory()) {
e = new ApplException(7, "Invalid outFile argument - file is a directory, outFile=" + validArgs.outFileStr);
throw e;
}
validArgs.outFile = new PrintWriter(new FileWriter(validArgs.outFileStr));
System.out.println("PDF folder=" + validArgs.pdfFolder.getAbsolutePath());
System.out.println("Starting page number=" + validArgs.startPageNum);
System.out.println("Index output file=" + outFile.getAbsolutePath());
System.out.println("Output file overwrite option=" + validArgs.fileOverw);
return validArgs;
}
private int genIgigIndex(Args validArgs) throws Exception {
/*
* Generate iGigBook index
*/
ApplException e = new ApplException(0, "");
int pageNum = validArgs.startPageNum;
File listOfFile[] = validArgs.pdfFolder.listFiles();
TreeMap<String, String> fileNameTreeMap = new TreeMap<String, String>();
for (int i = 0; i < listOfFile.length; i++) {
String fileName = listOfFile[i].getName();
fileNameTreeMap.put(fileName, fileName);
}
Collection<String> c = fileNameTreeMap.keySet();
Iterator<String> itr = c.iterator();
int fileCount = 0;
while (itr.hasNext()) {
fileCount++;
if (pageNum > validArgs.maxPageNum) {
e = new ApplException(8, "Page number exceeded maximum, pageNum=" + pageNum);
throw e;
}
Object key = itr.next();
String fileName = fileNameTreeMap.get(key).toString();
int indexOfExt = fileName.lastIndexOf('.');
if (indexOfExt < 1) {
indexOfExt = fileName.length();
}
File pdfFile = new File(validArgs.pdfFolder + "\\" + fileName);
PdfReader document = new PdfReader(new FileInputStream(pdfFile));
int noPages = document.getNumberOfPages();
validArgs.outFile.println('"' + fileName.substring(0, indexOfExt) + '"' + "," + pageNum + "," + noPages
+ "," + "\"Unknown, Unknown\"");
String filePfx = validArgs.filePfxMask + pageNum;
String filePfxFixed = filePfx.substring(filePfx.length() - validArgs.filePfxMask.length())
+ validArgs.filePfxSep;
File destFile = new File(validArgs.pdfFolder + "\\" + filePfxFixed + fileName);
pdfFile.renameTo(destFile);
pageNum = pageNum + noPages;
}
return fileCount;
}
public static void main(String[] args) {
GenIgigbookIndex thisMain = new GenIgigbookIndex();
System.out.println(thisMain.getClass().getName() + " started");
int fileCount = 0;
try {
Args validArgs = thisMain.getArgs(args);
fileCount = thisMain.genIgigIndex(validArgs);
validArgs.outFile.close();
} catch (ApplException applException) {
System.err.println("Application abended due to application exception.");
System.err.println("(" + applException.msgCode + ") " + applException.toString());
return;
} catch (Exception exception) {
System.err.println("Application abended due to unexpected exception.");
exception.printStackTrace();
return;
}
System.out.println(thisMain.getClass().getName() + " ended, files processed=" + fileCount);
}
}