Aspose Diagram 获取页面大小,然后导出图片 ,这里获取 pageWidth.getUfe().getUnit() 为负数

这里获取 pageWidth.getUfe().getUnit() 为负数,为了兼容,我做了一个处理,如果为负数默认了一个图纸的大小 ,但是实际页面不一致导致有拉伸 ,这个怎么处理呢

private static final PageSize DEFAULT_PAGE_SIZE_1 = new PageSize(1);
private static final PageSize DEFAULT_PAGE_SIZE_9 = new PageSize(9);

Diagram dgrm = null;
try
{
    dgrm = new Diagram(oriFilePath);
    dgrm.removeHiddenInformation((int)(RemoveHiddenInfoItem.SHAPES | RemoveHiddenInfoItem.MASTERS));

    String[] pageNames = new String[dgrm.getPages().getCount()];
    for (int i = 0; i < dgrm.getPages().getCount(); i++)
    {
        pageNames[i] = dgrm.getPages().get(i).getName();
    }

    try
    {
        File[] sourcepngs = new File[dgrm.getPages().getCount()];
        for (int i = 0; i < dgrm.getPages().getCount(); i++)
        {
            String pagename = filePrefix + File.separator + dgrm.getPages().get(i).getName()
                    .replace("/", "-")
                    .replace(" ", "")
                    + ".png";
            ImageSaveOptions options = new ImageSaveOptions(SaveFileFormat.PNG);
            options.setResolution(300);
            options.setImageColorMode(ImageColorMode.NONE);
            options.setPageIndex(i);
            final Page page = dgrm.getPages().get(i);
            final DoubleValue pageWidth = page.getPageSheet().getPageProps().getPageWidth();
            final DoubleValue pageHeight = page.getPageSheet().getPageProps().getPageHeight();
            final double pageWidthD = pageWidth.getUfe().getUnit() * pageWidth.getValue();
            final double pageHeightD = pageHeight.getUfe().getUnit() * pageHeight.getValue();
            final float pageWidthF = (float)(pageWidthD);
            final float pageHeightF = (float)((pageWidthF * pageHeightD) / pageWidthD);
            PageSize pageSize = null;
            if (pageWidthF <= 0 || pageHeightF <= 0)
            {
                pageSize = DEFAULT_PAGE_SIZE_1;
            }
            else if (pageWidthF * pageHeightF > Integer.MAX_VALUE)
            {
                // java.awt.image.SampleModel.SampleModel
                pageSize = DEFAULT_PAGE_SIZE_1;
            }
            else
            {
                pageSize = new PageSize(pageWidthF, pageHeightF);
            }
            log.info("page={} {} {}", pagename, pageSize.getWidth(), pageSize.getHeight());
            // 这里为啥要增加默认,由于上面的计算double转float 存在精度缺失,所以这里增加的默认的page大小
            if (DEFAULT_PAGE_SIZE_1.getHeight() >= pageSize.getHeight() && DEFAULT_PAGE_SIZE_1.getWidth() >= pageSize.getWidth())
            {
                //log.info("use default 1");
                pageSize = DEFAULT_PAGE_SIZE_1;
            }
            else if (DEFAULT_PAGE_SIZE_9.getHeight() >= pageSize.getHeight() && DEFAULT_PAGE_SIZE_9.getWidth() >= pageSize.getWidth())
            {
                //log.info("use default 9");
                pageSize = DEFAULT_PAGE_SIZE_9;
            }
            //log.info("width {} {}   f:{} d: {} just={}", pageWidth.getUfe().getUnit(), pageWidth.getValue(), (float) (1.0f * pageWidth.getUfe().getUnit() * pageWidth.getValue()), pageWidth.getUfe().getUnit() * pageWidth.getValue(), pageWidthF);
            //log.info("height {}  {}  f:{} d:{} just={}", pageHeight.getUfe().getUnit(), pageHeight.getValue(), (float) (1.0f * pageHeight.getUfe().getUnit() * pageHeight.getValue()), pageHeight.getUfe().getUnit() * pageHeight.getValue(), pageHeightF);
            options.setPageSize(pageSize);

            dgrm.save(pagename, options);


        }
    }
    catch (Exception e)
    {
        log.error("ConvertVisio convert error", e);
    }

@JetWang
您好,如果pageWidth.getUfe().getUnit() 为负数则表示这个单位为默认的visio单位“英寸”,

final double pageWidthD = pageWidth.getUfe().getUnit() * pageWidth.getValue();

这里得到的pageWidth就是获得的页面宽度,其单位为英寸,不需要再乘以pageWidth.getUfe().getUnit() ,谢谢。

@

pageSize = new PageSize(pageWidthF, pageHeightF); 这里构建pageSize ,那么如果是英寸这里需要怎么处理?

@JetWang

我们的单位和visio的单位默认都是英寸,所以您不需要做其他处理,谢谢。

这个不处理默认大小直接看不到 ,直接走这个默认的大小
private static final PageSize DEFAULT_PAGE_SIZE_1 = new PageSize(1);
DEFAULT_PAGE_SIZE_1 这个大小都是 841.0*2.834645669291339
case 1:
this.a = (float)t.h(841.0);
this.b = (float)t.h(1189.0);
break;

我这里打印的 尺寸大小为
14.192913 40.15748

通过官网的查看器导出的像素大小为 1363*3856
image.png (1.9 KB)

这个是没有调整的数据
image.png (9.2 KB)

@JetWang
您好,不好意思,pageSize = new PageSize(1);
其中的1为 A_0 A0 paper size format(841mm x 1189mm).
其大小是841mm*1189mm,宽度换算成英寸应该是841mm/25.4 = 33.11英寸,对应的pt为2383pt,当dpi为96时,对应像素为3178
请参考以下文档:

我的意思是 现在获取到了 尺寸大小为 14.192913 40.15748,怎么转换为正确的pageSize 这个数据 ,需要做什么特殊处理? pageWidth.getUfe().getUnit() * pageWidth.getValue() ,如果getUnit 等于负数应该怎么做?

@philip.zhou 尺寸大小为 14.192913 40.15748,怎么转换为正确的pageSize 这个数据 ,需要做什么特殊处理? pageWidth.getUfe().getUnit() * pageWidth.getValue() ,如果getUnit 等于负数应该怎么做?

@JetWang

您好,这里尺寸大小如果是英寸,请转换成pt也就是14.192913*72,然后作为参数传入 PageSize(float width, float height)
请参考下面的文档:

如果getUnit 等于负数应该怎么做?也是直接把英寸转换成pt也就是14.192913*72pt,然后作为参数传入

OK ,感谢 这种*72 解决了

@JetWang
很高兴您的问题得以解决,如果您有其他任何问题,非常欢迎您在论坛中继续创建主题,谢谢。

1 Like