获取到dwg的长宽不正确,导致转出的PDF也有问题(有空白)

我尝试通过Aspose.CAD将Dwg文件转为Pdf的时候,发现转出来的PDF尺寸不对、PDF页面有空白。
调试的时候,发现通过Image.Load获取到Image对象的宽Width、高Height、单位UnitType就有问题,即便我在转PDF的时候通过CadRasterizationOptions对宽、高重新进行了设置,但是转出来的PDF仍然有上面提到的问题。
aspose.cad 版本 20.12.0.0
测试dwg文件
test.dwg.zip (22.0 KB)
测试转的PDF,01默认转的pdf,02设置导出pdf长宽后的pdf
test.pdf.zip (243.3 KB)
目前不确定问题在哪,希望大佬给解决下,万分感谢!
如下是代码:

protected void Test()
    {
        string dwgFilePath = MapPath(@"~/test.dwg");
        string pdfFilePath = MapPath("~/test.pdf");

        using (Aspose.CAD.Image image = Aspose.CAD.Image.Load(dwgFilePath))
        {
            // Create an instance of PdfOptions
            Aspose.CAD.ImageOptions.PdfOptions pdfOptions = new Aspose.CAD.ImageOptions.PdfOptions();

            Aspose.CAD.ImageOptions.CadRasterizationOptions rasterizationOptions = new Aspose.CAD.ImageOptions.CadRasterizationOptions();
            rasterizationOptions.PageWidth = image.Width / Dwg2PdfHelper.Inch_MM;
            rasterizationOptions.PageHeight = image.Height / Dwg2PdfHelper.Inch_MM;

            rasterizationOptions.AutomaticLayoutsScaling = true;
            rasterizationOptions.UnitType = Aspose.CAD.ImageOptions.UnitType.Millimeter;

            // Set the VectorRasterizationOptions property
            pdfOptions.VectorRasterizationOptions = rasterizationOptions;

            // Export CAD to PDF
            image.Save(pdfFilePath, pdfOptions);
        }
    }

@Loli,
当我打开文件时,我看到此内容 (content.png (9.9 KB)) 没有外部引用,因此在这种情况下结果似乎是正确的。 我猜您希望外部内容出现在此处,因此您需要确保所有 7 个外部参考都根据 DWG 文件中的路径存在。
这是您可以打印到它们的路径的示例:
foreach (CadBaseObject baseObject in image.Objects)
{
if (baseObject.TypeName == CadObjectTypeName.IMAGEDEF)
{
CadRasterImageDef rasterImageDef = (CadRasterImageDef)baseObject;
System.Console.WriteLine(rasterImageDef.FileName);
}
}

感谢您的回复。
问题中的dwg文件,删除了不存在的参照,确实可以正确转出来,不过UnitType还是错的,能够正常转出也是通过我重新设置转出PDF的单位实现的。

然而更大的问题是,我用其他dwg(有多个图层)转PDF的时候,依旧存在转出PDF有空白的问题,而且图层中设置了打印不显示的图层也在转的PDF显示了,而且我设置了pdf打印驱动也无效。
rasterizationOptions.Layers = new string[] { “0”, “TK”, “ZSSignLayer” };
aspose的大佬们,可以指点下,转PDF获取宽高的规则吗?

@Loli,
让我们区分不同的问题以使其更简单。

  1. 请在此处查看我的示例 Page Size not honored - #5 by oleksii.gorokhovatskyi 我希望它会有所帮助。 如果我误解了,请指定所需的 PDF 大小和相应的绘图文件。
  2. 如果您通过 rasterizationOptions.Layers = new string[] 将图层设置为打印…无论绘图中的图层属性如何,都只会导出这些图层。 您可以通过更改相应属性来控制单独图层的导出:
    foreach(cadImage.Layers 中的 CadLayerTable 层)
    {
    layer.PlotFlag = true;
    }
    如果您发现有问题,请附上您的文件和代码以及描述的预期结果,以便我们更好地为您提供帮助。

@Oleksii.Gorokhovatskyi
1,我说的是通过Image image=Image.load(“文件”) 获取到image对象的宽高、单位就有问题,所以才导致转出的PDF尺寸也有问题(即问题本身在获取dwg图纸的属性上,不在于如何设置转PDF)
而且,按照你发的代码,反而导致本来可以正常转出pdf的,结果转出来PDF尺寸反而不对了。
我后来又发现,把图纸内容清理下,再按我自己的方法进行设置PDF尺寸,转出来效果的对的。
由此,我想了解下,目前是否有清理图纸内容的方法(CAD中的pu命令)
2、我的意思,我已经设置了导出对应图层,但是代码没起作用。
rasterizationOptions.Layers = new string[] { “0”, “TK”, “ZSSignLayer” };
我这么设置,应该是转PDF的时候只显示这三个图层的内容,但实际上其他图层内容还是显示了。
或者能不能按照图层自己的属性导出PDF,图层是设置了打印的时候是否显示对应图层了
dwg文件:test-2.zip (92.5 KB)
转出pdf文件:test-2.pdf (414.7 KB)
另外,您发的如下代码,在我的代码里没有对应的Layers属性(我用的Aspose.CAD 版本 20.12.0.0)
foreach(cadImage.Layers 中的 CadLayerTable 层)
{
layer.PlotFlag = true;
}
非常感谢您的帮助与支持。

@Loli,
1.让我解释一下。我说的是第一个“test-2.dwg”文件。当我通过“使用(Aspose.CAD.Image cadImage = Aspose.CAD.Image.Load(fileName))”加载它时,我看到 cadImage.UnitType 是毫米,如果我在 Autocad 中验证(格式->单位)这是正确的)。加载的 cadImage 的高度为 297,宽度为 420。这些值是从 EXTMIN = 1434.0290,1090.0190,0.0000(只读)和 EXTMAX = 1854.0290,1387.0190,0.0000(只读)中获取的。所以一切似乎都是正确的。至于我,您在第一个代码示例中的缩放就很好。
不,没有办法清除绘图。您可以使用 cadImage.RemoveEntity 或 cadImage.RemoveEntityAt 删除实体,但似乎要清除绘图,我们需要删除样式、附加对象等。目前设计无法做到这一点。
2. 请指出“test-2.pdf”中的哪些对象不应该存在。

您也可以手动过滤所需图层中的对象(使用 (CadImage cadImage = (CadImage)Aspose.CAD.Image.Load(fileName)) 加载图形):

List requiredLayers = new List { “0”, “TK”, “ZSSignLayer” };
列表 过滤实体 = 新列表();
for (int i = 0; i < cadImage.Entities.Length; i++)
{
if (requiredLayers.Contains(cadImage.Entities[i].LayerName))
{
过滤实体.Add(cadImage.Entities[i]);
}
}
cadImage.Entities = 过滤实体.ToArray();

我们建议您更新到最新版本,20.12 已经足够老了。

您好,我还有新的疑问:
1、由于无效的外部参照,导致获取dwg的宽高有问题
那么,Aspose.CAD可以获取外部参考,并删除无效的外部参考吗?
2、不确定合种原因,在CAD中显示正常,但是转出来的PDF字体显示有问题、有些线条不显示了
如下图:pdf问题说明.jpg (116.2 KB)
dwg文件:test.dwg.zip (511.5 KB)
pdf文件:test.pdf (2.8 MB)

thank u

@Loli,

  1. 没有办法删除损坏的引用,因为它们在内部被忽略了。但你是对的,损坏的引用仍可能影响图像大小。我们有 cadImage.UpdateSize() 方法来强制我们自己的大小重新计算特殊情况。所以,对于你的情况,我建议这样的事情,请测试一下,如果这有用:
    bool updateSizeRequired = false;

    foreach(cadImage.Objects in CadBaseObject baseObject)
    {
    if (baseObject.TypeName == CadObjectTypeName.IMAGEDEF)
    {
    CadRasterImageDef rasterImageDef = (CadRasterImageDef)baseObject;
    if (!File.Exists(rasterImageDef.FileName))
    {
    updateSizeRequired = true;
    break;
    }
    }
    }

    if (updateSizeRequired)
    {
    cadImage.UpdateSize();
    }

  2. 我可以看到字体的问题,不幸的是,它为我们所知。我们正在支持您的文件中的 SHX 字体和大 SHX 字体。您可以尝试使用以下选项:
    using (CadImage cadImage = (CadImage)Aspose.CAD.Image.Load(fileName, new LoadOptions() { SpecifiedEncoding = CodePages.SimpChinese }))

    rasterizationOptions.ShxFonts = new string[] { “pathToFonts\gbcbig.shx”, };

并看到结果好一点(test-3.dwg.pdf (2.8 MB))。我另外创建了 CADNET-8638 以研究将来针对此文件的一些特定问题。

thank you.
At present, it is still difficult to realize the needs of our company. I will find you again in the future.

1 Like

@Loli,
thank you too, we were happy to help.

The issues you have found earlier (filed as CADNET-8638) have been fixed in this Aspose.CAD for .NET 22.7 update. This message was posted using Bugs notification tool by Oleksii.Gorokhovatskyi