2015-01-07 2 views
1

У меня есть мои взгляды установить, как следующее:вывода изображения не удалось в Pdf xhtml2pdf

views.py

class PDFTemplateView(TemplateView): 
    Model = TemplateInfo 
    template_name = 'hello.html' 


    def get(self, *args, **kwargs): 
     obj = self.Model.objects.get(id = kwargs['pk']) 

     html = get_template(self.template_name).render(Context({'object' : obj})) 

     result = StringIO.StringIO() 
     rendering = pisa.pisaDocument(StringIO.StringIO(html.encode("ISO-8859-1")), result) 

     if not rendering.err: 
      return HttpResponse(result.getvalue(), mimetype='application/pdf') 
     return HttpResponse('We had some errors<pre>%s</pre>' % escape(html)) 

Я нашел решение в этом очень кормить с Defination из fetch_resource() функции но то не помогло меня. Я прочитал документацию, и мне было лучше без функции.

это мой шаблон "hello.html"

<style type="text/css"> 

@page { 
    background-image: url('/media/image/mainbg.jpg'); #this wouldnot give image too 
    size: letter portrait; 

    @frame header_frame {   /* Static Frame */ 
     -pdf-frame-content: header_content; 
     left: 50pt; width: 512pt; top: 50pt; height: 40pt; 
     -pdf-frame-border: 1; /* for debugging the layout */ 
    } 
    @frame content_frame {   /* Content Frame */ 
     left: 50pt; width: 512pt; top: 90pt; height: 632pt; 
     -pdf-frame-border: 1; /* for debugging the layout */ 
    } 
    @frame footer_frame {   /* Another static Frame */ 
     -pdf-frame-content: footer_content; 
     left: 50pt; width: 512pt; top: 772pt; height: 20pt; 
     -pdf-frame-border: 1; /* for debugging the layout */ 
    } 

</style> 
</head> 
<div id="header_content">Lyrics-R-Us</div> 

<div id="footer_content">(c) - page <pdf:pagenumber> 
    of <pdf:pagecount> 
</div> 

<ul> 
    <li>{{ object.emp_name }}</li> 
    <li>{{ object.designation }}</li> 
    <li>{{ object.image.url }}</li> 
</ul> 

Все кажется хорошо до сих пор. Но я не могу получить изображение в pdf. этот {{ object.image.url}} дает мне строку пути в формате pdf, но не изображение. Я что-то упускаю. Помоги мне, пожалуйста. Я застрял как часы.

+1

я понял, что сам. Я был в такой спешке, я думал, что просто скопирую и вставлю код sinppet. Извините за беспокойство. – Dan

ответ

0

Xhtmltopdf не использует «настоящие» правила CSS. Ваше фоновое изображение должно быть в формате pdf. Попробуйте конвертировать '/media/image/mainbg.jpg' в pdf и использовать background-image: url('/media/image/mainbg.pdf').

+0

Эй, спасибо за ваш ответ. Но это ничего не делало. Я все еще застрял! – Dan

+0

Я помню, я тоже боролся с этим вопросом ... Попробуйте 'background-image: url (/media/image/mainbg.pdf)' без кавычек. – Raphael

+0

Я сделал это уже с кавычками и без них. Вы ничего не помните, как вы справились с этим? – Dan

1

Проблема заключается в том, что xhtml2pdf не может найти эти изображения, если вы не определяете функцию link_callback, которая определяет путь к вашим статическим и мультимедийным файлам.

Эта функция в xhtml2pdf документы:

def link_callback(uri, rel): 
    # use short variable names 
    sUrl = settings.STATIC_URL  # Typically /static/ 
    sRoot = settings.STATIC_ROOT # Typically /home/userX/project_static/ 
    mUrl = settings.MEDIA_URL  # Typically /static/media/ 
    mRoot = settings.MEDIA_ROOT  # Typically /home/userX/project_static/media/ 

    # convert URIs to absolute system paths 
    if uri.startswith(mUrl): 
     path = os.path.join(mRoot, uri.replace(mUrl, "")) 
    elif uri.startswith(sUrl): 
     path = os.path.join(sRoot, uri.replace(sUrl, "")) 

    # make sure that file exists 
    if not os.path.isfile(path): 
     raise Exception('media URI must start with %s or %s' % (sUrl, mUrl)) 
    return path 

Убедитесь, чтобы определить все пути в функции link_callback (STATIC_URL ... и т.д.). Затем, когда вы визуализируете документ, включите link_callback следующим образом:

rendering = pisa.pisaDocument(StringIO.StringIO(html.encode("ISO-8859-1")), result, link_callback=link_callback) 
+0

im получение этой ошибки 'global name link_callback не определен' в этой строке' rendering = pisa.pisaDocument (StringIO.StringIO (html.encode («ISO-8859-1»)), result, link_callback = link_callback) '. Я точно определил функцию link_callback так, как вы сказали. – Dan

+0

Является ли link_callback внутри класса PDFTemplateView, чтобы получить доступ к этой функции? – DreaminVM

+0

Да, что находится внутри класса. Я следил за документацией, но я получал эту ошибку. Я нашел решение, которое работало для меня, и это удаляло функцию 'link_callback()' из класса и определяло жестко закодированные URL-адреса. Но мне все еще интересно, что вызвало эту ошибку. Я следовал всем инструкциям из документации. – Dan

0

Я столкнулся с той же проблемой. проверьте STATIC_ROOT в настройках, так как он должен указывать на место, где вы сохранили ваши статические файлы.

django-easy-pdf не удалось найти ваши активы (изображения, css и т. Д.), Пока вы не укажете их на STATIC_ROOT.

https://github.com/nigma/django-easy-pdf/blob/master/docs/usage.rst

0

я боролся долго с подобной проблемой, пока не удалены:

<pdf:pagecount> 

Дайте ему попробовать

Смежные вопросы