cad(dwg,dxf)转pdf实践

最近项目中需要用到cad文件(dxf,dwg)转成pdf,然后前段实时预览

这里面主要使用到aspose-cad,可以从https://repository.aspose.com/webapp/#/artifacts/browse/tree/General/repo下载并且导入,可能maven仓库下载不下来,话不多说直接看代码

踩坑记录

这里主要是中文乱码的问题。这里处理了一天,总算解决,下面记录一下我的处理过程
1.首先百度,我看有个大佬说,我们在load成image那一步可以多穿一个参数,设置一个编码格式

        LoadOptions loadOptions = new LoadOptions();
        loadOptions.setSpecifiedEncoding(CodePages.SimpChineseOtherGb2312);

尝试之后还是不行
2.我跟大佬朋友商量了一下,是不是前端传过来的MultipartFile转成流的时候编码格式消失的问题,接着我就把传过来的文件转成字符流并且设置了一个编码格式,然后输入到临时文件并把这个临时文件的字节流穿load里面生成image,写了一大通,最后直接load那边就报错了。后来我把这两次转换结果都生成dwg文件,结果我发现,字节流那个可以用,但是字符流输出的文件就不行。跟大佬朋友商量可能图片转成字符的损耗
3.然后下午我自己分析了一下,说明前段传过来的问题是没问题的,因为传过来的文件我转出后是可以用的。同时我在第一步踩坑我设置了load的编码格式也不是,那会不会load出来的image我们也需要设置一个编码格式。不然就会丢失显示问题,进而转成pdf就不行,分析分析我就看到了CadImage里面有设置字体的方法,所以就把image直接强转成CadImage设置了字体格式,完美解决

修改后的代码

  /**
     * Description:
     * <dwg文件转为pdf>
     *
     * @param fileInputStream
     * @return void
     * @author suK
     * @date 2021/5/24
     **/
 public static File dwgToPdf(InputStream fileInputStream){

        //LoadOptions loadOptions = new LoadOptions();
        //loadOptions.setSpecifiedEncoding(CodePages.SimpChineseOtherGb2312);

        //将dwg文件转换成输入流
        Image objImage = Image.load(fileInputStream, loadOptions);
		
        CadImage cadImage = (CadImage) objImage;
		//******************************
		//下面这个代码必须得有,否则就会出现中文的乱码问题,这个setDefaultFont只是在CadImage这个类里面有
		//所以我们需要把Image转成CadImage
        cadImage.setDefaultFont("楷体");
        cadImage.setFileEncoding(CodePages.SimpChineseOtherGb2312);
		
        CadRasterizationOptions rasterizationOptions = new CadRasterizationOptions();
        //设置颜色
        rasterizationOptions.setBackgroundColor(Color.getBlack());
        rasterizationOptions.setPageWidth(1400);
        rasterizationOptions.setPageHeight(1400);
        rasterizationOptions.setAutomaticLayoutsScaling(true);
        rasterizationOptions.setNoScaling(false);
        rasterizationOptions.setDrawType(1);
        PdfOptions pdfOptions = new PdfOptions();
        pdfOptions.setVectorRasterizationOptions(rasterizationOptions);
        //输出文件
        File outputFile = new File(System.currentTimeMillis() + ".pdf");
        //存放地址
        try {
            cadImage.save(outputFile.getPath(), pdfOptions);
        } catch (Exception e) {
            e.printStackTrace();
            log.error("dwg转pdf失败{}", outputFile.getName());
        } finally {
            IOUtils.closeQuietly(fileInputStream);
        }
        log.debug("文件转换成功{}", outputFile.getName());
        return outputFile;
    }
posted @ 2022-04-27 16:03  Diamond-fz  阅读(449)  评论(1编辑  收藏  举报