我正在使用PDFTron扫描文档并以某种自定义格式提取注释信息。我对Ellipse
和Square
注释有疑问。
对于上面提到的自定义格式,我需要方形的width
和height
(可以是矩形)。所有注释都可以旋转。对于旋转的矩形,我可以使用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
?
进行总结。我需要检索Rectangle
和Circle
的实际维度。使用简单的数学很难做到。我发现原始边界框以pdf格式保存,但我不知道如何从Annot
对象获取此信息。或者你可能会给我另一种方法来获得尺寸?
编辑您可以下载示例文件here
答案 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行。
这涉及更多,但如果矩形/椭圆没有完全触及注释边界框的边缘,那么这将是唯一可以计算的特定方式。