【问题标题】:pdfnet: No refresh after single page rotationpdfnet:单页旋转后不刷新
【发布时间】:2017-04-19 08:34:29
【问题描述】:

我设法旋转了文档中的各个页面,但无法通过任何方式刷新页面以使其正常工作。我必须重新导航到页面才能看到旋转的效果。对于我们的用户来说,这不是理想的场景。

我的PDF查看代码:

    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);
    }

frm主代码:

    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()。我可以运行页面分析(类似于页面更改时发生的情况),这可能会解决问题,但会带来不必要的开销,如果有更有效的方法,我宁愿依赖它。

【问题讨论】:

    标签: c# pdf pdftron pdfnet


    【解决方案1】:

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

    第一个是缺少的 UpdatePageLayout。

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

    因此,永久旋转单个页面,同时在 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 有更多细节。

    【讨论】:

    • 谢谢瑞恩。明天我将添加额外的锁。由于我们仍在使用较旧的 SDK 版本,因此我将无法实现辅助函数,但当我们更新到最新版本时(应该很快),我会保留它作为提醒。
    • 我能够完全实现整个事情,包括辅助功能。再次感谢 ! :)
    【解决方案2】:

    已经找到了,有一个方法 UpdatePageLayout() 可以做到这一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-30
      相关资源
      最近更新 更多