A próxima geração de dados personalizados para completar o quadro do certificado Parte II: Substituir formato os campos do modelo docx para dados personalizados
Exemplos específicos do código e aqui https://github.com/xuhaojin/certificate-generator
Código é a seguinte:
empacotar com.x.certificate.doc; importação java.io.File; importação java.io.FileInputStream; importação java.io.FileOutputStream; importação Java.io.IOException; importação java.util.List; importação java.util.Set; importação org.apache.commons.lang3.StringUtils; importação org.apache.poi.xwpf.usermodel.IRunBody; importação org.apache.poi.xwpf.usermodel.XWPFDocument; importação org.apache.poi.xwpf.usermodel.XWPFParagraph; importação org.apache.poi.xwpf.usermodel.XWPFRun; importação org.apache.xmlbeans.XmlCursor; importarorg.apache.xmlbeans.XmlException; Import org.apache.xmlbeans.XmlObject; Import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTR; Import com.google.common.collect.Lists; Import com.x.certificate. doc.domain.CertificateData; Import com.x.certificate.doc.domain.CertificateField; / ** * copiar o arquivo de modelo de certificado doc e modificar o conteúdo de um dados personalizados * @author xuhaojin * @version [número da versão de 2020 15 março] * / público classe DocOperator { pública estática toCumstomDoc Arquivo (string templatePath, string OutputPath, certificateData certificateData) lança IOException, XmlException { XWPFDocument documento = novo XWPFDocument ( novo FilelnputStream (templatePath)); Set <string> chaves = certificateData.getKeys (); para (XWPFParagraph parágrafo: document.getParagraphs ()) { XmlCursor cursor = . paragraph.getCTP () newCursor (); cursor.selectPath ( "namespace declarar w = 'http: //schemas.openxmlformats.org/wordprocessingml/2006/main' .//*/w:txbxContent/w:p/w:r" ); Lista <XmlObject> XML Objects = toXmlObjects (cursor); para (XmlObject xmlObject: XML Objects) { CTR ctr =CTR.Factory.parse (xmlObject.xmlText ()); XWPFRun bufferrun = novo (CTR, (IRunBody) n) XWPFRun; String text = bufferrun.getText (0 ); Cordas conformingKey = containsKey (texto, teclas); se (conformingKey =! nula ) { CertificateField fieldInfo = certificateData.getValue (conformingKey); text = text.replace (toTemplateKey (conformingKey), fieldInfo.getContent ()); bufferrun.setFontSize (fieldInfo.getFontSize ()); bufferrun.setFontFamily (fieldInfo.getFontFamily ()); bufferrun.setText (texto, 0 ); bufferrun.setBold (fieldInfo.getIsBold ()); } XmlObject.set (bufferrun.getCTR ()); } } FileOutputStream fora = novo FileOutputStream (OutputPath); document.write (a); out.close (); DOCUMENT.CLOSE (); voltar novo arquivo (OutputPath); } Público static List <XmlObject> toXmlObjects (XmlCursor docXmlCursor) { Lista <XmlObject> XML Objects = Lists.newArrayList (); enquanto (docXmlCursor.hasNextSelection ()) { docXmlCursor.toNextSelection (); xmlObjects.add (docXmlCursor.getObject ()); } Retornar XML Objects; } Pública estática Cordas containsKey (texto String, Set <String> keys) { Cadeia conformando = nulo ; se (StringUtils.isEmpty (texto)) { retornar conformidade; } Para (String chave: chaves) { se (text.contains (chave)) { conformidade =chave; quebrar ; } } retornar conformidade; } Pública estática Cordas toTemplateKey (String chave) { se (StringUtils.isEmpty (chave)) { return nulo ; } Return "$ {" + chave + "}" ; } Pública estática Cordas addBlankSpace (String text) { StringBuffer sb = new StringBuffer (); se (texto == nulo ) { return nulo ; } carvão [] = caracteres text.toCharArray (); Seqüência de regex = "[\ u4E00- \ u9FA5] {1}" ; para ( carvão animal Acar: caracteres) { Cadeia str = Acar + "" ; se (StringUtils.isBlank (str)) { continue ; } Sb.append (Acar); se (str.matches (regex)) { sb.append ( "" ); } } Retornar sb.ToString (); } Pública estática vazios principais (String [] args) throws IOException, XmlException { Cadeia o templatePath = "C: \\ a1579 os utilizadores \\ \\ \\ Template.docx área de trabalho" ; Cadeia OutputPath = "C: \\ a1579 os utilizadores \\ \\ \\ custom.docx área de trabalho" ; CertificateData Dados = new new CertificateData (); data.put ( nova nova CertificateField ( "titular", addBlankSpace ( "Joe Smith"), 34 )); data.put ( nova nova CertificateField ( "certificado de informação chinesa", "Parabéns pela conclusão \" . helicóptero qualificações profissionais piloto \ "formação licenças de curso especial emitido isso!", 18 )); data.put ( nova nova CertificateField ( "informações do certificado em Inglês" , "Parabéns pela conclusão do programa de treinamento de \ "Helicopter Pilot Qualificação \"", 15)); data.put ( novo novo CertificateField ( "No. Certificado", "100 224 512", 18 )); data.put ( novo novo CertificateField ( "assinatura de certificado", addBlankSpace ( "John Doe"), 25 )); data.put ( novo novo CertificateField ( "data de certificado", "2020 21 de março", 15 )); toCumstomDoc (a templatePath, OutputPath, o data); } }
Em que a embalagem primária poi frasco referência, citada abaixo:
< Dependência > < groupId > org.apache.poi </ groupId > < artifactId > poi-OOXML </ artifactId > < versão > 3,17 </ versão > </ dependência > < dependência > < groupId > org.apache.commons </ groupId > < artifactId > commons-lang3 </ artifactId > < versão > 3.7 </versão > </ dependência > < dependência > < groupId > com.google.guava </ groupId > < artifactId > goiaba </ artifactId > < versão > 25.1-jre </ versão > </ dependência >
Docx modelo de certificado é:
Gerado pelo Certificado certificado como um docx personalizado:
formato docx com tais certificados de dados personalizados para gerar boa