Dictionary 在iText中为区域注释创建度量词典

Dictionary 在iText中为区域注释创建度量词典,dictionary,annotations,itext,area,measure,Dictionary,Annotations,Itext,Area,Measure,这个的假定值是15.2平方厘米。但是,移动注释时,注释将变为0.04平方厘米 我从我的应用程序中获得了这些数据,其中面积计算为9658.6572265625,其校准值为0.00157889,结果为15.2 如果提供pdf空间中的相应坐标(见下面的代码),则计算的面积为5433.001953125 所以我计算pdf空间中的校准值,如下所示 比率=面积/PDA pdfCalibrationValue=0.00157889*比率 结果是0.002806911838696635。如果计算 5433.00

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

我从我的应用程序中获得了这些数据,其中面积计算为9658.6572265625,其校准值为0.00157889,结果为15.2

如果提供pdf空间中的相应坐标(见下面的代码),则计算的面积为5433.001953125

所以我计算pdf空间中的校准值,如下所示

比率=面积/PDA 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;
    }        

}

您已经计算了一个系数来转换区域:

结果是0.002806911838696635。如果计算

5433.001953125 x 0.002806911838696635=15.2

但是,您可以在X数字格式数组中使用这个表示区域不变的因子作为转换因子

X数字格式数组是用于测量沿X轴变化的数字格式数组,如果Y不存在,则也是沿Y轴变化的数字格式数组

因此,由于没有Y条目,因此面积因子必须是X平方中的转换因子

换句话说,使用面积转换因子的平方根作为转换因子,即替换

float calib = 0.002806911838696635f;

现在的结果要好得多:

但这并不完全是你的15.2平方厘米。因此,我检查了您的数字,事实上,您的polygone区域的
5433.001953125
值稍有偏离,应该在
5388.9613
左右

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

float calib = (float)Math.sqrt(15.2/5388.96);
结果是:


谢谢@mkl。我用我现有的公式计算出来的。我添加的唯一更改是您更正的Math.sqrt()加上我得到的比率必须乘以2[double pdfCalibrationValue=0.00157889*(比率*2);],太好了!由于此答案(与类似)暗示了您各自问题的解决方案,您应该将其标记为已接受答案(单击答案左上角、投票箭头右下方的勾号)。@chitgoks“第一次这样做”-啊。那么你可能也应该看看你以前的问题。如果他们各自有一个解决问题的答案,你应该接受这个答案。顺便说一句,如果你接受了,你和回答者都会得到声誉分数(除非你接受了你自己写的答案,这样做会让你的利用更加困难)。
float calib = (float)Math.sqrt(15.2/5388.96);