JRuby创建Java类型强制转换浮点数组的问题

时间:2019-06-06 18:41:52

标签: jruby pdfbox

我正在使用jruby-9.2.6.0导入Java pdf库。 PDColor是一个用浮点数数组和字符串常量实例化的类。 Java example code that I'm referencing 如下所示:

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的float数组转换为Java float数组?

2 个答案:

答案 0 :(得分:3)

@TilmanHausherr所述,构造函数期望Java数组primitive浮点数。要创建它,您可以调用Array#to_java(:float)

这是一个小程序来测试此行为。 pdfbox-2.0.15.jar应与脚本位于同一文件夹中,该脚本应与${}运行:

jruby

答案 1 :(得分:0)

因此,根据docsPDColor类具有一个替代构造函数,除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)