在iText

时间:2019-06-19 12:28:13

标签: dictionary annotations itext area measure

假定的价值为15.2平方厘米。但是,当注释移动时,它将变为0.04平方厘米。

我从我的应用程序中获得了该数据,其面积计算为9658.6572265625,其校准值为0.00157889,得出15.2的值。

提供pdf空间中的相应坐标(请参见下面的代码)时,计算出的面积为5433.001953125。

所以我像这样在pdf空间中计算校准值。

比率=面积/ pdf面积 pdfCalibrationValue = 0.00157889 *比率;

结果为0.002806911838696635。如果计算出

5433.001953125 x 0.002806911838696635 = 15.2

所以我想知道为什么结果变为0.04。

有想法吗?

public class Test {

    public static void main(String[] args) throws Exception {
        PdfReader reader = new PdfReader("src.pdf");
        PdfStamper stamper = new PdfStamper(reader, new FileOutputStream("result.pdf"));

        Rectangle location = new Rectangle(426.582f, 514.291f, 559.0f, 613.818f);
        float[] floats = new float[] { 
            427.582f, 582.873f,
            493.036f, 515.291f,
            558.0f, 554.237f,
            527.4f, 612.818f,
            464.727f, 564.709f,
            427.582f, 582.873f
        };

        PdfArray pdfVertices= new PdfArray(floats);
        float calib = 0.002806911838696635f;

        PdfAnnotation stamp = PdfAnnotation.createPolygonPolyline(stamper.getWriter(), 
            location, "15.2 sq cm", true, new PdfArray(pdfVertices));
        stamp.setColor(BaseColor.RED);
        stamp.setBorderStyle(new PdfBorderDictionary(1, PdfBorderDictionary.STYLE_SOLID));
        stamp.put(PdfName.SUBTYPE, PdfName.POLYGON);
        stamp.put(new PdfName("IT"), new PdfName("PolygonDimension"));
        stamp.put(PdfName.MEASURE, createMeasureDictionary(calib));

        stamper.addAnnotation(stamp, 1);
        stamper.close();
        reader.close();
    }

    private static PdfDictionary createMeasureDictionary(float pdfCalibrationValue) {
        String unit = "cm";

        PdfDictionary measureDictionary = new PdfDictionary();
        measureDictionary.put(PdfName.TYPE, PdfName.MEASURE);
        measureDictionary.put(PdfName.R, new PdfString("1 " + unit + " = 1 " + unit));

        PdfDictionary xDictionary = new PdfDictionary();
        xDictionary.put(PdfName.TYPE, PdfName.NUMBERFORMAT);
        xDictionary.put(PdfName.U, new PdfString(unit));
        xDictionary.put(PdfName.C, new PdfNumber(pdfCalibrationValue));
        PdfArray xarr = new PdfArray();
        xarr.add(xDictionary);
        measureDictionary.put(PdfName.X, xarr);

        PdfDictionary dDictionary = new PdfDictionary();
        dDictionary.put(PdfName.TYPE, PdfName.NUMBERFORMAT);
        dDictionary.put(PdfName.U, new PdfString(unit));
        dDictionary.put(PdfName.C, new PdfNumber(1));
        PdfArray darr = new PdfArray();
        darr.add(dDictionary);
        measureDictionary.put(PdfName.D, darr);

        PdfDictionary aDictionary = new PdfDictionary();
        aDictionary.put(PdfName.TYPE, PdfName.NUMBERFORMAT);
        aDictionary.put(PdfName.U, new PdfString("sq " + unit));
        aDictionary.put(PdfName.C, new PdfNumber(1));
        PdfArray aarr = new PdfArray();
        aarr.add(aDictionary);
        measureDictionary.put(PdfName.A, aarr);

        return measureDictionary;
    }        

}

1 个答案:

答案 0 :(得分:1)

您已计算出转换区域的因子:

  

结果为0.002806911838696635。如果计算出

     

5433.001953125 x 0.002806911838696635 = 15.2

但是随后您使用此系数表示 X 数字格式数组中未更改的区域作为转换系数。

X 数字格式数组是用于测量沿x轴和(如果不存在 Y 的话)沿y轴的变化的数字格式阵列。

因此,由于您没有 Y 条目,因此您的面积系数必须是 X 平方的转换系数!

换句话说,将面积换算系数的平方根用作 X 换算系数,即替换

float calib = 0.002806911838696635f;

作者

float calib = (float)Math.sqrt(0.002806911838696635);

现在的结果要好得多

screenshot

但这不完全是您的15.2平方厘米。因此,我检查了您的数字,确实,您的多边形区域的5433.001953125值略有偏离,应该在5388.9613左右。

使用这个更正确的值,这次我再次替换了上面的行:

float calib = (float)Math.sqrt(15.2/5388.96);

和结果:

screenshot