0 Replies Latest reply on Dec 5, 2017 12:25 PM by brookd

    JAR with import statements seems to mess with same classes loaded via java loader

    brookd Level 1

      Hi Guys and Gals,

       

      Having a weird issue with javaloader and a new JAR I had a developer write for me. My existing code uses itext 2.1.7 and its loaded via Mark Mandel's javaloader (https://github.com/markmandel/JavaLoader) 

       

      The existing code merges PDF's together (and does a better job than CFPDF and isn't crippled. Its not complicated code either. The part of the code in question:

       

      local.outStream = server.javaLoader.create("java.io.FileOutputStream").init( local.fulloutputpath );
      local.copy = server.javaLoader.create("com.lowagie.text.pdf.PdfCopyFields").init(local.outStream);
      local.PdfReader = server.javaLoader.create("com.lowagie.text.pdf.PdfReader");
      

       

      Then it does some work. and then closes the PDF:

       

      local.copy.close();
      

       

      That close() call throws an error java.lang.RuntimeException: The document is not open.  But it only throws that error if I have added this new JAR I had a guy write for me, to the java loader. I haven't even called the single method of this new class, and it is already breaking my existing code. How can that be? Is it the import statements? Do they somehow overwrite the existing itext libs?

       

      The  JAVA source code is below - anybody have any idea how to re-write it (outside of re-writing it in CFML, which I guess is an option too..), so that the references to itext (is it the import statements causing an issue??) don't cause issues with other code and itext loaded via the javaloader:

       

       

      package com.pdfutil;
      import java.io.FileOutputStream;
      import com.lowagie.text.pdf.PRStream;
      import com.lowagie.text.pdf.PdfDictionary;
      import com.lowagie.text.pdf.PdfName;
      import com.lowagie.text.pdf.PdfObject;
      import com.lowagie.text.pdf.PdfReader;
      import com.lowagie.text.pdf.PdfStamper;
      
      /**
       * Utility class for Pdf page number
       *
       */
      public class PageNumberUtil {
      
      
      public static void main(String[] args) {
      
      
      // testing
      String input = "PDF Numbering2.pdf";
      String output = "PDF Numbering2_output.pdf";
      
      
      boolean status = PageNumberUtil.updatePageNumbering(input, output);
      System.out.println("status=" + status);
      }
      
      
      public static boolean updatePageNumbering(String inputPath, String outputPath) {
      
      System.out.println("updatePageNumbering starting...");
      
      boolean status = true;
      try {
      
      
      // create pdf reader
      PdfReader reader = new PdfReader(inputPath);
      
      
      // get total of page
      Integer numOfPages = reader.getNumberOfPages();
      
      
      // loop from 1 to numOfPages
      for (Integer i = 1; i <= numOfPages; i++) {
      
      
      PdfDictionary dictionary = reader.getPageN(i);
      PdfObject object = dictionary.getDirectObject(PdfName.CONTENTS);
      if (object instanceof PRStream) {
      PRStream stream = (PRStream) object;
      byte[] data = PdfReader.getStreamBytes(stream);
      
      
      // find {pagenum} of {pagetotal} placeholders and replace
      String dataStr = new String(data);
      dataStr = dataStr.replace("{pagenum}", i.toString());
      dataStr = dataStr.replace("{pagetotal}", numOfPages.toString());
      
      
      stream.setData(dataStr.getBytes());
      }
      }
      
      
      PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(outputPath));
      stamper.close();
      reader.close();
      } catch (Exception e) {
      e.printStackTrace();
      status = false;
      }
      
      
      System.out.println("updatePageNumbering End...");
      
      return status;
      }
      
      
      }