Входное изображение не читается в Java с getResource - PullRequest
0 голосов
/ 17 апреля 2019

Я пытаюсь добавить изображение выбора пользователя в мой pdf, сгенерированный через pdfbox в netbeans. Если я непосредственно указываю путь к нему напрямую, он работает, но с получением URL пути к изображению и добавлением, которое не работает.

Видите, проблема в данном коде связана с URL и путем, потому что ввод не читается


 public static ByteArrayOutputStream PDFGenerator(........,Path imagespath)
  {
    ........
    if (finalpdf.Images != null)
    {
      Path imagepath = Paths.get(imagespath.toString(), "room.png");
      PDImageXObject Addedimage = PDImageXObject.createFromFile(imagepath.toString(), pdf);
      AddImages(content, Addedimage, 229.14f, 9.36f);
    }

    //AddImages method is following
  public static void AddImages(PDPageContentStream content, PDImageXObject image, float x, float y) throws IOException
  {

    content.drawImage(image, x, y);

  }
}

  //Following is snippet from my test method
  public void testClass()
  {
    ........
    finalpdf.Images = "room.png";
    URL imageurl = testclass.class.getResource("room.png");
    Path imagepath = Paths.get(imageurl.getPath().substring(1));
    ByteArrayOutputStream baos = PDFGenerator.generatefurtherpdf(finalpdf, "0000.00", "00.00", imagepath);

    writePDF(baos, "YourPdf.pdf");

  }

Я ожидаю, что это работает таким образом, но я уверен, что это некоторая проблема с Path, я не использую это правильно. Я надеюсь, что код достаточно пояснительный, так как я новичок, и есть причины безопасности, поэтому я не могу поставить весь код. Извините за ошибки

1 Ответ

1 голос
/ 17 апреля 2019

Для ресурсов (никогда File) существует обобщенный класс: Path.

Path path = Paths.get(imageurl.toURI());

Однако всякий раз, когда этот путь (например, с URL-адресом «jar: file // ... .jar! ... ... .png») будет использоваться в качестве файла, что предлагает path.toString(), можно использовать InputStream.

Второй обобщенный класс - это InputStream, который является более низким уровнем:

InputStream in = TestClass.getResourceAsStream(imagepath);

Это сокращение для никогда не используемых getResource().openStream(). Выдает исключение NullPointerException при неправильном пути к ресурсу.

Последний отзыв - использовать byte[] для createFromByteArray .

byte[] bytes = Files.readAllBytes(path);
PDImageXObject Addedimage = PDImageXObject.createFromByteArray(doc, bytes, name);

Использование временного файла

  Path imagepath2 = Files.createTempFile("room", ".png");
  Files.copy(imagepath, imagepath2);
  PDImageXObject Addedimage = PDImageXObject.createFromFile(imagepath2.toString(), pdf);
...