Создать словарь мер для аннотации области в iText - PullRequest
1 голос
/ 19 июня 2019

Предполагаемое значение для этого будет 15,2 кв.однако, когда аннотация перемещается, она становится равной 0,04 кв. см.

Я получил эти данные из своего приложения, где площадь вычисляется как 9658.6572265625, а ее калибровочное значение равно 0,00157889, что приводит к значению 15,2.

когда предоставлены соответствующие координаты в пространстве PDF (см. код ниже), вычисляется площадь 5433,001953125.

, поэтому я вычисляю значение калибровки в пространстве PDF следующим образом.

ratio = area / pdfAreapdfCalibrationValue = 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 Ответ

1 голос
/ 26 июня 2019

Вы рассчитали коэффициент для перевода областей:

результат равен 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

...