Highlighted

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

New Here ,
Dec 05, 2017

Copy link to clipboard

Copied

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;

}

}

TOPICS
Advanced techniques

Views

301

Likes

Translate

Translate

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more

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

New Here ,
Dec 05, 2017

Copy link to clipboard

Copied

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;

}

}

TOPICS
Advanced techniques

Views

302

Likes

Translate

Translate

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
Dec 05, 2017 0

Have something to add?

Join the conversation