Page 1 of 1
		
			
				cannot save to outputstream or ByteArrayOutputStream
				
Posted: 
Fri Jun 02, 2017 6:48 amby fwu
				hello,
Im trying to save a docx file to an outputstream or a ByteArrayOutputStream. Im using the save method like this. Note that Im able to load the file, get the title and cusotm properties. Only the save doesnt works.
- Code: Select all
- WordprocessingMLPackage wordMLPackage=null;
 
 wordMLPackage = WordprocessingMLPackage.load(is);
 
 OutputStream os=null;
 
 wordMLPackage.save(os);
I also tried like this:
- Code: Select all
- ByteArrayOutputStream memoryStream=null;
 
 WordprocessingMLPackage wordMLPackage=null;
 
 wordMLPackage = WordprocessingMLPackage.load(is);
 
 wordMLPackage.save(memoryStream);
they are both failling. Worst than that I dont get any error, although Im using try catch including the generic exception catch. Only a general error on the Alfresco side.
What can be happening here?
ps: im using docx4j-3.2.1.jar
thank you
fwu
 
			
		
			
				Re: cannot save to outputstream or ByteArrayOutputStream
				
Posted: 
Fri Jun 02, 2017 8:12 amby jason
				In both your examples, you are setting the output stream to null.  Really?
			 
			
		
			
				Re: cannot save to outputstream or ByteArrayOutputStream
				
Posted: 
Fri Jun 02, 2017 9:00 amby fwu
				hello,
No, that is not sequencial code. I set it to null before the try block.
I then do this, for instance, for the memorystream:
memoryStream = new ByteArrayOutputStream();
I dont know if I cant get the error due to the fact that I needed to remove/delete the jcl-over-slf4j-1.7.5.jar. Nevertheless, all is working with the exception of the save method. I dont and I beleive I cant save to a file (Im inside Alfresco workflow code where I dont have direct access to the file system). That is why Im using a bytearray or outputstream.
regards,
fwu
			 
			
		
			
				Re: cannot save to outputstream or ByteArrayOutputStream
				
Posted: 
Fri Jun 02, 2017 11:26 amby fwu
				hello,
More info:
When I look to the load method I get this:
WordprocessingMLPackage org.docx4j.openpackaging.packages.WordprocessingMLPackage.load(InputStream is) throws Docx4JException
But when I look to the save method I get this:
void org.docx4j.openpackaging.packages.OpcPackage.save(OutputStream outStream) throws Docx4JException
So, the same object points to different packages? How can this be?
Also,
I get one docx4j error before loading the docx (please note that I can load the docx without any problem):
 ERROR [docx4j.jaxb.NamespacePrefixMapperUtils] [http-apr-8080-exec-2] name: com.sun.xml.internal.bind.namespacePrefixMapper value: org.docx4j.jaxb.NamespacePrefixMapperSunInternal@7e2e27ae .. trying RI.
Can this be a problem for the save method?
Is there any other way of saving a previously open file to a memoery stream?
thank you
			 
			
		
			
				Re: cannot save to outputstream or ByteArrayOutputStream
				
Posted: 
Fri Jun 02, 2017 6:28 pmby jason
				Seems like you are having problems with some basic Java concepts.
Please post a very simple complete example of how you are trying to save to a ByteArrayOutputStream;  then demonstrate it didn't work.  (Hint:  toByteArray)
			 
			
		
			
				Re: cannot save to outputstream or ByteArrayOutputStream
				
Posted: 
Fri Jun 02, 2017 8:35 pmby fwu
				hello
here is the 
- Code: Select all
- InputStream is = null;
 ByteArrayOutputStream memoryStream=null;
 ContentReader oWORDContent=null;
 
 WordprocessingMLPackage wordMLPackage=null;
 
 try {
 
 memoryStream = new ByteArrayOutputStream();
 
 // Get the document from the repo
 NodeRef oNodeRef = new NodeRef("workspace","SpacesStore",docRef);
 
 oWORDContent = getReader(oNodeRef);
 
 // Get content into InputStream
 is = oWORDContent.getContentInputStream();
 
 try {
 
 wordMLPackage = WordprocessingMLPackage.load(is);
 
 
 //custom properties
 org.docx4j.openpackaging.parts.DocPropsCustomPart docPropsCustomPart = wordMLPackage.getDocPropsCustomPart();
 
 // DO things here regarding the properties...
 
 
 System.out.println("before save");
 
 // save to a memory stream
 wordMLPackage.save(memoryStream);
 
 System.out.println("after save");
 
 }
 catch (Docx4JException e) {
 
 System.out.println("error1" );
 
 } catch (Exception e) {
 System.out.println("error2" );
 
 }
 
 // do something here with bytearray... cant reach this
 
 }
 
 catch (IOException e)
 {
 System.out.println("error3");
 
 
 }
 catch(Exception e){
 System.out.println("error4");
 
 }
 
 finally
 {
 System.out.println("I reach this...");
 }
So, I can load the document, get the properties, but I cant save the document. The code doesnt enter in any catch block of the fourth, but it reach the finally block.
thank you jason for your time
 
			
		
			
				Re: cannot save to outputstream or ByteArrayOutputStream
				
Posted: 
Fri Jun 02, 2017 9:18 pmby fwu
				debug info:
ERROR [docx4j.jaxb.NamespacePrefixMapperUtils] [http-apr-8080-exec-9] name: com.sun.xml.internal.bind.namespacePrefixMapper value: org.docx4j.jaxb.NamespacePrefixMapperSunInternal@3332d32c .. trying RI.
before save
I reach this...
			 
			
		
			
				Re: cannot save to outputstream or ByteArrayOutputStream
				
Posted: 
Fri Jun 02, 2017 10:42 pmby fwu
				hello,
It is an error and not an exception.
Here it is:
java.lang.NoSuchMethodError: org.docx4j.openpackaging.packages.WordprocessingMLPackage.save(Ljava/io/OutputStream;)V
	at org.alfresco.extension.wordtoolkit.service.WORDToolkitServiceImpl.mergeDocProperties
So, im calling a method from an object that doesnt have that method. But Im able to do that in development time. However, I can see at development time that the method exists only in another package.
the load method come from here:
WordprocessingMLPackage org.docx4j.openpackaging.packages.WordprocessingMLPackage.load(InputStream is) throws Docx4JException
the save comes from here:
void org.docx4j.openpackaging.packages.OpcPackage.save(OutputStream outStream) throws Docx4JException
So Im able to call both method in development time using the same object, but they come from different packages.
Also, in my pom I only have a dependecy to version 3.2.1. however my compilation will get that version and the 2.8.1 version. Are these problems connected?
			 
			
		
			
				Re: cannot save to outputstream or ByteArrayOutputStream
				
Posted: 
Fri Jun 02, 2017 11:44 pmby jason
				
Using java Syntax Highlighting
import java.io.ByteArrayOutputStream;
import org.docx4j.Docx4J;
import org.docx4j.openpackaging.exceptions.Docx4JException;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
public class test1 
{
        public static void main
(String[] args
) throws Docx4JException 
{
                WordprocessingMLPackage 
pkg = WordprocessingMLPackage.
createPackage();
                ByteArrayOutputStream baos 
= new ByteArrayOutputStream(); 
                Docx4J.
save(pkg, baos
);
                System.
out.
println(baos.
toByteArray().
length);
        }
}
 Parsed in 0.014 seconds,  using 
GeSHi 1.0.8.4
 
  outputs 5454.
fwu wrote:n my pom I only have a dependecy to version 3.2.1. however my compilation will get that version and the 2.8.1 version. Are these problems connected?
You must ensure  you only have 1 version of docx4j on your classpath
 
			
		
			
				Re: cannot save to outputstream or ByteArrayOutputStream
				
Posted: 
Sat Jun 03, 2017 2:19 amby fwu
				jason,
After deleting the old file it works. I thought I had tested that before. Nevertheless, Im not able to avoid the deployment of the old version even using provided in the dependence...
thank you