我想使用输入参数创建SOAP Web服务,这些输入参数是来自docx文件的合并字段。我有一个Java类,我在其中使用Freemarker和xDocReport读取这些值,向它们添加值,然后通过docx4j将文档转换为PDF。我在JDeveloper中使用weblogic服务器。
所以我的问题是:如何获取Web服务请求中的诸如输入参数之类的合并字段值,以使用转换后的PDF文件中编写的此参数获得响应?
这是我读取值并将docx转换为PDF的地方:
public class Final1Convertion {
public InputStream loadDocumentAsStream(String filePath) throws IOException {
//URL url =new File(filePath).toURL();
URL url = new File(filePath).toURI().toURL();
InputStream documentTemplateAsStream = null;
documentTemplateAsStream = url.openStream();
return documentTemplateAsStream;
}
public IXDocReport loadDocumentAsIDocxReport(InputStream documentTemplateAsStream,
TemplateEngineKind freemarkerOrVelocityTemplateKind) throws IOException,
XDocReportException {
IXDocReport xdocReport =
XDocReportRegistry.getRegistry().loadReport(documentTemplateAsStream, freemarkerOrVelocityTemplateKind);
return xdocReport;
}
public IContext replaceVariabalesInTemplateOtherThanImages(IXDocReport report,
Map < String, Object > variablesToBeReplaced) throws XDocReportException {
IContext context = report.createContext();
for (Map.Entry < String, Object > variable: variablesToBeReplaced.entrySet()) {
context.put(variable.getKey(), variable.getValue());
}
return context;
}
public void replaceImagesVariabalesInTemplate(IXDocReport report, Map < String, String > variablesToBeReplaced,
IContext context) {
FieldsMetadata metadata = new FieldsMetadata();
for (Map.Entry < String, String > variable: variablesToBeReplaced.entrySet()) {
metadata.addFieldAsImage(variable.getKey());
context.put(variable.getKey(), new FileImageProvider(new File(variable.getValue()), true));
}
report.setFieldsMetadata(metadata);
}
public byte[] generateMergedOutput(IXDocReport report, IContext context) throws XDocReportException, IOException {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
report.process(context, outputStream);
return outputStream.toByteArray();
}
public byte[] mergeAndGenerateOutput(String templatePath, TemplateEngineKind templateEngineKind,
Map < String, Object > nonImageVariableMap,
Map < String, String > imageVariablesWithPathMap) throws IOException,
XDocReportException {
InputStream inputStream = loadDocumentAsStream(templatePath);
IXDocReport xdocReport = loadDocumentAsIDocxReport(inputStream, templateEngineKind);
IContext context = replaceVariabalesInTemplateOtherThanImages(xdocReport, nonImageVariableMap);
replaceImagesVariabalesInTemplate(xdocReport, imageVariablesWithPathMap, context);
byte[] mergedOutput = generateMergedOutput(xdocReport, context);
return mergedOutput;
}
public byte[] generatePDFOutputFromDocx(byte[] docxBytes) throws XDocReportException, IOException, Docx4JException {
ByteArrayOutputStream pdfByteOutputStream = new ByteArrayOutputStream();
WordprocessingMLPackage wordprocessingMLPackage = null;
wordprocessingMLPackage = WordprocessingMLPackage.load(new ByteArrayInputStream(docxBytes));
PdfSettings pdfSettings = new PdfSettings();
PdfConversion docx4jViaXSLFOconverter =
new org.docx4j.convert.out.pdf.viaXSLFO.Conversion(wordprocessingMLPackage);
docx4jViaXSLFOconverter.output(pdfByteOutputStream, pdfSettings);
return pdfByteOutputStream.toByteArray();
}
public byte[] mergeAndGeneratePDFOutput(String templatePath, TemplateEngineKind templateEngineKind,
Map < String, Object > nonImageVariableMap,
Map < String, String > imageVariablesWithPathMap) throws IOException,
XDocReportException,
Docx4JException {
InputStream inputStream = loadDocumentAsStream(templatePath);
IXDocReport xdocReport = loadDocumentAsIDocxReport(inputStream, templateEngineKind);
IContext context = replaceVariabalesInTemplateOtherThanImages(xdocReport, nonImageVariableMap);
replaceImagesVariabalesInTemplate(xdocReport, imageVariablesWithPathMap, context);
byte[] mergedOutput = generateMergedOutput(xdocReport, context);
byte[] pdfBytes = generatePDFOutputFromDocx(mergedOutput);
return pdfBytes;
}
}
这是我测试的地方:
public class Final1ConvertionMainClass {
public void testMergeAndGenerateOutput() throws IOException, XDocReportException, Docx4JException {
String templatePath = "D:/Users/Desktop/OPIT/Template.docx";
Map < String, Object > nonImageVariableMap = new HashMap < String, Object > ();
nonImageVariableMap.put("date", "10-July-2018");
nonImageVariableMap.put("name", "Harry Potter");
nonImageVariableMap.put("website", "");
nonImageVariableMap.put("author_name", "I.H.");
Map < String, String > imageVariablesWithPathMap = new HashMap < String, String > ();
imageVariablesWithPathMap.put("header_image_logo", "D:/Users/Desktop/OPIT/logo.png");
Final1Convertion docxDocumentMergerAndConverter = new Final1Convertion();
byte[] mergedOutput = docxDocumentMergerAndConverter.mergeAndGeneratePDFOutput(templatePath, TemplateEngineKind.Freemarker, nonImageVariableMap, imageVariablesWithPathMap);
FileOutputStream os = new FileOutputStream("D:/Users/Desktop/OPIT/Output" + System.nanoTime() + ".pdf");
os.write(mergedOutput);
os.flush();
os.close();
}
public static void main(String[] argc) throws IOException, XDocReportException, Docx4JException {
Final1ConvertionMainClass con = new Final1ConvertionMainClass();
con.testMergeAndGenerateOutput();
}
}