在 iText 中为区域注释创建度量字典
Create measure dictionary for area annotation in iText
该值的假定值为 15.2 平方厘米。但是,当注释被移动时,它变成了 0.04 平方厘米。
我从我的应用程序中获得此数据,其中面积计算为 9658.6572265625,其校准值为 0.00157889,结果为 15.2。
当提供pdf中的对应坐标space时(见下面代码),计算出的面积为5433.001953125.
所以我像这样计算 pdf space 中的校准值。
比率=面积/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;
}
}
您已经计算出平移区域的系数:
the result is 0.002806911838696635. which if computed
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);
现在的结果好多了:
但这并不完全是您的 15.2 平方厘米。因此,我检查了您的数字,确实,您的多边形区域的 5433.001953125
值略有偏差,应该在 5388.9613
.
左右
使用这个更正确的值,我再次替换了上面的行,这次是:
float calib = (float)Math.sqrt(15.2/5388.96);
结果:
该值的假定值为 15.2 平方厘米。但是,当注释被移动时,它变成了 0.04 平方厘米。
我从我的应用程序中获得此数据,其中面积计算为 9658.6572265625,其校准值为 0.00157889,结果为 15.2。
当提供pdf中的对应坐标space时(见下面代码),计算出的面积为5433.001953125.
所以我像这样计算 pdf space 中的校准值。
比率=面积/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;
}
}
您已经计算出平移区域的系数:
the result is 0.002806911838696635. which if computed
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);
现在的结果好多了:
但这并不完全是您的 15.2 平方厘米。因此,我检查了您的数字,确实,您的多边形区域的 5433.001953125
值略有偏差,应该在 5388.9613
.
使用这个更正确的值,我再次替换了上面的行,这次是:
float calib = (float)Math.sqrt(15.2/5388.96);
结果: