如何在ironPython下覆盖C#方法

时间:2012-02-01 05:41:24

标签: python override itextsharp ironpython

我希望通过以下帖子iText + HTMLWorker - How to change default font?在ironPython中实现iTextSharp FontProvider。

我的代码总是抛出:TypeError:GetFont()只需要8个参数(给定7个)。

$ ipy itexthtml.py
[INFO] __init__ .. AngsanaUPC
Traceback (most recent call last):
  File "itexthtml.py", line 74, in <module>
  File "itexthtml.py", line 65, in main
TypeError: GetFont() takes exactly 8 arguments (7 given)

我不知道有什么不对,有人可以帮忙吗?

我的python代码。

import clr

clr.AddReference("itextsharp")

from iTextSharp.text import Document, PageSize, FontFactoryImp
from iTextSharp.text.pdf import PdfWriter
from iTextSharp.text.html.simpleparser import HTMLWorker,StyleSheet
from System.Collections.Generic import List, Dictionary
from System.IO import FileStream, MemoryStream, FileMode, SeekOrigin, StreamReader
from System.Text import UTF8Encoding
from System import String, Object

class DefaultFontProvider (FontFactoryImp) :

    def __init__(self, string_def) :

        print "[INFO] __init__ ..", string_def
        self.default = string_def

    def GetFont(self, fontname,  encoding,  embedded,  size,  style,  color,  cached) :
        print "[INFO] getFont ..", fontname

        if (fontname == None) :
            fontname = self.default

        print "[INFO] return .."
        return super(DefaultFontProvider, self).GetFont(fontname, encoding, embedded, size, style, color, cached)


def main() :

    output_pdf_file = "test.pdf"
    f = open("test.html", "r")
    html_data = f.readlines()
    html_data = "".join(html_data)

    document =  Document(PageSize.A4);
    PdfWriter.GetInstance(document, FileStream(output_pdf_file, FileMode.Create))
    document.Open()

    providers = Dictionary[String,Object]()
    providers.Add(HTMLWorker.FONT_PROVIDER, DefaultFontProvider("AngsanaUPC"));

    h = HTMLWorker(document)

    h.SetInterfaceProps(providers)

    file_list = List[String]()

    styles = StyleSheet();
    #styles.LoadTagStyle("body", "font-family", "AngsanaUPC");
    #styles.LoadTagStyle("body", "font-face", "AngsanaUPC");

    for idx in range(1) :

        document.NewPage()

        mem = MemoryStream()
        b = UTF8Encoding.UTF8.GetBytes(html_data)
        mem.Write(b, 0, b.Length)
        mem.Seek(0, SeekOrigin.Begin)

        sr = StreamReader(mem, UTF8Encoding.UTF8, styles)
        h.Parse(sr)

        sr.Dispose()
        mem.Dispose()

    document.Close()


if __name__ == "__main__" :
    main()

和iTextSharp FontFactoryImp类的定义。

public class FontFactoryImp : IFontProvider
{
    // Fields
    private bool defaultEmbedding;
    private string defaultEncoding;
    private Dictionary<string, List<string>> fontFamilies;
    private static readonly ILogger LOGGER;
    private Dictionary<string, string> trueTypeFonts;
    private static string[] TTFamilyOrder;

    // Methods
    static FontFactoryImp();
    public FontFactoryImp();
    public virtual Font GetFont(string fontname);
    public virtual Font GetFont(string fontname, float size);
    public virtual Font GetFont(string fontname, string encoding);
    public virtual Font GetFont(string fontname, float size, BaseColor color);
    public virtual Font GetFont(string fontname, float size, int style);
    public virtual Font GetFont(string fontname, string encoding, bool embedded);
    public virtual Font GetFont(string fontname, string encoding, float size);
    public virtual Font GetFont(string fontname, float size, int style, BaseColor color);
    public virtual Font GetFont(string fontname, string encoding, bool embedded, float size);
    public virtual Font GetFont(string fontname, string encoding, float size, int style);
    public Font GetFont(string fontname, string encoding, bool embedded, float size, int style);
    public virtual Font GetFont(string fontname, string encoding, float size, int style, BaseColor color);
    public virtual Font GetFont(string fontname, string encoding, bool embedded, float size, int style, BaseColor color);
    public virtual Font GetFont(string fontname, string encoding, bool embedded, float size, int style, BaseColor color, bool cached);
    public virtual bool IsRegistered(string fontname);
    public virtual void Register(string path);
    public virtual void Register(string path, string alias);
    public virtual int RegisterDirectories();
    public virtual int RegisterDirectory(string dir);
    public int RegisterDirectory(string dir, bool scanSubdirectories);
    public void RegisterFamily(string familyName, string fullName, string path);

    // Properties
    public virtual bool DefaultEmbedding { get; set; }
    public virtual string DefaultEncoding { get; set; }
    public virtual ICollection<string> RegisteredFamilies { get; }
    public virtual ICollection<string> RegisteredFonts { get; }
}

2 个答案:

答案 0 :(得分:1)

我不是IronPython(或者python,甚至)大师,但几年前,当我使用IronPython作为C#库代码的轻量级测试工具时,我遇到了类似的问题。

我记得,对我来说问题是我以静态方式调用实例方法,因此“缺少”参数是类的实例。

我在博客上写了here,这足以引发我的记忆,但我显然认为显示实际修复并不重要。

我知道,这不是你问题的完整解决方案,但也许它会给你一个指向正确解决方案的指针。在我看来,super()调用可能是以静态方式调用的(即“调用此实例的父类的foo方法”,其中您实际上没有父类的实例来调用GetFont() )。

答案 1 :(得分:0)

而不是:

 return super(DefaultFontProvider, self).GetFont(fontname, encoding, embedded, size, style, color, cached)

使用:

return DefaultFontProvider.GetFont(self, fontname, encoding, embedded, size, style, color, cached)