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;
}
}
Have something to add?