I have a code for adding watermark to existing .doc file.
The following is the code I have tried so far
public static void main(String[] args)
{
try
{
XWPFDocument xDoc = new XWPFDocument(new FileInputStream("test.doc"));
XWPFHeaderFooterPolicy xFooter = new XWPFHeaderFooterPolicy(xDoc);
xFooter.createWatermark("My Watermark");
}
catch(Exception e) {
e.printStackTrace();
}
}
The following is what I got
Exception in thread "main" java.lang.NoSuchMethodError: org.apache.poi.util.IOUtils.copy(Ljava/io/InputStream;Ljava/io/OutputStream;)V
at org.apache.poi.util.PackageHelper.open(PackageHelper.java:50)
at org.apache.poi.xwpf.usermodel.XWPFDocument.<init>(XWPFDocument.java:71)
at com.avi.Test.ReadDoc.main(Watermark.java:38)
I got this error today:
"java.lang.NoSuchMethodError:org.apache.poi.util.POILogger.log(I[Ljava/lang/Object;)V]"
It looks different from your error, but quite similar. FYI, I'm using maven to manage jars. After some experiment, I found out the root case is the poi.jar and poi-ooxml.jar's version are not consistent.
This configuration will get an error:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.12</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.13</version>
</dependency>
I changed the version of poi.jar from 3.12 to 3.13
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.13</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.13</version>
</dependency>
bingo, problem solved. I hope this will help someone who ran into this kind of Exception.
See the Apache POI FAQ entry on this very topic. What has almost certainly happened is that you have added a new copy of POI to your classpath, but an older version was already there (from an earlier need, your framework etc), and Java is now getting confused about which one to use.
Firstly, you'll want to use a snippet of code like this to work out where POI is coming from:
ClassLoader classloader =
org.apache.poi.poifs.filesystem.POIFSFileSystem.class.getClassLoader();
URL res = classloader.getResource(
"org/apache/poi/poifs/filesystem/POIFSFileSystem.class");
String path = res.getPath();
System.out.println("Core POI came from " + path);
Use that to identify the older jar(s) and remove them.
Then, use the POI Components Page to work out what Jars you need to use, and what their dependencies are. Finally, add the latest jars to your classpath, and you'll be good to go!
You almost certainly have an older version of POI on your classpath.
See The Apache POI FAQ
Go here:
http://poi.apache.org/download.html
download the tar.gz -> extract it and add to the build classPath all the jars from it.
I got same problems like you,the solution is you need to import all jar files to run your program.These are mandatory for running your project
- Poi-3.10-Final.jar
- Poi-ooxml-3.10-Final.jar
- Poi-ooxml-schemas-3.10.jar
- Xmlbeans-2.30.jar
From the very beginning, poi-ooxml and poi version must be identical.
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.16</version> <---------------this.
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.16</version> <---------------this.
</dependency>