CAD文件转换出错

此dwg文件转换成PDF时,提示以下异常信息,aspose.CAD 版本为26.1.0
Aspose.CAD.CadExceptions.ImageSaveException: Image export failed. Error during PDF export: Value cannot be null. (Parameter ‘s’)
—> System.Exception: Error during PDF export: Value cannot be null. (Parameter ‘s’)
—> System.ArgumentNullException: Value cannot be null. (Parameter ‘s’)
at System.ArgumentNullException.Throw(String paramName)
at #=z7_FvG92hKEraRUKINdU1wuQf9dpri_dFSbfSUYuzNM4uC1wqex_9OVwiKdXbYbjuzSOw1fY=.#=zU6PeucIyDggI(String #=zdRx_Kkw=, CodePages #=zPNi1t2U0e0cY)
at #=zh5cWUO1uVga7XfwbSs5qcAj1hDOp_1GKlxXWGk1nE7k3WW_md8xuZyct179aMLLqnQ==.#=zP0Dl5ng=(#=zrPy6Av_qEiiyBXLQaIB9SAvVyg9OjBJEpyqnzclqc585 #=z1kEGWEtK48XaN0UOWg==, String #=zt1tu4jw=, String #=zZlQukRM=)
at #=zh5cWUO1uVga7XfwbSs5qcAj1hDOp_1GKlxXWGk1nE7k3WW_md8xuZyct179aMLLqnQ==.#=z$f8aH0dUliUY(#=zrPy6Av_qEiiyBXLQaIB9SAvVyg9OjBJEpyqnzclqc585 #=z1kEGWEtK48XaN0UOWg==, #=zGgEdSY5Rt8Xta$q4Lko7z8eAoBmVNyssMmjtsGquxTj8A2xliOW1I2wDr3BG #=zlkxdYCmITvvW, String #=zt1tu4jw=, String #=zZlQukRM=, Double #=zGkv4_NRM64Uo, #=z9bjsVNvT$YlYv9jbnU5nAIUe3Y6LxOzXrikMJKbCwdjxP7dbjgKBW$s$nWReGvR1cJ8wRd0= #=z3gN7dbsmFzdF, Boolean #=zDhUOceeTduAyZE6Qvw==)
at #=zj5sKctRZpShUhVNHpu5l7JvfLO6sZeqI0_gXC9GF3xr7qQwmsKb95ymYqaLdeEQ_SSp8fGmoeCZsRUnG8jBEyrZEJknh.#=z0$s$U8=(#=z9v$LQuV0wIZJwxU2zz4ROftL205hlp4g694kT12RtxHfNF0RXov1yYg= #=zVi3Mx6CsrmdzT7Ar2848Sbo=, #=ziwHP6xJoqaedf1xKpLV_p3OLpHHym_UNmJ3cvieLYPo3 #=zn1XQ_nw=, #=zGgEdSY5Rt8Xta$q4Lko7z8eAoBmVNyssMmjtsGquxTj8A2xliOW1I2wDr3BG #=z0$d_1MHGvZJh, #=z9bjsVNvT$YlYv9jbnU5nAIUe3Y6LxOzXrikMJKbCwdjxP7dbjgKBW$s$nWReGvR1cJ8wRd0= #=zwuCoapWHJP90)
at #=zj5sKctRZpShUhVNHpu5l7JvfLO6sZeqI0_gXC9GF3xr7qQwmsKb95ymYqaLdeEQ_SSp8fGmoeCZsRUnG8jBEyrZEJknh.#=zF3Q7gWl8Cwem(CadEntityBase #=zdI5t2zc=, #=z9v$LQuV0wIZJwxU2zz4ROftL205hlp4g694kT12RtxHfNF0RXov1yYg= #=zVi3Mx6CsrmdzT7Ar2848Sbo=, #=zGgEdSY5Rt8Xta$q4Lko7z8eAoBmVNyssMmjtsGquxTj8A2xliOW1I2wDr3BG #=zlkxdYCmITvvW, #=znQ8j_iYA5UeKhExBDdgIJhKWgbp9IU49jQEUMptkjIkc #=zlqnVOTREZkA1, #=zGgEdSY5Rt8Xta$q4Lko7z8eAoBmVNyssMmjtsGquxTj8A2xliOW1I2wDr3BG #=z0$d_1MHGvZJh, #=z9bjsVNvT$YlYv9jbnU5nAIUe3Y6LxOzXrikMJKbCwdjxP7dbjgKBW$s$nWReGvR1cJ8wRd0= #=zwuCoapWHJP90, String& #=zhRkzCJBPsyb6, String& #=zQxrtEGORlGge)
at #=zj5sKctRZpShUhVNHpu5l7JvfLO6sZeqI0_gXC9GF3xr7qQwmsKb95ymYqaLdeEQ_SSp8fGmoeCZsRUnG8jBEyrZEJknh.#=z0K2yVEA=(CadEntityBase #=zdI5t2zc=, #=z9v$LQuV0wIZJwxU2zz4ROftL205hlp4g694kT12RtxHfNF0RXov1yYg= #=zVi3Mx6CsrmdzT7Ar2848Sbo=, #=zGgEdSY5Rt8Xta$q4Lko7z8eAoBmVNyssMmjtsGquxTj8A2xliOW1I2wDr3BG #=zlkxdYCmITvvW)
at #=zEYTIRSQnMShyt5MWfmE3oqcKZR6ZZlNaGR_ekriLwPFimFeQ9a6_b36L0caBGczxj2X7FvAPdE886psCEokYu3w=.#=zN$$WqW_68UWy(CadEntityBase #=zdI5t2zc=, #=z9v$LQuV0wIZJwxU2zz4ROftL205hlp4g694kT12RtxHfNF0RXov1yYg= #=zVi3Mx6CsrmdzT7Ar2848Sbo=, #=zGgEdSY5Rt8Xta$q4Lko7z8eAoBmVNyssMmjtsGquxTj8A2xliOW1I2wDr3BG #=zlkxdYCmITvvW)
at #=z9v$LQuV0wIZJwxU2zz4ROftL205hlp4g694kT12RtxHfNF0RXov1yYg=.#=zEOD7P$qPAUj_gQwTpIjtgKy_QqFs.MoveNext()
at #=z9v$LQuV0wIZJwxU2zz4ROftL205hlp4g694kT12RtxHfNF0RXov1yYg=.#=ztRy9_P_msnACSt_HQ1u8EKM5vLtR.MoveNext()
at #=z9v$LQuV0wIZJwxU2zz4ROftL205hlp4g694kT12RtxHfNF0RXov1yYg=.#=zX7c3t4YHPFPQJVEJOtoKEGE=.MoveNext()
at #=zfrEAY6ZNcDqi20EpXapyzByF4husL_nlmLtLoqsAjzZAgoPxLW0eWJ_V8aeLkTVSKA==.#=zlxVUg$SInOTDK9G6_g==(#=zM1c8N4VVkQgHlDod
$4XPfxY$Xcp #=z5JQMuPB8l5A7, #=zFHGliRFtsTDf9EZl4lomVvk= #=z3bXH5hs=, #=zCCp9XhBCFilm1skIAuZkLT0= #=zp50ALsmYVP15, #=zCCp9XhBCFilm1skIAuZkLT0= #=zdwS0svtsudI3, #=zM2VCt4hignCRVosXTMpSEEnSBlrlr2jrDbZJRIiC2QzOuCe7nA== #=zQQwIJCDuFRGB9Gm1WQ==, Int32 #=zuXxegIUy32mI, ImageOptionsBase #=zVUkHceI=, #=z1FkZheahSQGRIbXcNx7tpgA= #=zM5vJXa$cMzqI, #=z5gmXdAm1wHUshVvFoHBgm44= #=z9nFWZo0=)
at #=zHt$j_kA7hCbfLcr$wIfTmHMWLrCHtdmZhFj4XON7u1zZ95og2EHEZAH5VmvNE9sImg==.#=z0K2yVEA=(Image #=zo3ZQW18=, Stream #=z9Sw5I4o=, ImageOptionsBase #=zVUkHceI=, Rectangle #=zQVqNfHvQ4mSK)
— End of inner exception stack trace —
at #=zHt$j_kA7hCbfLcr$wIfTmHMWLrCHtdmZhFj4XON7u1zZ95og2EHEZAH5VmvNE9sImg==.#=z0K2yVEA=(Image #=zo3ZQW18=, Stream #=z9Sw5I4o=, ImageOptionsBase #=zVUkHceI=, Rectangle #=zQVqNfHvQ4mSK)
at Aspose.CAD.Image.#=zr0$wc9geg0KPGALuFt3Ef9M=.#=zoSFfN3FqXsHtmNGeEw==(CancellationToken #=zZa3b4GQ=)
at #=z$fQuQoBkXd9hvO$5ceupbRM=.#=zvK0Q7PjR5wb2H34aHw==.#=zxiIgqOmi1BdKV9GYydBGFbc=()
at System.Threading.ExecutionContext.RunFromThreadPoolDispatchLoop(Thread threadPoolThread, ExecutionContext executionContext, ContextCallback callback, Object state)
— End of stack trace from previous location —
at System.Threading.ExecutionContext.RunFromThreadPoolDispatchLoop(Thread threadPoolThread, ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.Tasks.Task.ExecuteWithThreadLocal(Task& currentTaskSlot, Thread threadPoolThread)
— End of stack trace from previous location —
at Aspose.CAD.Image.#=zVHElS9$2GYLkaRuetQ==.MoveNext()
— End of inner exception stack trace —
at Aspose.CAD.Image.#=zVHElS9$2GYLkaRuetQ==.MoveNext()
— End of stack trace from previous location —
at Aspose.CAD.Image.#=zrr20xmXTYz1GnhuE5g==.MoveNext()
— End of stack trace from previous location —
TKMF.dwg.zip (522.6 KB)

@PangXiaogang,
您好,
以下是我在 26.1 版本中测试有效的示例,结果附在附件中:

using (CadImage image = (CadImage)Aspose.CAD.Image.Load(fileName))
{
	var rasterizationOptions = new CadRasterizationOptions()
	{
		PageWidth = 1000,
		PageHeight = 1000,
	};

	var options = new PdfOptions
	{
		VectorRasterizationOptions = rasterizationOptions
	};

	image.Save("output.pdf", options);
}

能否请您分享一下导出代码,或者在您那边验证一下这段代码?操作系统是什么?
output.pdf (3.0 MB)

using (CadImage image = (CadImage)Aspose.CAD.Image.Load(fileName))
{
var rasterizationOptions = new CadRasterizationOptions
{
// // 高分辨率设置
// PageWidth = 1600,
// PageHeight = 1600,

            PageWidth = 0,
            PageHeight = 0,

            // 布局和缩放设置
            AutomaticLayoutsScaling = true,
            NoScaling = false,
            // ContentAsBitmap = true,

            // 图形质量设置
            DrawType = CadDrawTypeMode.UseObjectColor, // 使用对象颜色
            BackgroundColor = Color.Black,

            Layouts = ["Model"],
        };

RasterizationQuality quality = new RasterizationQuality();
        GraphicsOptions graphicsOptions = new GraphicsOptions();
        switch (_quality)
        {
            case CADConvertQuality.High:
                quality.Text = RasterizationQualityValue.High;
                quality.Hatch = RasterizationQualityValue.High;
                quality.Arc = RasterizationQualityValue.High;
                quality.Ole = RasterizationQualityValue.High;
                quality.ObjectsPrecision = RasterizationQualityValue.High;

                graphicsOptions.SmoothingMode = SmoothingMode.HighQuality;
                graphicsOptions.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;
                graphicsOptions.InterpolationMode = InterpolationMode.HighQualityBicubic;
                break;
            case CADConvertQuality.Medium:
                quality.Text = RasterizationQualityValue.Medium;
                quality.Hatch = RasterizationQualityValue.Medium;
                quality.Arc = RasterizationQualityValue.Medium;
                quality.Ole = RasterizationQualityValue.Medium;
                quality.ObjectsPrecision = RasterizationQualityValue.Medium;

                graphicsOptions.SmoothingMode = SmoothingMode.Default;
                graphicsOptions.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;
                graphicsOptions.InterpolationMode = InterpolationMode.Default;
                break;
            case CADConvertQuality.Low:
                quality.Text = RasterizationQualityValue.Low;
                quality.Hatch = RasterizationQualityValue.Low;
                quality.Arc = RasterizationQualityValue.Low;
                quality.Ole = RasterizationQualityValue.Low;
                quality.ObjectsPrecision = RasterizationQualityValue.Low;

                graphicsOptions.SmoothingMode = SmoothingMode.HighSpeed;
                graphicsOptions.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;
                graphicsOptions.InterpolationMode = InterpolationMode.Low;
                break;
        }

        rasterizationOptions.Quality = quality;
        rasterizationOptions.GraphicsOptions = graphicsOptions;

        // 创建PDF选项
        var pdfOptions = new PdfOptions
        {
            VectorRasterizationOptions = rasterizationOptions
        };

        if (!string.IsNullOrEmpty(waterMarkText))
        {
            pdfOptions.UserWatermarkText = waterMarkText;
            pdfOptions.UserWatermarkColor = Color.FromArgb(30, 0, 0, 0);
        }

image.Save("output.pdf", pdfOptions);

}
操作系统为windows Server 2019,netcore 8

@PangXiaogang,
你的代码在我这里运行正常,堆栈跟踪显示可能是字体方面存在一些问题。请给我们一些时间来调查这个问题。

是不是服务器系统缺少对应的字体造成的?如果是的话,能否使用默认字体转换,不要出错。

@PangXiaogang,
如果缺少所需的字体,我们会根据不同的操作系统使用内部默认字体。

请问您那边能否确认一下,额外设置一下是否有帮助:

cadImage.DefaultFont = "Arial";

请问在导出之前移除代理实体是否能解决这个问题?

List<CadEntityBase> toRemove = new List<CadEntityBase>();

foreach (CadEntityBase entityBase in cadImage.Entities)
{
	if (entityBase.TypeName == CadEntityTypeName.ACAD_PROXY_ENTITY)
	{
		toRemove.Add(entityBase);
	}
}

foreach (CadEntityBase entityBase in toRemove)
{
	cadImage.TryRemoveEntity(entityBase);
}

请您再确认一下,图片加载是否像我们上面的示例一样,没有使用 LoadOptions 和编码(例如,没有 loadOptions.SpecifiedEncoding = CodePages.SimpChinese)。

List toRemove = new List();

foreach (CadEntityBase entityBase in cadImage.Entities)
{
if (entityBase.TypeName == CadEntityTypeName.ACAD_PROXY_ENTITY)
{
toRemove.Add(entityBase);
}
}

foreach (CadEntityBase entityBase in toRemove)
{
cadImage.TryRemoveEntity(entityBase);
}

当转换前添加以上代码(移除代理实体),可以正常导出。导出的PDF是否会缺失相应的实体?这段代码是否会影响其它正常DWG文件导出的PDF?

@PangXiaogang,
是的,在这种情况下,代理实体不会显示。但问题并非直接出在代理实体上,其他带有文本的实体也可能出现此问题,我要求您移除它们只是为了验证问题所在。问题与文件加载时的编码设置有关。如果您在加载时不使用编码,导出现在就能成功(不会丢失实体)。我们将在 Aspose.CAD 26.4 版本中修复此问题(但无法保证),因此即使启用了编码选项,问题也能得到解决。

var options = new LoadOptions
{
SpecifiedEncoding = CodePages.SimpChinese,
SpecifiedMifEncoding = MifCodePages.SimpChinese,
// UnloadOnDispose = true,
RecoverMalformedCifMif = true,
// VectorizationOptions = new VectorizationOptions()
};
Image image = Image.Load(inputFilePath, options)
在实际代码中已经添加了编码设置(在提问未体现)。不知道这些代码,是否对解决此问题有用。

@PangXiaogang,
这些选项非常重要,因为如果没有它们,问题将无法重现。我已经用这些选项测试过解决方案,我们将在即将发布的版本中提供修复程序。

另外,从客户的反馈得知,此文件是由三维图纸转换而来。或许对修复问题有帮助。

@PangXiaogang,
出现此问题的原因是我们在 ACAD PROXY 实体中对空文本字符串应用了编码,因此我们添加了此检查。

好的,期待新版本的发布。

1 Like