pdfnet:单页轮换后无刷新

时间:2017-04-19 08:34:29

标签: c# pdf pdftron pdfnet

我设法在文档中旋转单个页面,但我无法通过任何方式刷新页面。我必须重新导航到页面才能看到旋转的效果。对我们的用户来说不是理想的场景。

MyPDFView代码:

    public void RotatePage(int page)
    {
        Page.Rotate originalRotation = m_PdfDocument.GetPage(page).GetRotation();
        Page.Rotate rotation;

        switch (originalRotation)
        {
            case Page.Rotate.e_0: rotation = Page.Rotate.e_90; break;
            case Page.Rotate.e_90: rotation = Page.Rotate.e_180; break;
            case Page.Rotate.e_180: rotation = Page.Rotate.e_270; break;
            case Page.Rotate.e_270: rotation = Page.Rotate.e_0; break;
            default: rotation = Page.Rotate.e_0; break;
        }

        m_PdfDocument.GetPage(page).SetRotation(rotation);
    }

frmMain代码:

    private void btnTurnView_ItemClick(object sender, ItemClickEventArgs e)
    {
        if (CurrentForm != null)
        {
            CurrentForm.p_m_oPDFViewCtrl.RotatePage(CurrentForm.p_m_oPDFViewCtrl.p_PageInfo.p_PageNumber);
        }
    }

到目前为止我尝试过的事情:文档/视图的不同部分上的Invalidate(),Refresh(),Update()。我可以运行页面分析(类似于页面更改时发生的情况),这可能会解决问题,但会带来不必要的开销,如果有更高效的方法,我宁愿依赖它。

2 个答案:

答案 0 :(得分:1)

已经找到了,方法UpdatePageLayout()正是这样做的。

答案 1 :(得分:1)

原始代码实际上有两个错误。

第一个是缺少的UpdatePageLayout。

第二个,缺少concurrency locking,因为您在一个线程上修改文档,而后台线程正在读取文档。最后,在最新版本中,现在有用于调整旋转的辅助函数,因此可以避免整个开关块。

因此,永久旋转单个页面的更安全方式,同时也在PDFViewCtrl中查看,将是以下内容。

public void RotatePage(int page_number)
{
    mPDFView.DocLock(true); // lock the document for editing, and stop rendering
    try
    {
        Page page = mPDFView.GetDocument().GetPage(page_number);
        page.SetRotation(Page.AddRotations(Page.Rotate.e_90, page.GetRotation()));
    }
    finally
    {
        mPDFView.DocUnlock(); resume background threads
    }
    mPDFView.UpdatePageLayout();
}

注意,文件锁定。由于您是直接访问文档,因此需要将其锁定(读取或写入锁定),以便后台线程暂停。对PDFViewCtrl本身的任何调用都已经处理过了。这个document会详细介绍。