【问题标题】:Creating measure dictionary for distance annotation为距离注释创建度量字典
【发布时间】:2019-06-07 02:52:31
【问题描述】:

创建测量距离注释不会显示正确的测量单位,也不会给出正确的计算。知道我做错了哪一部分吗?或者如果缺少一些数据。

我目前正在创建测量距离注释。使用像素,它工作得很好。但是由于现在我正在考虑实际测量和单位,所以我不确定我的代码的哪一部分有问题,或者我是否缺少某些东西。

请看图片。这是我用来创建距离注释的一些应用程序,我将其校准为距离为 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 我会标记你,以防你有空闲时间检查和指导。谢谢。

【问题讨论】:

    标签: dictionary annotations itext measure


    【解决方案1】:

    我没有完全遵循你的数学。

    您的线路长度为 ca。 209.3 用户空间单位。如果您希望该线代表 14.5 厘米,则 X C 转换因子应约为 0.069273 而不是您的 0.0519548.

    设置

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

    我得到一个 PDF,打开时显示

    稍稍移动(之后 Adob​​e Reader 会重建外观)

    所以没有英寸...

    【讨论】:

    • 你是对的。老实说,我不知道我是如何得到这个值的。一定混淆了一些东西,因为我使用了相同的公式,现在我得到了 0.069273。谢谢。
    • 所以我的代码是正确的。以像素为单位的点坐标和校准值是正确的。但是当我将这些像素坐标转换为 pdf 坐标时,我仍然使用导致错误测量的相同校准值。所以我必须得到正确的校准值。
    猜你喜欢
    • 2019-11-02
    • 2020-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-05
    • 2013-05-05
    • 1970-01-01
    相关资源
    最近更新 更多