Заставьте изображение занять остальную часть страницы (и обрезать его) - PullRequest
1 голос
/ 23 сентября 2019

Я создаю PDF-файлы из XSL-FO с помощью Apache FOP.Я хотел бы иметь возможность форматировать изображения так, чтобы они занимали оставшееся место на странице.Я также хотел бы обрезать верхнюю / нижнюю или левую / правую часть изображения в зависимости от того, является ли соотношение сторон изображения слишком широким или слишком высоким, чтобы вместить пространство на остальной части страницы.

Вот небольшой тест, над которым я работаю:

<?xml version="1.0" encoding="iso-8859-1"?>

<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <fo:layout-master-set>
        <fo:simple-page-master master-name="test-page">
            <fo:region-body margin="1in"/>
        </fo:simple-page-master>
    </fo:layout-master-set>

    <fo:page-sequence master-reference="test-page">
        <fo:flow flow-name="xsl-region-body"> 
            <fo:block>Some content.</fo:block>
            <fo:block-container display-align="center" height="100%" overflow="hidden" break-after="page">
                <fo:block>
                    <fo:external-graphic width="100%" content-width="scale-to-fit" src="bgtall.png"/>
                </fo:block>
            </fo:block-container>
        </fo:flow>
    </fo:page-sequence>
</fo:root>

Две проблемы:

  • height="100%" это просто наполнитель.Я хочу, чтобы высота блока-контейнера была от текущего конца содержимого до конца страницы.Есть ли способ сделать это?
  • Сейчас я работаю только над обрезкой верха / низа.К сожалению, display-align="center" работает только тогда, когда содержимое меньше блока.Таким образом, мое слишком высокое изображение обрезано только снизу.

В настоящее время мы решаем эту проблему, дважды создав PDF-файл и обрезав изображения, чтобы они идеально подошли.Мне не нравится это решение, и я хотел бы найти лучший способ.

Ответы [ 2 ]

0 голосов
/ 24 сентября 2019

Вы можете использовать расширения XSLTE (https://github.com/pplcg/XSLTExtensions, https://www.w3.org/community/ppl/wiki/XSLTExtensions) из группы сообщества «Печать и макет страницы» (http://www.w3.org/community/ppl/) до:

  • Выполните первоеэтап форматирования в XSLT-преобразовании
  • Получить отформатированный размер фигур (и областей, в которые они не помещаются) из дерева областей из этапа форматирования
  • Создание окончательного XSL-FO с фигурами по центру в доступном для них пространстве (что вы, похоже, уже знаете, как это сделать)

Если XSLTExtensions не работает для вас:

  1. Поднимитепроблема в GitHub
  2. Использование сценариев, Ant, XProc или чего-либо еще для запуска FOP для генерации XML его дерева областей (существует два формата) и обработка этого во второй таблице стилей для генерации окончательного XSL-FO
0 голосов
/ 24 сентября 2019

Хотя это должно быть просто, по-видимому, это не работает в FOP.Я покажу вам результаты RenderX и FOP:

<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <fo:layout-master-set>
        <fo:simple-page-master margin-top="1in" margin-left="1in"
            margin-bottom="18pt" margin-right="18pt"
            page-width="700pt" page-height="780pt" master-name="first">
            <fo:region-body margin-top="0pt"/>
            <fo:region-before extent="0pt"/>
            <fo:region-after extent="0pt"/>
        </fo:simple-page-master>
    </fo:layout-master-set>
    <fo:page-sequence master-reference="first">
        <fo:flow flow-name="xsl-region-body">
            <fo:block space-before="18pt">Bingo</fo:block>
            <fo:block space-before="18pt">Bango</fo:block>
            <fo:block space-before="18pt">Bongo</fo:block>
            <fo:block>
                <fo:block-container reference-orientation="90" background-color="yellow">
                    <fo:block><fo:leader/></fo:block>
                </fo:block-container>
            </fo:block>
            <fo:block>I should be on the next page</fo:block>
        </fo:flow>
    </fo:page-sequence>
</fo:root>

, что дает вам следующее в RenderX - желтая область занимает всю оставшуюся область на странице, а содержимое после - на следующей странице.Неважно, сколько контента было раньше, оно «расширилось бы», приняв измерение прогрессии заполнения, и, поскольку оно поворачивается, это пространство от начала до верха области нижнего колонтитула.Вторая часть вашего вопроса будет просто включать и масштабировать изображение в желтой области.

enter image description here

То, что вы получите от FOP, совершенно неверно.Он помещает желтый блок на вторую страницу, а содержимое на третьей странице, а желтый блок рисуется совершенно неправильно.Это из FOP для того же файла:

enter image description here

Если вы собираетесь использовать FOP, вы должны сообщить об ошибке, поскольку их форматирование неверно.Нет причин переходить ко второй части вашего вопроса (для вставки и масштабирования изображения), потому что вы не можете достичь первой части.

...