【问题标题】:Adobe RM SDK AnnotationAdobe RM SDK 注释
【发布时间】:2015-05-19 16:38:59
【问题描述】:

你们用过 RM SDK for iOS 吗? RM SDK 以如下格式保存注解:

startBookmark = "#pdfloc(bd0d,0,101,5,2,0,0,1)";
endBookmark = "#pdfloc(bd0d,0,101,14,0,0,1,1)";

我们如何从这两行得到 rect?

【问题讨论】:

    标签: ios pdf


    【解决方案1】:

    您拥有的 PDF 位置指向 PDF 文件中的特定对象。此对象与屏幕上的 (x,y) 坐标没有直接关系,因为这取决于您用于渲染 PDF 文件的分辨率和 DPI。它还取决于您用于渲染文件的渲染引擎。

    要在 iOS 中绘制一个框,您需要使用 (x,y) 坐标来绘制它。您需要获取您正在使用的注释周围的框的 (x,y) 坐标。您可以使用 getRangeInfo 对 RMSDK 执行此操作。您还可以使用上面的 PDF 位置导航到特定的注释。请注意,您将返回的框仅对您拥有的参数的文件的再现有效。如果您更改任何参数 - RMSDK 版本、导航矩阵值、dpi、渲染分辨率,您将需要从 RMSDK 获取框的新值。

    这里有一些代码可以帮助您使用 RMSDK 从两个位置获取 (x,y) 坐标。该代码用于主 C/C++ 库,因为我不确定您的 Objective-C 层是什么样的。根据您使用的 RMSDK 版本,可能会有所不同。

    dpdoc::RangeInfo* rangeInfo = renderer->getRangeInfo(startBookmark, endBookmark);
    dpdoc::Rectangle* rect;
    rangeInfo->getBox(0, false, rect&);
    

    那么“rect”变量将包含 (x,y) 坐标,用于您需要绘制的框。请注意,每 2 组坐标可能有多个框。在这种情况下,您需要遍历它们。

    如果您确实有 RMSDK 通常附带的 Objective-C 层,那么它应该会稍微容易一些。在这种情况下,您的代码应如下所示:

    NSArray *boxes = nil;
    RMRangeInfo *rangeInfo = [document getRangeInfoWithStart:startBookmark end:endBookmark];
    boxes = rangeInfo.boxes
    

    然后您可以遍历框数组以获取 (x,y) 并将它们绘制在屏幕上。在大多数情况下,您将获得 1 个框,但您应该考虑到要绘制多个框的情况。一个简单的循环就可以解决问题。

    【讨论】:

    • 感谢 Vel Genov! CGPDFContentStreamRef 可以帮忙吗?
    • 您在上面的位置是 RMSDK 库所独有的。这就是我建议使用 RMSDK 将它们转换为 (x,y) 坐标的原因,然后您可以使用它在 iOS 中绘制一个框。您可以使用您拥有的 PDF 位置,并导航到 RMSDK 中的书签。然后使用 getRangeInfoBox,获取绘制框所需的坐标。正如我之前提到的,请记住,如果您更改任何会影响渲染的变量,您将需要获取新框的坐标。这应该很好用,我以前见过。
    • 我在评论中添加了一些示例代码。这应该能让你继续前进。
    猜你喜欢
    • 2020-02-07
    • 2011-06-11
    • 1970-01-01
    • 2011-01-19
    • 2014-01-05
    • 1970-01-01
    • 2022-11-11
    • 2012-09-15
    • 2017-11-21
    相关资源
    最近更新 更多