Autodesk Forge 查看器仅渲染 PDF 文件的单页

Posted

技术标签:

【中文标题】Autodesk Forge 查看器仅渲染 PDF 文件的单页【英文标题】:Autodesk Forge viewer renders only single page for PDF files 【发布时间】:2016-12-26 03:08:07 【问题描述】:

在我们的应用程序中,我们使用Autodesk Forge Viewer 来渲染 3D 和 2D 设计文件。其他格式的文件可以很好地呈现。但是对于pdf 文件,即使文件实际上有多个页面,也只会呈现第一页。 但我们需要显示所有页面

这是我用来初始化查看器的部分代码:

function doInitializeTheViewer(urn, token, element) 
    const options = 
        'env': 'AutodeskProduction',
        'accessToken': token
    ;

    let documentId = 'urn:' + urn;

    return new Promise((resolve, reject) => 
        Autodesk.Viewing.Initializer(options, function onInitialized() 
            let viewerApp = new Autodesk.A360ViewingApplication(element.id);

            viewerApp.onDocumentLoaded = function (doc) 

                resolve(getViewerInstance().then(viewer => 
                    state.viewer = viewer;
                    return state;
                ));
            ;

            viewerApp.onDocumentFailedToLoad = (reason, errorCode) => 
                reject(errorCode, reason);
            ;

            viewerApp.registerViewer(viewerApp.k3D, Autodesk.Viewing.Private.GuiViewer3D);
            viewerApp.loadDocumentWithItemAndObject(documentId);

            state.viewerApp = viewerApp;
        );
    );

而且,它是这样被调用的:

let element = document.getElementById('#the-viewer');

fetch2LegToken().then(
    (accessToken) => doInitializeTheViewer(urnB64, accessToken, element)
);

我还需要在这里做什么才能让查看器同时呈现多页 pdf 文件以及其他 3D/2D 文件?

我在API documentation 中也找不到任何配置它的方法,也无法在任何示例中找到它。

【问题讨论】:

您是在尝试渲染 .pdf 文件还是链接 pdf 但无法在查看器中加载它的文件?如果是后者,您要加载什么类型的文件? @ShiyaLuo 不,我正在尝试在查看器中加载pdf 文件本身。它可以正确加载而没有任何错误。但问题是即使 pdf 文件有多个页面,也只会加载第一页 【参考方案1】:

.pdf 文件在查看器中被转换为 2D 图纸,.pdf 文件中的每个页面都应显示为单独的 2D 视图。

如果您只使用 Instantiate a Basic Viewer 中的样板代码,您将获得多个视图,如下所示:

既然你覆盖了onDocumentLoaded,那么看看Autodesk360App.js是如何实现onDocumentLoaded方法的。在第 621 行:

function showDesignExplorer( modelDocument )

    var viewableItems = Autodesk.Viewing.Document.getSubItemsWithProperties(modelDocument.getRootItem(), 'type':'folder','role':'viewable', true);
    var root = viewableItems[0];
    var geometryItems = Autodesk.Viewing.Document.getSubItemsWithProperties(root, 'type':'geometry', true);
    if (geometryItems.length === 0)
        return false;

    if (geometryItems.length === 1) 
        // Check if the item has camera views.
        return modelDocument.getNumViews( geometryItems[0] ) > 1;
    
    return true;

在您的onDocumentLoaded 方法中,调用Autodesk.Viewing.Document.getSubItemsWithProperties 方法以获取所有视图。

lmvdbg 也有一行演示如何加载所有视图。

【讨论】:

确实有道理。 Autodesk.Viewing.Document.getSubItemsWithProperties 确实返回了其他页面。谢谢。顺便说一句,我之所以重写 onDocumentLoadedonDocumentFailedToLoad 是因为我需要处理这些事件并在我们的应用程序中触发必要的操作。那么,在不覆盖这些方法的情况下,推荐的处理方法是什么? 此外,此处示例中显示的样板代码 developer.autodesk.com/en/docs/viewer/v2/tutorials/basic-viewer 使用 viewerApp.loadDocumentWithItemAndObject(documentId); 方法,该方法本身不接受任何回调来处理我需要处理的文档加载或错误事件。 随意复制+粘贴您需要的代码到您自己的onDocumentLoaded函数中。

以上是关于Autodesk Forge 查看器仅渲染 PDF 文件的单页的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Autodesk Forge Viewer 中嵌入 pdf?

Autodesk Forge Viewer PDF 捕捉和缩放问题

渲染警告:Autodesk forge 查看器中没有绑定到单元 1 的纹理

在 Autodesk Forge 中使用 Corona 渲染器渲染模型

在 Forge Viewer 上查看原生 PDF 和 DWF,无需翻译

Autodesk Forge Viewer 中的令牌续订