mkdocs-with-pdf icon indicating copy to clipboard operation
mkdocs-with-pdf copied to clipboard

Cover page logo not displayed on Windows

Open jolekss opened this issue 2 years ago • 3 comments

I am running mkdocs-with-pdf 0.9.3 on Windows 10. The cover page logo (cover_logo) does not appear in the PDF. All other images work fine.

In the debug HTML, the image URL shows up as file://C:\dir1\dir2\dir3\pdf_cover.png, which does not even work in the browser (I use Chrome).

The only way I was able to work around this problem was by manually modifying the mkdocs_with_pdf\templates\filters\url.py file where I changed the following line: return 'file://' + path to the following: return 'file:///' + path.replace("\\", "/") Then the image appears correctly in the PDF.

Anything I am missing or is this indeed a bug in the plugin?

jolekss avatar Oct 28 '21 10:10 jolekss

I am having the same issue. I used several approaches to solve issues with weasyprint. So i also started to try it inside WSL with ubuntu. So it am not sure this is a problem related to just windows. I downloaded the samples and tried to render those. no success either. The cover page image is missing.

Just did an experiment and used a weblink to an image. That is being rendered perfectly. just not the local files.

pyjoku avatar May 14 '22 09:05 pyjoku

I have the same problem. It works on Linux but not Windows.

flavienbwk avatar Aug 05 '22 10:08 flavienbwk

I worked around it by adding a pdf_event_hook.py with the following content:

import logging, re, os.path
from urllib.parse import urlparse, urlunparse
from bs4 import BeautifulSoup

def normalize_url(str_url):
    url = urlparse(str_url)
    if url.scheme == 'file' and '\\' in url.netloc:
        return urlunparse((url.scheme, url.netloc.replace('\\', '/'), url.path, url.params, url.query, url.fragment))
    elif not url.scheme:
        return urlunparse(('file', url.netloc, os.path.abspath(url.path).replace('\\', '/'), url.params, url.query, url.fragment))
    return str_url


def fix_urls(match):
    quote, str_url = match.groups()
    return f'url({quote}{normalize_url(str_url)}{quote})'


def pre_pdf_render(soup: BeautifulSoup, logger: logging) -> BeautifulSoup:
    logger.info('(hook on pre_pdf_render)')
    url_re = re.compile(r'\burl\(([\'"]?)(.*?)\1\)')
    logger.info('Replacing relative url links with absolute and Windows-style paths in CSS')
    for tag in soup.find_all(lambda t: 'style' in t.attrs or t.name == 'style'):
        if tag.name == 'style':
            for child in tag.children:
                child.replace_with(url_re.sub(fix_urls, child))
        else:
            tag['style'] = url_re.sub(fix_urls, tag['style'])
    logger.info('Replacing img src tags')
    for tag in soup('img'):
        src = tag.get('src')
        if src:
            tag['src'] = normalize_url(src)
    return soup

Of course, I had to replace my relative links with relative to mkdocs.yml.

Lexy2 avatar Oct 17 '23 03:10 Lexy2