You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 00:52:56