PDFTron。计算实际注释大小

时间:2018-01-30 15:48:03

标签: c# .net math annotations pdftron

我正在使用PDFTron扫描文档并以某种自定义格式提取注释信息。我对EllipseSquare注释有疑问。

对于上面提到的自定义格式,我需要方形的widthheight(可以是矩形)。所有注释都可以旋转。对于旋转的矩形,我可以使用square.GetVisibleContentBox()和旋转角度使用这样的方法获得边界框:

        var appearance = square.GetAppearance();
        var matrixApp = appearance.FindObj("Matrix");
        var matrixObject = new Matrix2D(matrixApp.GetAt(0).GetNumber(), matrixApp.GetAt(1).GetNumber(),
            matrixApp.GetAt(2).GetNumber(), matrixApp.GetAt(3).GetNumber(), matrixApp.GetAt(4).GetNumber(),
            matrixApp.GetAt(5).GetNumber());

        RotationAngle = GetRotationFromMatrix(matrixObject);

我在旋转Ellipse注释的情况下使用的方法相同(我需要Ellipse的半长轴和半长轴)。但是如何从边界框和旋转中获得Rectangle宽度和高度,或Ellipse个轴?我使用this帖子在矩形的情况下尝试过简单的数学运算。但它不适用于45度旋转。我不知道如何检索Ellipse轴。

我已经打开了pdfDoc,并为旋转的Circle注释找到了这个:

endstream
endobj
497 0 obj<</Subj(Ellipse)/Type/Annot/P 477 0 R/F 4/C[1 0 0]/CreationDate(D:20180130093056+03'00')/T(User-PC)/Subtype/Circle/M(D:20180130093101+03'00')/AP<</N 499 0 R>>/RD[0.5 0.5 0.5 0.5]/Rect[75.96057 481.4219 511.1196 824.4295]/NM(BNJOBSFLFNHJWWZE)/Rotation 30>>
endobj
498 0 obj[497 0 R]
endobj
499 0 obj<</Type/XObject/Subtype/Form/FormType 1/BBox[88.18503 573.4521 498.8952 732.3994]/Resources<</ProcSet[/PDF]>>/Matrix[0.8660253 -0.5000002 0.5000002 0.8660253 -363.0966 -247.1763]/Filter/FlateDecode/Length 116>>
stream

注意obj<</Type/XObject/Subtype/Form/FormType 1/BBox字符串。此BBox是原始Ellipse边界框(无旋转)。我检查过这个。如果我没有旋转BBox,我可以获得ellipse的轴和Rectangle的尺寸。但是如何为注释检索此XObject

进行总结。我需要检索RectangleCircle的实际维度。使用简单的数学很难做到。我发现原始边界框以pdf格式保存,但我不知道如何从Annot对象获取此信息。或者你可能会给我另一种方法来获得尺寸?

编辑您可以下载示例文件here

1 个答案:

答案 0 :(得分:0)

感谢您提供示例文件。注释包含Rotation值,该值不是PDF标准的一部分,我不知道有任何其他PDF供应商处理此问题。假设它遵循PDF标准惯例,则该角度表示顺时针旋转。 要回答您的问题,有两种方法。有简单的方法,然后有更复杂,但更可靠的方式。

第一种方法是假设显示的矩形接触注释BBox的边缘。因此,在您的问题中使用SO linked回答,变量将如下所示。

double cw_rotation_in_degrees = annot.GetSDFObj().FindObj("Rotation").GetNumber();
double t = (360.0 - cw_rotation_in_degrees) / 180.0 * PI;
double bx = annot.GetRect().Width();
double by = annot.GetRect().Height();

如果您不信任上述条件,第二种更难的方法是使用PDFNet ElementReader示例代码来读取原始路径命令,并读取当前的GState转换。 https://www.pdftron.com/pdfnet/samplecode/ElementReaderAdvTest.cs.html

特别注意样本的代码第49行。

这涉及更多,但如果矩形/椭圆没有完全触及注释边界框的边缘,那么这将是唯一可以计算的特定方式。