xhtml2pdf создает пустой pdf для локального html файла

У меня есть интерактивный html-файл, созданный с использованием Bokeh. Я пытаюсь преобразовать html-файл в pdf, используя xhtml2pdf, но изображения в html-файле не отображаются в pdf с помощью xhtml2pdf или pdfkit.

Я попробовал PyQt для создания PDF-файлов, и он работал нормально, но были проблемы с преобразованием в исполняемый файл, и pdfcrowd тоже работал, но это платная библиотека. Я просмотрел все другие решения в Интернете, но ни одно из них не работает.

Это генерация html файла:

    source = ColumnDataSource(data=dict(x=xx, y=yy, z=val))
    
    surface1 = Surface3d1(x="x", y="y", z="z", data_source=source, width=600, height=600)
    surface2 = Surface3d2(x="x", y="y", z="z", data_source=source, width=600, height=600)
    surface3 = Surface3d3(x="x", y="y", z="z", data_source=source, width=600, height=600)
    surface4 = Surface3d4(x="x", y="y", z="z", data_source=source, width=600, height=600)
    
    l1 = gridplot([[Div(text = 'Side View 1'), Div(text = 'Front View')], [surface1, surface2]])
    l2 = gridplot([[Div(text = 'Side View 2'), Div(text = 'Top View')], [surface3, surface4]])

    filename = filename_out.split("\\")
    
    layout = column(Div(text = str(filename[-1].replace('_', ' '))),Div(text = 'Absolute Warpage = ' + str(warpage)),l1,l2)
    output_file(filename_out[:-1]+'.html', title = 'CMM Scan', mode = 'inline')
    save(layout)

Это код для конвертации в pdf

def convert_html_to_pdf(source_html, output_filename):
from xhtml2pdf import pisa 
# open output file for writing (truncated binary)
result_file = open(output_filename, "w+b")

# convert HTML to PDF
pisa_status = pisa.CreatePDF(
        source_html,                # the HTML to convert
        dest=result_file)           # file handle to recieve result

# close output file
result_file.close()                 # close output file

# return True on success and False on errors
return pisa_status.err

convert_html_to_pdf(str(filename_out+'.html'),str(filename_out+'.pdf'))

person Ray234    schedule 17.08.2020    source источник


Ответы (1)


Стандартные боке-графики — это программы JavaScript, которые визуализируются в растровый холст HTML. Я немного удивлен, узнав, что что-то работает для преобразования в PDF. Любой инструмент преобразования, который просматривает только базовый HTML-контент без фактического выполнения кода JS, определенно не может работать. Скорее всего, PyQt работает, потому что в него встроен реальный движок браузера, а другие инструменты — нет.

Возможно, вам повезет больше, установив output_backend="svg" на ваших графиках (но обратите внимание, что есть также некоторые известные проблемы, которые все еще исправляются с поддержкой Bokeh SVG, поэтому YMMV). Однако я подозреваю, что это также может привести к той же проблеме, что и выше, когда запуск кода JS — это то, что создает SVG, а при отсутствии движка JS график не появится.

В конечном счете, единственным вариантом может быть отдельный экспорт графиков боке (например, с использованием export_svgs или export_png) в статические PNG или SVG, которые можно включить в PDF (или в HTML-документ, который затем можно наивно преобразовать в PDF без запуска JS-код).

person bigreddot    schedule 17.08.2020