【问题标题】:PDFTron. Calculating actual annotations sizePDFTron。计算实际注释大小
【发布时间】:2018-01-30 15:48:03
【问题描述】:

我正在使用 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 post 尝试了简单的数学运算。但它不适用于 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&lt;&lt;/Type/XObject/Subtype/Form/FormType 1/BBox字符串。这个BBox 是原始的Ellipse 边界框(没有旋转)。我已经检查过了。如果我没有旋转 BBox,我可以获得ellipse 的轴和Rectangle 的尺寸。但是如何检索这个XObject 进行注释呢?

做个总结。我需要检索RectangleCircle 的实际尺寸。使用简单的数学很难做到。我发现原始边界框保存在 pdf 中,但我不知道如何从 Annot 对象获取此信息。或者,也许您会给我另一种获取尺寸的方法?

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

【问题讨论】:

  • 也许您可以发布/附加一个包含该问题的示例 PDF。另外,为什么需要检索“矩形和圆形的真实尺寸”?
  • 正如我所解释的,我们需要将注释转换为我们的自定义格式。我知道,我们可以通过将旋转矩阵应用于外观来旋转它。事实上,我有一个想法将注释旋转回来,使用旋转矩阵,读取边界框,然后将其返回到初始状态。但我失败了。我在我的问题中提供了文件
  • 正如我所描述的,我找到了保存原始(未旋转)边界框的地方。但我不知道如何阅读这些信息。我真的需要帮助
  • 关于附件,我以前从未在 PDF 中看到过“旋转”条目。只有“旋转”,它只是顺时针以 90 度为增量。注释还具有自定义外观,因此如果任何其他 PDF 供应商需要重新绘制注释,它将失去 45 度旋转。尝试在 Acrobat 中移动该注释并调整其大小以了解我的意思。

标签: c# .net math annotations pdftron


【解决方案1】:

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

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

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 行。

这涉及更多,但如果矩形/椭圆不完全接触注释边界框的边缘,那么这将是唯一确定的计算方法。

【讨论】:

  • 注释可以使用一些第三方软件旋转,例如 Bluebeam Revu。 Tjen 他们有旋转矩阵,正如我所描述的那样
猜你喜欢
  • 2011-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-17
  • 2017-04-26
  • 2016-04-02
  • 1970-01-01
相关资源
最近更新 更多