1
\$\begingroup\$

How can this be improved?

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pdf_merging_70112016;

import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfImportedPage;
import com.lowagie.text.pdf.PdfReader;
import com.lowagie.text.pdf.PdfWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import properties.ApplicationProperties;

/**
 *
 * @author
 */
public class PDFMerging {

    public void mergePDF() throws FileNotFoundException {
        ApplicationProperties prop = ApplicationProperties.getInstance();
        prop.loadProperties();
        String temppath = prop.getClickProperty("tempPath");
        String FAQPath = prop.getClickProperty("FAQPath");
        String finalPDFParh = prop.getClickProperty("finalPath");
        String errorPath = prop.getClickProperty("errorPath");
        String outputFilename = "";


        File tempFolder = new File(temppath);
        File FAQFolder = new File(FAQPath);
        File[] listOfTempFiles = tempFolder.listFiles();
        File[] listOfFAQFiles = FAQFolder.listFiles();

        for (int i = 0; i < listOfTempFiles.length; i++) {
            for (int j = 0; j < listOfFAQFiles.length; j++) {
                if (listOfTempFiles[i].isFile() && listOfTempFiles[i].length() > 0) {
                    if (listOfTempFiles[i].getName().toLowerCase().contains(".pdf")) {
                        if (listOfTempFiles[i].getName().substring(listOfTempFiles[i].getName().lastIndexOf("#") + 1).equals(listOfFAQFiles[j].getName())) {
                            try {
                                List<InputStream> list = new ArrayList<InputStream>();
                                list.add(new FileInputStream(listOfTempFiles[i]));
                                list.add(new FileInputStream(listOfFAQFiles[j]));
                                System.out.println(listOfTempFiles[i].getName() + "with FAQ: " + listOfFAQFiles[j].getName());
                                int iend = listOfTempFiles[i].getName().lastIndexOf("#");
                                if (iend != -1) {
                                    outputFilename = listOfTempFiles[i].getName().substring(0, iend);
                                }
                                OutputStream out = new FileOutputStream(new File(finalPDFParh + "/" + outputFilename + ".pdf"));
                                doMerge(list, out);
                                list.clear();
                            } catch (FileNotFoundException e) {
                                e.printStackTrace();
                            } catch (DocumentException e) {
                                e.printStackTrace();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                        if (listOfTempFiles[i].getName().substring(listOfTempFiles[i].getName().lastIndexOf("#") + 1).toUpperCase().contains("NA")) {
                            int iend = listOfTempFiles[i].getName().lastIndexOf("#");
                            if (iend != -1) {
                                outputFilename = listOfTempFiles[i].getName().substring(0, iend);
                            }
                            listOfTempFiles[i].renameTo(new File(finalPDFParh + "/" + outputFilename + ".pdf"));


                        }






                    }
                } else {
                    listOfTempFiles[i].renameTo(new File(errorPath + "/" + outputFilename + ".pdf"));
                }

            }
        }

    }

    public static void doMerge(List<InputStream> list, OutputStream outputStream)
            throws DocumentException, IOException {
        Document document = new Document();
        PdfWriter writer = PdfWriter.getInstance(document, outputStream);
        document.open();
        PdfContentByte cb = writer.getDirectContent();

        for (InputStream in : list) {
            PdfReader reader = new PdfReader(in);
            for (int i = 1; i <= reader.getNumberOfPages(); i++) {
                document.newPage();
                //import the page from source pdf
                PdfImportedPage page = writer.getImportedPage(reader, i);
                //add the page to the destination pdf
                cb.addTemplate(page, 0, 0);
            }
        }

        outputStream.flush();
        document.close();
        outputStream.close();
    }
}
\$\endgroup\$
1

1 Answer 1

1
\$\begingroup\$
  • Remove the automatically generated comment at the top of the file.
  • Instead of using printStackTrace, either throw the exception or log the (expected) exception and continue.
  • Any file you open must be closed again. Use try-with-resources for that.
  • list.clear() is unnecessary. Just let the garbage collector do its work.
  • Use for (File faqFile : faqFiles) instead of counting j.
  • Since listOfFAQFiles is not a list but an array, don't call it list. Just faqFiles is simpler and enough.
  • Instead of passing open streams around, prefer to pass the files. This makes it easier to close the streams, even when an exception occurs.
\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.