Python将DXF文件转换为PDF或PNG或JPEG

时间:2019-11-17 23:20:32

标签: python pdf png jpeg dxf

有人知道将DXF文件转换为PNG或PDF的任何方法吗?

我有大量的DXF文件,我想将它们转换为图像以更快地查看它们。

如果可能,如何提取DXF文件值,例如DXF文件中该图形的厚度或尺寸。

3 个答案:

答案 0 :(得分:1)

https://github.com/Hamza442004/DXF2img

import matplotlib.pyplot as plt
import ezdxf
from ezdxf.addons.drawing import RenderContext, Frontend
from ezdxf.addons.drawing.matplotlib import MatplotlibBackend
#import wx
import glob
import re

class DXF2IMG(object):

default_img_format = '.png'
default_img_res = 300
def convert_dxf2img(self, names, img_format=default_img_format, img_res=default_img_res):
    for name in names:
        doc = ezdxf.readfile(name)
        msp = doc.modelspace()
        # Recommended: audit & repair DXF document before rendering
        auditor = doc.audit()
        # The auditor.errors attribute stores severe errors,
        # which *may* raise exceptions when rendering.
        if len(auditor.errors) != 0:
            raise exception("The DXF document is damaged and can't be converted!")
        else :
            fig = plt.figure()
            ax = fig.add_axes([0, 0, 1, 1])
            ctx = RenderContext(doc)
            ctx.set_current_layout(msp)
            ctx.current_layout.set_colors(bg='#FFFFFF')
            out = MatplotlibBackend(ax)
            Frontend(ctx, out).draw_layout(msp, finalize=True)

            img_name = re.findall("(\S+)\.",name)  # select the image name that is the same as the dxf file name
            first_param = ''.join(img_name) + img_format  #concatenate list and string
            fig.savefig(first_param, dpi=img_res)

答案 1 :(得分:0)

GNOME项目中的

Dia可以将dxf转换为png,它也有一个Python interface allowing for scripting

答案 2 :(得分:0)

https://stackoverflow.com/users/10678162/v-joe带给我答案,但是我想在这里重点介绍python代码。

  1. 下载并安装dia
  2. C:\Program Files (x86)\Dia\bin目录添加到您的PATH环境变量中。或者您可以使用:
setx path "%path%;C:\Program Files (x86)\Dia\bin"

在您的终端中。

确保添加到路径后重新启动IDE或终端

安装就差不多了,要在python代码中使用它,我发现这是最好的解决方案。

import os
os.popen(f'dia \"{filePath}\" -e outfile.png')

我注意到这种转换并不完美,或者对我来说不是,但这已经足够了。

希望这会有所帮助!