iText image in java servlet

2020-03-24 09:13发布

问题:

I'm doing the letter generation with iText (pdf/rtf) in java servlet and got a problem with accessing images. The images are in the WebContent/images folder. When I run it in a local server and pointing the full path of images directory (c://eclipse/myproject/WebContent/images/letterHead.jpg) its working, but it fails running on the server with the directory ("WebContent/images/letterHead.jpg").

The project is being deployed as a WAR on a tomcat server, thus ending up with an address similar to

http://someserver:8081/projectName/someJSP.jsp

I don't understand how to reference the images relatively in this environment, and any help would be much appreciated.

Here is my code

Image imghead = Image.getInstance("WebContent/images/letterHead.jpg");
imghead.setAbsolutePosition(35,770);
imghead.scaleAbsolute(125, 42);
document.add(imghead);

回答1:

You should never use relative paths in java.io stuff. You will be dependent on the current working directory which is in no way controllable in case of a webapplication. Always use absolute disk file system paths. Thus, c:/full/path/to/file.ext.

You can use ServletContext#getRealPath() to convert a relative web path to an absolute disk file system path. The relative web path is rooted on the public webcontent folder which is in your case thus /WebContent. So, you need to replace the first line of above code by:

String relativeWebPath = "/images/letterHead.jpg";
String absoluteDiskPath = getServletContext().getRealPath(relativeWebPath);
Image imghead = Image.getInstance(absoluteDiskPath);
// ...


回答2:

Following piece of code may help you...

String path = request.getContextPath();
String split_path[] = path.split("/");
path = request.getRealPath(split_path[0]);
String imagePath="\\resources\\images\\letterHead.jpg";
Image image = Image.getInstance(path+imagePath);


回答3:

Following code can be used to access image path inside a java class.

URL imageUrl = getClass().getProtectionDomain().getCodeSource().getLocation();
Image img=Image.getInstance(imageurl+"../../../some/images/pic.gif");    


回答4:

So I had the same problem, I wanted to add an image to the pdf but through a relative path, so when I made a executable program it would work in any computer, even if it had or not the image saved.

I found a way where you add the image as a resource of your application. You need to put the image inside the src directory or the dir of the class where you call it and then you can use the following code:

Image image = Image.getInstance(yourClassName.class.getResource("/yourImageName")));

If you put the image inside a folder then, obviously, you'll need to add the path through the folders name ("folderName/yourImageName"). Hope it helps!



回答5:

For Kotlin, if the image is in the resources folder, you can also try the following:

Image.getInstance(this::class.java.classLoader.getResourceAsStream("images/your_image.png").readBytes())



回答6:

Resources

Image foto = Image.getInstance(this.getClass().getResource("/static/img/gobierno.jpg"));