Создание словаря мер для аннотации расстояний - PullRequest
1 голос
/ 07 июня 2019

Создание удаленной аннотации меры не отображает правильную единицу измерения и не дает правильного вычисления.Есть идеи, какую часть я делаю не так?или если отсутствуют некоторые данные.

В настоящее время я создаю аннотацию для измерения расстояния.Используя пиксель, он работает просто отлично.но с тех пор как я принимаю во внимание фактические измерения и единицы измерения, я не уверен, с какой частью кода у меня возникли проблемы или если мне чего-то не хватает.

image

Пожалуйста, см.образ.Это какое-то приложение, которое я использую для создания аннотации расстояния, и я калибрую его, чтобы это расстояние составляло 14,5 см, поэтому, поделив его на пиксель, значение калибровки на пиксель будет равно 0,0519548.

Теперь, когда я применяю его кКод iText, я запутался, почему дисплей всегда по-прежнему в дюймах?Даже если я установлю свой код в дюймах, а не в сантиметрах, вычисления неверны.

Я не совсем уверен, в чем проблема.

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(55.78125f, 493.875f, 253.59375f, 562.3125f);

            PdfDictionary dict = new PdfDictionary();

            PdfArray lineEndings = new PdfArray();
            lineEndings.add(new PdfName("OpenArrow"));
            lineEndings.add(new PdfName("OpenArrow"));

            PdfAnnotation stamp = PdfAnnotation.createLine(stamper.getWriter(), location, "test measurement", 55.78125f, 562.3125f, 253.59375f, 493.875f);
            stamp.put(new PdfName("LE"), lineEndings);
            stamp.put(PdfName.ROTATE, new PdfNumber(0));
            stamp.put(PdfName.MEASURE, createMeasureDictionary());
            stamp.put(new PdfName("IT"), new PdfName("LineDimension"));
            stamp.put(new PdfName("Cap"), new PdfBoolean(true));
            stamp.put(PdfName.F, new PdfNumber(516));

            stamp.setColor(PdfGraphics2D.prepareColor(Color.RED));
            stamper.addAnnotation(stamp, 1);
            stamper.close();
            reader.close();
        }

        private static PdfDictionary createMeasureDictionary() {
            PdfDictionary measureDictionary = new PdfDictionary(PdfName.MEASURE);
            measureDictionary.put(PdfName.R, new PdfString("1 cm = 1 cm"));

            PdfDictionary xDictionary = new PdfDictionary(PdfName.NUMBERFORMAT);

            xDictionary.put(PdfName.U, new PdfString("cm"));
            xDictionary.put(PdfName.C, new PdfNumber(0.0519548f));
            measureDictionary.put(PdfName.X, new PdfArray(xDictionary));

            PdfDictionary dDictionary = new PdfDictionary(PdfName.NUMBERFORMAT);
            dDictionary.put(PdfName.U, new PdfString("cm"));
            dDictionary.put(PdfName.C, new PdfNumber(1.0f));
            measureDictionary.put(PdfName.D, new PdfArray(dDictionary));

            PdfDictionary aDictionary = new PdfDictionary(PdfName.NUMBERFORMAT);
            aDictionary.put(PdfName.U, new PdfString("cm"));
            aDictionary.put(PdfName.C, new PdfNumber(1.0f));
            measureDictionary.put(PdfName.A, new PdfArray(aDictionary));

            return measureDictionary;
        }

}

@ mkl Я помечаю вас на случайу вас есть свободное время для проверки и руководства.спасибо.

1 Ответ

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

Я не совсем слежу за твоей математикой.

Длина твоей строки составляет ок.209,3 единиц пользовательского пространства.Если вы хотите, чтобы эта линия представляла 14,5 см, коэффициент инверсии X C должен составлять примерно 0,069273 , а не ваш 0,0519548 .

Настройка

xDictionary.put(PdfName.C, new PdfNumber(0.069273f));

Я получаю PDF, который при открытии показывает

Screenshot

и после малейшего движения (послекакой Adobe Reader перестраивает внешний вид)

Screenshot

так что ни дюйма ...

...