Проблемы с JRuby при создании массива с плавающей точкой типа Java - PullRequest
4 голосов
/ 06 июня 2019

Я использую jruby-9.2.6.0 для импорта библиотеки Java pdf.PDColor - это класс, для которого создается массив с плавающей точкой, а также строковая константа.Пример кода Java, на который я ссылаюсь , выглядит следующим образом:

import org.apache.pdfbox.pdmodel.graphics.color.PDColor;

PDColor componentColor = new PDColor(new float[]{1, 0, 0}, PDDeviceRGB.INSTANCE);

В jruby мой код выглядит следующим образом:

import org.apache.pdfbox.pdmodel.graphics.color.PDDeviceRGB;

float_arr = [1.to_f, 0.to_f, 0.to_f]
componentColor = PDColor.new(float_arr, PDDeviceRGB::INSTANCE)

Проблема в том, что, похоже, параметр float_arr не напечатан как массив с плавающей точкой, и поэтому мы получаем следующую ошибку:

NameError (no constructor for arguments (org.jruby.RubyArray,org.apache.pdfbox.pdmodel.graphics.color.PDDeviceRGB) on Java::OrgApachePdfboxPdmodelGraphicsColor::PDColor)
  available overloads:
    (org.apache.pdfbox.cos.COSArray,org.apache.pdfbox.pdmodel.graphics.color.PDColorSpace)
    (org.apache.pdfbox.cos.COSName,org.apache.pdfbox.pdmodel.graphics.color.PDColorSpace)
    (float[],org.apache.pdfbox.pdmodel.graphics.color.PDColorSpace)

Есть ли известный способ в jruby преобразовать массив с плавающей точкой Ruby в массив с плавающей точкой Java?

Ответы [ 2 ]

3 голосов
/ 06 июня 2019

Как упомянуто @ TilmanHausherr , конструктор ожидает массив Java с примитивом с плавающей точкой. Чтобы создать его, вы можете позвонить Array#to_java(:float).

Вот небольшая программа для проверки этого поведения. pdfbox-2.0.15.jar должен находиться в той же папке, что и скрипт, который должен запускаться с jruby:

require './pdfbox-2.0.15.jar'
java_import 'org.apache.pdfbox.pdmodel.graphics.color.PDColor'
java_import 'org.apache.pdfbox.pdmodel.graphics.color.PDDeviceRGB'
red = PDColor.new([1.0, 0, 0].to_java(:float), PDDeviceRGB::INSTANCE)
puts red
#=> PDColor{components=[1.0, 0.0, 0.0], patternName=null}
0 голосов
/ 06 июня 2019

Таким образом, согласно документам , класс PDColor имеет альтернативный конструктор, где я могу передать в их библиотеку специфический тип для Array в дополнение к Float.Я публикую этот ответ на тот случай, если кто-то, использующий JRuby, столкнется с подобной проблемой для этой конкретной библиотеки.

import org.apache.pdfbox.cos.COSArray;
import org.apache.pdfbox.cos.COSFloat;
import org.apache.pdfbox.pdmodel.graphics.color.PDColor;

cos_array = COSArray.new
cos_array.add(COSFloat.new(red_value))
cos_array.add(COSFloat.new(blue_value))
cos_array.add(COSFloat.new(green_value))

pd_color = PDColor.new(cos_array, PDDeviceRGB::INSTANCE)
...