好的,所以我一直在查看 Ephesoft 开发人员指南中的以下示例代码......
//import java.io.File;
//
//import javax.xml.transform.Result;
//import javax.xml.transform.Source;
//import javax.xml.transform.Transformer;
//import javax.xml.transform.TransformerConfigurationException;
//import javax.xml.transform.TransformerException;
//import javax.xml.transform.TransformerFactory;
//import javax.xml.transform.TransformerFactoryConfigurationError;
//import javax.xml.transform.dom.DOMSource;
//import javax.xml.transform.stream.StreamResult;
//
//import org.w3c.dom.Document;
//import org.w3c.dom.Element;
//import org.w3c.dom.Node;
//import org.w3c.dom.NodeList;
import com.ephesoft.dcma.script.IScripts;
//--------------------------------------
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.output.XMLOutputter;
//import com.ephesoft.dcma.script.IJDomScript;
/**
* The <code>ScriptDocumentAssembler</code> class represents the script execute structure. Writer of scripts plug-in should implement this IScript
* interface to execute it from the scripting plug-in. Via implementing this interface writer can change its java file at run time.
* Before the actual call of the java Scripting plug-in will compile the java and run the new class file.
*
* @author Ephesoft
* @version 1.0
*/
public class ScriptDocumentAssembler
{
private static final String BATCH_LOCAL_PATH = "BatchLocalPath";
private static final String BATCH_INSTANCE_ID = "BatchInstanceIdentifier";
private static final String EXT_BATCH_XML_FILE = "_batch.xml";
private static final String DOCUMENTS = "Documents";
private static final String DOCUMENT = "Document";
private static final String PAGES = "Pages";
private static final String PAGE = "Page";
private static String ZIP_FILE_EXT = ".zip";
/**
* The <code>execute</code> method will execute the script written by the writer at run time with new compilation of java file. It
* will execute the java file dynamically after new compilation.
*
* @param document {@link Document}
*/
public void execute(Document document, String fieldName, String docIdentifier) {
System.out.println("************* Inside ScriptDocumentAssembler scripts.");
System.out.println("************* Start execution of the ScriptDocumentAssembler scripts.");
System.out.println("Custom ScriptDocumentAssembler, removing Document seperator sheets...");
removeFirstPageOfDoc(document);
boolean isWrite = true;
//boolean isWrite = false;
// write the document object to the XML file.
if (isWrite) {
writeToXML(document);
System.out.println("************* Successfully write the xml file for the ScriptDocumentAssembler scripts.");
} else {
System.out.println("************** No changes performed by ScriptDocumentAssembler scripts.");
}
System.out.println("************* End execution of the ScriptDocumentAssembler scripts.");
}
private void removeFirstPageOfDoc(Document documentFile) {
Element documentsList = (Element) documentFile.getChildren(DOCUMENTS).get(0);
List<?> documentList = documentsList.getChildren(DOCUMENT);
for (int documentIndex = 0; documentIndex < documentList.size(); documentIndex++) {
Element document = (Element) documentList.get(documentIndex);
System.out.println("Processing Document - " + document.getChildren("Identifier").get(0).getText());
Element pages = (Element) document.getChildren(PAGES).get(0);
List<?> pageList = pages.getChildren(PAGE);
Element page = (Element)pageList.get(0);
System.out.println(document.getChildren("Identifier").get(0).getText() + " Page Count = " + pageList.size());
System.out.println("Removing page node " + page.getChildren("Identifier").get(0).getText() + " from " +
document.getChildren("Identifier").get(0).getText());
pages.remove(page);
System.out.println(document.getChildren("Identifier").get(0).getText() + " Page Count = " + pageList.size());
}
}
private void writeToXML(Document document) {
String batchLocalPath = null;
List<?> batchLocalPathList = document.getRootElement().getChildren(BATCH_LOCAL_PATH);
if (null != batchLocalPathList) {
batchLocalPath = ((Element) batchLocalPathList.get(0)).getText();
}
if (null == batchLocalPath) {
System.err.println("Unable to find the local folder path in batch xml file.");
return;
}
String batchInstanceID = null;
List<?> batchInstanceIDList = document.getRootElement().getChildren(BATCH_INSTANCE_ID);
if (null != batchInstanceIDList) {
batchInstanceID = ((Element) batchInstanceIDList.get(0)).getText();
}
if (null == batchInstanceID) {
System.err.println("Unable to find the batch instance ID in batch xml file.");
return;
}
String batchXMLPath = batchLocalPath.trim() + File.separator + batchInstanceID + File.separator + batchInstanceID
+ EXT_BATCH_XML_FILE;
String batchXMLZipPath = batchXMLPath + ZIP_FILE_EXT;
System.out.println("batchXMLZipPath************" + batchXMLZipPath);
OutputStream outputStream = null;
File zipFile = new File(batchXMLZipPath);
FileWriter writer = null;
XMLOutputter out = new XMLOutputter();
try {
if (zipFile.exists()) {
System.out.println("Found the batch xml zip file.");
outputStream = getOutputStreamFromZip(batchXMLPath, batchInstanceID + EXT_BATCH_XML_FILE);
out.output(document, outputStream);
} else {
writer = new java.io.FileWriter(batchXMLPath);
out.output(document, writer);
writer.flush();
writer.close();
}
} catch (Exception e) {
System.err.println(e.getMessage());
} finally {
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException e) {
}
}
}
}
public static OutputStream getOutputStreamFromZip(final String zipName, final String fileName) throws FileNotFoundException, IOException {
ZipOutputStream stream = null;
stream = new ZipOutputStream(new FileOutputStream(new File(zipName + ZIP_FILE_EXT)));
ZipEntry zipEntry = new ZipEntry(fileName);
stream.putNextEntry(zipEntry);
return stream;
}
}
请注意,我没有更改原始代码的任何内容,但我将 jdom 和 ephesoft jar 添加到我的构建路径中。但是,在 removeFirstPageOfDoc 方法中,我仍然收到一堆与转换相关的错误。例如,该行Element documentsList = (Element) documentFile.getChildren(DOCUMENTS).get(0);
应该允许 documentFile 访问 Element 的方法,对吗?但是,它似乎仍然只能访问文档类型的方法。我只是想知道这里可能存在什么问题以及如何解决它?