Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/190.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android PDFTron墨水注释_Android_Pdf_Pdftron - Fatal编程技术网

Android PDFTron墨水注释

Android PDFTron墨水注释,android,pdf,pdftron,Android,Pdf,Pdftron,我正在使用pdftron库渲染和编辑pdf。我有一个场景,我必须获得注释的坐标并将其保存到db,如果形状被删除,则从数据库中删除这些坐标。我已经设法记录了绘制的坐标和擦除的坐标,但绘制的坐标和擦除的坐标在这里不匹配。如果删除的坐标不匹配,即使lib成功删除形状,我如何从数据库中删除绘制的坐标 我的提交方法 public void commitAnnotation() { ArrayList<DrawPoints> points=new ArrayList<

我正在使用pdftron库渲染和编辑pdf。我有一个场景,我必须获得注释的坐标并将其保存到db,如果形状被删除,则从数据库中删除这些坐标。我已经设法记录了绘制的坐标和擦除的坐标,但绘制的坐标和擦除的坐标在这里不匹配。如果删除的坐标不匹配,即使lib成功删除形状,我如何从数据库中删除绘制的坐标

我的提交方法

  public void commitAnnotation() {

        ArrayList<DrawPoints> points=new ArrayList<DrawPoints>();

        try {
            mPDFView.docLock(true);

            pdftron.PDF.Rect rect = getShapeBBox();
            if (rect != null) {
                float sx = mPDFView.getScrollX();
                float sy = mPDFView.getScrollY();
                pdftron.PDF.Annots.Ink ink = pdftron.PDF.Annots.Ink.create(mPDFView.getDoc(), rect);

                int pathIdx = 0;
                ListIterator<LinkedList<PointF>> itrPaths = mStrokes.listIterator(0);
                while (itrPaths.hasNext()) {
                    LinkedList<PointF> path = itrPaths.next();
                    ListIterator<PointF> itr = path.listIterator(0);
                    double[] pts = new double[2];
                    pdftron.PDF.Point p = new pdftron.PDF.Point();
                    int pointIdx = 0;
                    while (itr.hasNext()) {
                        PointF p_ = itr.next();
                        DrawPoints drawPoints=new DrawPoints();
                        pts = mPDFView.convScreenPtToPagePt(p_.x - sx, p_.y - sy, mPageForFreehandAnnot);
                        p.x = pts[0];
                        p.y = pts[1];
                        ink.setPoint(pathIdx, pointIdx++, p);
                        drawPoints.setPoint(p_);
                        drawPoints.setPathindex(pathIdx);
                        drawPoints.setPointindex(pointIdx);
                        points.add(drawPoints);
                    }
                    pathIdx++;
                }

                setStyle(ink);

                ink.refreshAppearance();

                Page page = mPDFView.getDoc().getPage(mPageForFreehandAnnot);
                page.annotPushBack(ink);

                mAnnot = ink;
                mAnnotPageNum = mPageForFreehandAnnot;
                buildAnnotBBox();

                mPDFView.update(mAnnot, mAnnotPageNum); // Update the region where the annotation occupies.
            }

            mPaint.setStrokeJoin(oldStrokeJoin);
            mPaint.setStrokeCap(oldStrokeCap);

        } catch (Exception ex) {
            mNextToolMode = ToolManager.e_pan;

        } finally {
            mPDFView.docUnlock();

            mStrokePoints.clear();
            mStrokes.clear();
        }
        if(mListener!=null){
            mListener.getStrokePoints(points);
        }else{
            Log.e(TAG, " No Listener Registered ");
        }
        mPDFView.waitForRendering();
    }

首先,您要传递鼠标坐标(pdfPt[1 | 2]),这当然与墨水点不匹配

此外,在擦除时,PDFNet可能会创建/修改/删除周围的其他点。例如,在擦除两个墨水点之间的中点时


您应该做的是在擦除后从注释重新加载整个墨水列表,并替换数据库中的墨水列表。这将为您省去很多麻烦,并保护您免受我们库中未来可能的实现更改。

您正在通过比较坐标在页面上搜索注释,我认为使用UDID查找注释要简单得多,并且您不必处理从页面到屏幕的坐标转换,反之亦然

使用此功能设置UDID

public void SetUniqueID(string data);

查找注释函数可以如下所示:

IAnnot FindAnnotOnPageByUDID(int pageIndex, long annotId)
{
    IAnnot result = null;
    Page page = _doc.GetPage(pageIndex);
    if (page != null && page.IsValid())
    {
        int num_annots = page.GetNumAnnots();
        for (int i = 0; i < num_annots; ++i)
        {
            IAnnot annot = page.GetAnnot(i);
            if (annot.IsValid())
            {
                var UniqueIdObj = annot.GetUniqueID();
                if (UniqueIdObj != null)
                {
                    var strUniqueId = UniqueIdObj.GetAsPDFText();
                    if (strUniqueId.Contains(annotId.ToString()))
                    {
                        result = annot;
                        break;
                    }
                }

            }
        }
    }
    return result;
}
iannotfindannotonpagebyudid(int-pageIndex,long-annotId)
{
IANOT结果=null;
Page Page=\u doc.GetPage(pageIndex);
if(page!=null&&page.IsValid())
{
int num_annots=page.GetNumAnnots();
对于(int i=0;i
PdfTron文档中也推荐了这种方法


只需跟踪注释集合的UDID。

看起来删除的坐标是画布坐标,而注释坐标是页面坐标。使用PDFViewCtrl的
convCanvasptopagept()
方法进行转换。@323go不起作用。让我用提交方法where(我正在获取绘图点)和擦除方法更新我的问题。绘图点数据结构将进入数据库吗?如果是这样的话,这些都是屏幕坐标,正如@323go所建议的那样。您应该始终将注释信息存储在页面坐标中。然后在擦除代码中,pdfPt[1 | 2]数据是页面坐标,但稍后您将使用它们从canvasToPage转换!在处理注释时,您希望将所有坐标标准化为页面坐标。@Ryan,谢谢您指出。但我仍然没有得到准确的答案。绘制的坐标(x=50.745094 y=590.98346)已删除的起始坐标(x=47.63651,y=594.0914)我想获取绘制坐标并将其传递给服务器如果我删除它们,我也必须从服务器中提取点:-“我怎么能做到这一点?”瑞安,我如何从被删除的注释中得到删除的点。考虑我在页面上绘制了五个形状。我如何得到每个形状的所有点?我正在重复注释的数量,从当前注释中获得墨水墨水=新墨水(ANNOT),但是我怎样才能得到Pink和PoxTobe的墨水。(pathIndex,pointIndex);我不明白这个问题。Ink.getPathCount和Ink.getPointCount提供了要迭代的范围。正如建议的那样,您删除数据库中该注释的所有条目,并替换为最新的集合。如果您询问如何识别注释,则没有注释。[set | Get]UniqueID。您可以使用操作系统中的GUID设置注释,并将GUID存储在数据库中。Unique不是自动生成的,所以您需要这样做。您能给我指出代码段,其中显示了如何在屏幕上获取所有形状的线吗?如果我们再次在屏幕上绘制,我们需要路径索引和点索引来重新绘制,对吗?如果我错了,请更正我。Al因此可以使用objPTAnnot.getObjectNumber();
public void SetUniqueID(string data);
  public Obj GetUniqueID()
IAnnot FindAnnotOnPageByUDID(int pageIndex, long annotId)
{
    IAnnot result = null;
    Page page = _doc.GetPage(pageIndex);
    if (page != null && page.IsValid())
    {
        int num_annots = page.GetNumAnnots();
        for (int i = 0; i < num_annots; ++i)
        {
            IAnnot annot = page.GetAnnot(i);
            if (annot.IsValid())
            {
                var UniqueIdObj = annot.GetUniqueID();
                if (UniqueIdObj != null)
                {
                    var strUniqueId = UniqueIdObj.GetAsPDFText();
                    if (strUniqueId.Contains(annotId.ToString()))
                    {
                        result = annot;
                        break;
                    }
                }

            }
        }
    }
    return result;
}