Friday, December 15, 2017

HTML Text to Document with DOX4J

HTML Text to Document with DOCX4J


Pada kesempatan ini, kami akan menjelaskan salah satu fungsi dari DOCX4J untuk merubah text HTML menjadi dokumen bertipe .docx atau .doc. DOCX4J adalah sebuah library yang dikhususkan untuk melakukan manipulasi kepada Office open XML document, seperti DOCX, XLSX dan PPTX. Untuk keterangan lebih lengkap dapat dilihat pada PDF yang dapat diunduh pada link berikut :

Langkah pertama adalah untuk mendefinisikan class HtmlToDocVO yang berisi objek yang terdiri dari 2 variable, yaitu : input yang berisi text HTML yang akan diubah menjadi dokumen dan  fileName yang berisi nama dari dokumen hasil dari dari perubahan :

@Data
public class HTMLToDocVO
{
    private String fileName;
    private String input;
}

Selanjutnya adalah membuat sebuh fungsi di dalam servis yang bernama uploadHtmlToDoc yang menerima input objek HTMLToDocVO yang mengembalikan String :

public String uploadHtmlToDoc(HTMLToDocVO htmlToDocVO) {
       String output="";

        return output;
    }

Di dalam fungsi tersebut sebuah objek bawaan dari DOCX4J yang berfungsi sebagai untuk membuat sebuah blank word document package yang nantinya akan menjadi file dokumen hasil perubahan dari HTML text ke dokumen word :

WordprocessingMLPackage wordMLPackage = null;
 try { 
wordMLPackage = 
            WordprocessingMLPackage.createPackage();
} catch (InvalidFormatException e) {
            e.printStackTrace();
}

Selanjutnya yang kita butuhkan adalah XHTMLImporterImpl dan HTMLSettings yang berfungsi untuk memproses input HTML text yang kita berikan dan mengubahnya menjadi konten yang mengisi dokumen :

HTMLImporterImpl XHTMLImporter = 
            new XHTMLImporterImpl(wordMLPackage);
try {
wordMLPackage.getMainDocumentPart().getContent().addAll(
            XHTMLImporter.convert( input, null) );
} catch (Docx4JException e) {
            e.printStackTrace();
}
HTMLSettings htmlSettings = Docx4J.createHTMLSettings();
htmlSettings.setWmlPackage(wordMLPackage);

Tahap terakhir adalah menyimpan wordMLPackage menjadi file dokumen word yang sebenarnya di path yang sudah ditentukan sebelumnya :

try {
  wordMLPackage.save(actualFile);
} catch (Docx4JException e) {
            e.printStackTrace();
}

Untuk merangkum semua servis untuk merubah HTML text ke document adalah seperti berikut :


    public String uploadHtmlToDoc(HTMLToDocVO htmlToDocVO) {

        String destPath="C:/Users/Lenovo/Documents/Temp";

        //for creating temporary document file
        File dir = new File (destPath);
        File actualFile = 
          new File (dir, htmlToDocVO.getFileName());
        String input=htmlToDocVO.getInput();

        //e.g /home/oracle/temp/test.docx
        String namePathFile = 
          destPath+"/"+htmlToDocVO.getFileName();


        try {
            input = java.net.URLDecoder.decode
                    (input, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        //To remove <br> and add </img> 
        //so that the html script will be proper
        input = input.replaceAll("<br>","<br/>");
        input = input.replaceAll("<img(.+?)>", 
            "<center><img$1></img></center>");
        input = input.replaceAll
            ("width(.+?)\"", "width:30%;\"");
 
        WordprocessingMLPackage wordMLPackage = null;
        try {
            wordMLPackage = 
              WordprocessingMLPackage.createPackage();
        } catch (InvalidFormatException e) {
            e.printStackTrace();
        }
        XHTMLImporterImpl XHTMLImporter = 
            new XHTMLImporterImpl(wordMLPackage);
        try {
            wordMLPackage.getMainDocumentPart()
                    .getContent().addAll(
                    XHTMLImporter.convert( input, null) );
        } catch (Docx4JException e) {
            e.printStackTrace();
        }
        HTMLSettings htmlSettings = 
            Docx4J.createHTMLSettings();
        htmlSettings.setWmlPackage(wordMLPackage);


        try {

            wordMLPackage.save(actualFile);
        } catch (Docx4JException e) {
            e.printStackTrace();
        }
        
        String output="Done";

        return output;
    }

No comments:

Post a Comment