使用SVG标记生成新的PDF

问题描述

我正在尝试使用扩展名为Autodesk.PDF的SVG生成新的PDF

        Autodesk.Viewing.Initializer(options,function onInitialized() {
            viewer = new Autodesk.Viewing.GuiViewer3D(document.getElementById('MyViewerDiv'));
            viewer.setTheme("light-theme");
            viewer.start();

            viewer.loadExtension('Autodesk.PDF').then(() => {
                viewer.loadModel(path,viewer);
                viewer.loadExtension("Autodesk.Viewing.Markupscore")
                viewer.loadExtension("Autodesk.Viewing.MarkupsGui")
            });
        });

我可以加载PDF,但是之后我真的不知道该怎么办。

在控制台中玩游戏时,我设法找到了一个列表,并且可以对其进行迭代并保存在变量中。

我在后端使用iTextSharp来管理我的应用程序的PDF,因此,如果可以使用它将SVG添加到PDF中,那将是很好的选择,但是我愿意尝试另一个libs。

这就是我要添加SVG的方式:

        var reader = new PdfReader(new MemoryStream(File.ReadAllBytes(HttpContext.Current.Server.MapPath(path))));
        var pdfDocument = new PdfDocument(reader);
        var writer = new PdfDocument(new PdfWriter(HttpContext.Current.Server.MapPath("newdoc.pdf")).SetSmartMode(true));
        pdfDocument.copyPagesTo(1,1,writer);
        //var appendedHtml = "<html><body>";
        var appendedHtml = "<svg xmlns='http://www.w3.org/2000/svg' version='1.1' baseProfile='full' layer-order-id='markups-svg' style='position: absolute; left: 0px; top: 0px; transform: scale(1,-1); touch-action: none; user-select: none; -webkit-user-drag: none; -webkit-tap-highlight-color: rgba(0,0);' width='1105' height='690' viewBox='4.3959721282740105 4.558617165575239 30.58327865600586 19.097249984760307' pointer-events='painted' cursor='crosshair'><Metadata><markup_document xmlns='http://www.w3.org/1999/xhtml' data-model-version='4'></markup_document></Metadata><g cursor='inherit' pointer-events='stroke' style='touch-action: manipulation; user-select: none; -webkit-user-drag: none; -webkit-tap-highlight-color: rgba(0,0);'><Metadata><markup_element xmlns='http://www.w3.org/1999/xhtml' stroke-width='2.7548209366391347' stroke-color='#ff0000' stroke-opacity='1' fill-color='#ff0000' fill-opacity='0' type='rectangle' position='22.89795796238312 13.271543227939889' size='14.605644607543944 10.309867361327829' rotation='0'></markup_element></Metadata><path id='markup' d='M -5.925411835452405 -3.777523212344347 l 11.85082367090481 0 l 0 7.555046424688694 l -11.85082367090481 0 z' stroke-width='2.7548209366391347' stroke='rgba(255,1)' fill='none' transform='translate( 22.89795796238312,13.271543227939889 ) rotate( 0 )'/></g></svg>";
        byte[] bytes = Encoding.UTF8.GetBytes(appendedHtml);
        SvgConverter.DrawOnDocument(new MemoryStream(bytes),writer,1);
        pdfDocument.Close();
        writer.Close();

正确生成了新的PDF文件,但没有SVG ...

编辑: 显然是样式转换:scale(1,-1)使我的SVG在PDF上消失了,没有它,我可以看到SVG,但是它的位置不正确,尺寸也错误

左是正确的,右是通过我的代码

image comparison

解决方法

在Forge方面,恐怕我们无能为力。 Forge Viewer中的Autodesk.PDF扩展名仅支持读取 PDF,而不支持 write 。您可以 进行的操作是在Forge Viewer中将当前视图输出为光栅图像,然后在其中绘制标记SVG(请参见How do I get a snapshot of the forgeviewer without markups)。