如何使用docx文档中的合并字段输入参数创建SOAP Web服务?

时间:2018-07-10 10:30:21

标签: java soap docx4j xdocreport

我想使用输入参数创建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();
  }

}

0 个答案:

没有答案