如何修改pdf2odt代码将图片锚定类型改为paragraph?
修改pdf2odt中图片锚定类型的问题
需求背景
已完成将图片宽度设置为21cm的修改,现在需要把ODT文件中图片的锚定类型从as-char改为paragraph,使图片能延伸至页面边缘。
当前生成的ODT代码片段:
<draw:frame draw:style-name="fr1" draw:name="Frame.3" text:anchor-type="as-char" svg:width="21.001cm" svg:height="29.713cm" draw:z-index="2">
期望的ODT代码片段:
<draw:frame draw:style-name="fr1" draw:name="Frame.3" text:anchor-type="paragraph" svg:width="21.001cm" svg:height="29.713cm" draw:z-index="2">
尝试过程及错误
我在处理图片的代码段中尝试添加anchortype="paragraph"参数,或者直接调用SetAttribute('text:anchor-type', 'paragraph'),代码如下:
for filename in sorted(glob("pdfpage*.png")): img = Image.open(filename) x,y=img.size cmx=21 cmy=y*cmx/x img.close() doc.addImage(filename, filename) p = P(stylename="Illustration") p.addElement(doc.image(filename, cmx,cmy)) doc.insertInCursor(p, after=True) if args.tesseract==True: for line in open(filename[:-4] +".txt", "r", encoding='UTF-8').readlines(): p=P(stylename="Standard") p.addText(line) doc.insertInCursor(p, after=True) doc.save()
但执行时出现两个错误:
TypeError: ODT.image() got an unexpected keyword argument 'anchortype' AttributeError: Attribute text:anchor-type is not allowed in <draw:frame>
解决方法
方法1:直接修改生成的Frame元素属性
先获取doc.image()返回的draw:frame元素,再用odfpy的标准方法设置属性:
for filename in sorted(glob("pdfpage*.png")): img = Image.open(filename) x,y=img.size cmx=21 cmy=y*cmx/x img.close() doc.addImage(filename, filename) p = P(stylename="Illustration") # 获取生成的图片框架元素 img_frame = doc.image(filename, cmx, cmy) # 设置锚定类型属性 img_frame.setAttribute('text:anchor-type', 'paragraph') p.addElement(img_frame) doc.insertInCursor(p, after=True) # 保留原tesseract处理逻辑 if args.tesseract==True: for line in open(filename[:-4] +".txt", "r", encoding='UTF-8').readlines(): p=P(stylename="Standard") p.addText(line) doc.insertInCursor(p, after=True) doc.save()
如果仍报属性不允许的错误,检查odfpy版本——text:anchor-type是ODF标准中draw:frame的合法属性,旧版本库可能存在定义缺失,需升级odfpy。
方法2:修改框架样式(推荐)
找到项目中定义fr1样式的位置,在样式的graphic-properties中添加锚定类型设置,所有使用该样式的图片框架会自动继承:
<style:style style:name="fr1" style:family="graphic"> <style:graphic-properties text:anchor-type="paragraph" svg:width="21.001cm" <!-- 保留原有其他属性 --> /> </style:style>
方法3:遍历文档批量修改
如果上述方法无效,可在保存文档前,遍历所有draw:frame元素批量修改:
from odf.draw import Frame # 保留原图片处理代码... # 保存前修改所有图片框架的锚定类型 for frame in doc.getElementsByType(Frame): frame.setAttribute('text:anchor-type', 'paragraph') doc.save()
内容的提问来源于stack exchange,提问作者Ole Tange
相关产品推荐
相关产品推荐

