Reputation: 3781
I want to implement iTextSharp FontProvider in ironPython by following this post iText + HTMLWorker - How to change default font?.
My code always throws : TypeError: GetFont() takes exactly 8 arguments (7 given).
$ 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)
I don't know what wrong, Does one can help?
My python code.
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()
And iTextSharp FontFactoryImp class's definition.
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; }
}
Upvotes: 0
Views: 1149
Reputation: 346
Instead of:
return super(DefaultFontProvider, self).GetFont(fontname, encoding, embedded, size, style, color, cached)
use:
return DefaultFontProvider.GetFont(self, fontname, encoding, embedded, size, style, color, cached)
Upvotes: 0
Reputation: 8810
I'm no IronPython (or python, even) guru, but I ran into a similar problem a couple of years back when I was playing with IronPython as a light-weight testing tool for C# library code.
As I recall, the issue for me was that I was calling an instance method in a static manner, so the "missing" argument was an instance of the class.
I blogged about it here, which was enough to trigger my memory, but I apparently didn't think it was important enough to show the actual fix.
Not a complete solution to your problem, I know, but perhaps it'll give you a pointer to the right solution. It seems to me that the super() call might be being called in a static fashion (i.e. "call the foo method of this instance's parent class" where you don't actually have an instance of the parent class to call GetFont() on).
Upvotes: 1