百度搜的PyMuPDF的使用都是千篇一律,就几个简单用法,建议还是去翻官方网站的教程。最近要对Autocad 和SolidWorks 转换成PDF的图纸进行分析,一直摸不着头脑,看了官方网站才了解一些。转换成PDF的图纸元素叫 Shape 和 Graphics,还有一点 text blocks,官方的源码例子如下,简单好用:
import pymupdf #已经不叫fitz了,就是pymupdf,如果版本老,就卸载fitz doc = pymupdf.open("some.file") page = doc[0] paths = page.get_drawings() # extract existing drawings 最重要的一句 # this is a list of "paths", which can directly be drawn again using Shape # ------------------------------------------------------------------------- # # define some output page with the same dimensions outpdf = pymupdf.open() outpage = outpdf.new_page(width=page.rect.width, height=page.rect.height) shape = outpage.new_shape() # make a drawing canvas for the output page # -------------------------------------- # loop through the paths and draw them # -------------------------------------- for path in paths: # ------------------------------------ # draw each entry of the 'items' list # ------------------------------------ for item in path["items"]: # these are the draw commands if item[0] == "l": # line shape.draw_line(item[1], item[2]) elif item[0] == "re": # rectangle shape.draw_rect(item[1]) elif item[0] == "qu": # quad shape.draw_quad(item[1]) elif item[0] == "c": # curve shape.draw_bezier(item[1], item[2], item[3], item[4]) //贝塞尔曲线 else: raise ValueError("unhandled drawing", item) # ------------------------------------------------------ # all items are drawn, now apply the common properties # to finish the path # ------------------------------------------------------ shape.finish( fill=path["fill"], # fill color color=path["color"], # line color dashes=path["dashes"], # line dashing even_odd=path.get("even_odd", True), # control color of overlaps closePath=path["closePath"], # whether to connect last and first point lineJoin=path["lineJoin"], # how line joins should look like lineCap=max(path["lineCap"]), # how line ends should look like width=path["width"], # line width stroke_opacity=path.get("stroke_opacity", 1), # same value for both fill_opacity=path.get("fill_opacity", 1), # opacity parameters ) # all paths processed - commit the shape to its page shape.commit() outpdf.save("drawings-page-0.pdf")
如何删除Drawings:
paths = page.get_drawings() rect = paths[0]["rect"] # rectangle of the 1st drawing page.add_redact_annot(rect) page.apply_redactions(0,2,1) # potentially set options for any of images, drawings, text
如何创建Drawings,for example: draw a circle:
# Draw a circle on the page using the Page method page.draw_circle((center_x, center_y), radius, color=(1, 0, 0), width=2) # Draw a circle on the page using a Shape object shape = page.new_shape() shape.draw_circle((center_x, center_y), radius) shape.finish(color=(1, 0, 0), width=2) shape.commit(overlay=True)
The Shape object can be used to combine multiple drawings that should receive common properties as specified by Shape.finish().