B4J Question Problem opening Word Document

hatzisn

Expert
Licensed User
Longtime User
I have a problem opening a word document. I have never tried it before and I do not know what is wrong. I am using a new B4XPages project and this code in B4XMainPage. I also use jPOI 5.01 and Java 19.0.2. I tried different approaches I found in the forum and the error is always the same. In the following spoiler there is the error. Where am I making a mistake?

WARNING: package com.sun.javafx.embed.swing.oldimpl not in javafx.swing
Waiting for debugger to connect...
Program started.
Call B4XPages.GetManager.LogEvents = True to enable logging B4XPages events.
1
2
Error occurred on line: 86 (B4XMainPage)
java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:119)
at java.base/java.lang.reflect.Method.invoke(Method.java:578)
at anywheresoftware.b4j.object.JavaObject.RunMethod(JavaObject.java:132)
at b4j.example.b4xmainpage._mysub(b4xmainpage.java:165)
at b4j.example.b4xmainpage._tryittoloadtext(b4xmainpage.java:98)
at b4j.example.b4xmainpage._button1_click(b4xmainpage.java:84)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
at java.base/java.lang.reflect.Method.invoke(Method.java:578)
at anywheresoftware.b4a.shell.Shell.runMethod(Shell.java:629)
at anywheresoftware.b4a.shell.Shell.raiseEventImpl(Shell.java:234)
at anywheresoftware.b4a.shell.Shell.raiseEvent(Shell.java:167)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
at java.base/java.lang.reflect.Method.invoke(Method.java:578)
at anywheresoftware.b4a.BA.raiseEvent2(BA.java:111)
at anywheresoftware.b4a.shell.ShellBA.raiseEvent2(ShellBA.java:100)
at anywheresoftware.b4a.BA$1.run(BA.java:236)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:457)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:456)
at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:184)
at java.base/java.lang.Thread.run(Thread.java:1589)
Caused by: java.lang.NoClassDefFoundError: org/openxmlformats/schemas/wordprocessingml/x2006/main/DocumentDocument$Factory
at org.apache.poi.xwpf.usermodel.XWPFDocument.onDocumentRead(XWPFDocument.java:161)
at org.apache.poi.ooxml.POIXMLDocument.load(POIXMLDocument.java:169)
at org.apache.poi.xwpf.usermodel.XWPFDocument.<init>(XWPFDocument.java:126)
at b4j.example.b4xmainpage.readDocxFile(b4xmainpage.java:226)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
... 22 more
Caused by: java.lang.ClassNotFoundException: org.openxmlformats.schemas.wordprocessingml.x2006.main.DocumentDocument$Factory
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
... 27 more

B4X:
Sub Class_Globals
    Private Root As B4XView
    Private xui As XUI
End Sub

Public Sub Initialize
'    B4XPages.GetManager.LogEvents = True
End Sub

'This event will be called once, before the page becomes visible.
Private Sub B4XPage_Created (Root1 As B4XView)
    Root = Root1
    Root.LoadLayout("MainPage")
End Sub

'You can see the list of page related events in the B4XPagesManager object. The event name is B4XPage.

Private Sub Button1_Click
    TryItToLoadText("c:\Nikos","MyDoc.docx")
End Sub

Sub TryItToLoadText(Dir As String, Filename As String)
        MySub
   
   
'        Return
'  
'        Dim sb As StringBuilder
'        sb.Initialize
'  
'        Dim doc As JavaObject = OpenDocx(Dir, Filename)
'        Dim paragraphs As List = doc.RunMethod("getParagraphs", Null)
'        For Each p As JavaObject In paragraphs
'            Dim runs As List = p.RunMethod("getRuns", Null)
'            If runs.IsInitialized Then
'                For Each r As JavaObject In runs
'                    Dim text As String = r.RunMethod("getText", Array(0))
'                    If text <> Null Then
''                        For Each key As String In m.Keys
''                            If text.Contains("$" & key & "$") Then
''                                r.RunMethod("setText", Array(" " & m.Get(key) & " ", 0))
''                            End If
''                        Next
'                           sb.Append(text)
'                    End If
'                Next
'                sb.Append(CRLF)
'            End If
'        Next
'        'SaveDocument(doc, File.DirApp , "Document" & c & ".docx")
'        Log(sb.ToString)
   
End Sub

Sub SaveDocument(doc As JavaObject, Dir As String, FileName As String)
    Dim out As OutputStream = File.OpenOutput(Dir, FileName, False)
    doc.RunMethod("write", Array(out))
    out.Close
End Sub

Sub OpenDocx(Dir As String, FileName As String) As JavaObject
    Dim inps As InputStream = File.OpenInput(Dir, FileName)
    Dim document As JavaObject
    document.InitializeNewInstance("org.apache.poi.xwpf.usermodel.XWPFDocument", _
       Array(inps))
    Return document
End Sub

Sub CreateNewDocx() As JavaObject 'ignore not used in this example
    Dim document As JavaObject
    document.InitializeNewInstance("org.apache.poi.xwpf.usermodel.XWPFDocument", _
       Null)
    Return document
End Sub


Sub MySub
    Dim jo As JavaObject = asJO(Me)
    jo.RunMethod("readDocxFile",Array("c:/Nikos/MyDoc.docx"))
End Sub
Sub asJO(o As JavaObject)As JavaObject
    Return o
End Sub
#if java
import java.io.File;
import java.io.FileInputStream;
import java.util.List;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;


public static void readDocxFile(String fName) {
    try {
        File file = new File(fName);
        System.out.println("1");
        FileInputStream fis = new FileInputStream(file.getAbsolutePath());
        System.out.println("2");
        XWPFDocument document = new XWPFDocument(fis);
        System.out.println("3");
        List<XWPFParagraph> paragraphs = document.getParagraphs();

        for (XWPFParagraph para : paragraphs) {
            System.out.println(para.getText());
        }
        fis.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
#End If
 
Last edited:

hatzisn

Expert
Licensed User
Longtime User
Maybe you need this class library in the java code...
Java:
import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;

Thank you for the reply. Here is what I get:

org.openxmlformats.schemas.wordprocessingml.x2006.main does not exist
import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;
^
1 error
 
Upvote 0
Top