从Maven资源文件夹中获取正确的文件路径 - iText

3

由于我在使用iText时使用了外部字体,因此我需要从我的Maven资源文件夹(src/main/resources)加载字体文件,但是iText API要求我提供文件路径而不是文件本身。

因此,当我尝试使用以下代码时出现问题:

String arialUnicodeFontPath = getClass().getClassLoader().getResource("arialuni.ttf").getPath();

BaseFont unicodeBaseFont =
        BaseFont.createFont(arialUnicodeFontPath, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);

I get this:

2016-08-18 09:17:12,667 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/pdfgen2].[controlServlet]] (http-/0.0.0.0:8443-1) JBWEB000236: Servlet.service() for servlet controlServlet threw exception: java.io.IOException: /content/pdfgen2.war/WEB-INF/classes/arialuni.ttf not found as file or resource.
    at com.itextpdf.text.io.RandomAccessSourceFactory.createByReadingToMemory(RandomAccessSourceFactory.java:248) [itextpdf-5.5.3.jar:5.5.3]
    at com.itextpdf.text.io.RandomAccessSourceFactory.createBestSource(RandomAccessSourceFactory.java:173) [itextpdf-5.5.3.jar:5.5.3]
    at com.itextpdf.text.pdf.RandomAccessFileOrArray.<init>(RandomAccessFileOrArray.java:148) [itextpdf-5.5.3.jar:5.5.3]
    at com.itextpdf.text.pdf.TrueTypeFont.process(TrueTypeFont.java:641) [itextpdf-5.5.3.jar:5.5.3]
    at com.itextpdf.text.pdf.TrueTypeFontUnicode.process(TrueTypeFontUnicode.java:121) [itextpdf-5.5.3.jar:5.5.3]
    at com.itextpdf.text.pdf.TrueTypeFontUnicode.<init>(TrueTypeFontUnicode.java:98) [itextpdf-5.5.3.jar:5.5.3]
    at com.itextpdf.text.pdf.BaseFont.createFont(BaseFont.java:704) [itextpdf-5.5.3.jar:5.5.3]
    at com.itextpdf.text.pdf.BaseFont.createFont(BaseFont.java:622) [itextpdf-5.5.3.jar:5.5.3]
    at com.itextpdf.text.pdf.BaseFont.createFont(BaseFont.java:457) [itextpdf-5.5.3.jar:5.5.3]

pdfgen2.war 是包含您的应用程序的文件吗?arialuni.ttf 文件是否位于那里? - Jens
是的,这是我的应用程序,文件夹结构如描述的那样,打开war文件本身的结构是:WEB-INF/classes/arialuni.ttf - Michael Lemos
尝试在文件名前添加一个“/”。 - Jens
我已经尝试过了,但并没有什么区别。奇怪的是,当我使用JBossTools部署它时,也就是在Eclipse中,它可以工作,并且实际上打印出不同的文件路径,而当我使用Maven构建war并将war文件复制到jboss文件夹中时,它打印出来的文件路径不同。由于某种原因,该方法根据部署方式获得两个不同的文件路径。 - Michael Lemos
欢迎来到 Stack Overflow! 请问您能否在问题标题和内容中更加详细地描述您的问题,并说明您已经做出了哪些尝试以解决此问题呢? - Enamul Hassan
1个回答

0

我找不到按照我想要的方式通过路径加载文件的解决方案,但是我使用了一个变通方法来获取所需的itext字体,代码如下:

byte[] fontByte = IOUtils
    .toByteArray(this.getClass().getClassLoader().getResourceAsStream("/fonts/arialuni.ttf"));
BaseFont unicodeBaseFont = BaseFont.createFont("arialuni.ttf", BaseFont.IDENTITY_H,
    BaseFont.EMBEDDED, true, fontByte, null);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接