На самом деле PDF является НЕ изображением. Это контейнерный формат, который может содержать векторы и изображения с различными цветовыми пространствами и размерами. Растровое изображение имеет фиксированные размеры ширина, высота, плотность, а PDF нет. Первоначально он был создан и оптимизирован для работы на принтерах, а не на экранах.
TYPO3 отражает это с сообщением в бэкэнде:
ИМХО, там не существует идеального способа обработки PDF-файлов, которые бы вели себя как изображения, поскольку вы знаете формат вывода, но не формат ввода (правильно). Два способа получения приемлемых результатов:
- Расширение элементов содержимого или создание новых и добавление второго слота изображения для изображений предварительного просмотра PDF. Создайте изображения для предварительного просмотра самостоятельно с помощью графической программы.
- Напишите свой собственный видовой помощник и создайте собственные эскизы
Решение 1 приведет к дополнительной работе для редакторов. Для меня это не лучшая практика.
Я бы go имел собственный помощник по просмотру.
Добавьте свой собственный тип визуализации для PDF:
<f:switch expression="{file.type}">
<f:case value="5">
<f:render partial="Media/Type/Pdf" arguments="{file: file, dimensions: dimensions, data: data, settings: settings}" />
</f:case>
<f:defaultCase>
<f:render partial="Media/Type/Image" arguments="{file: file, dimensions: dimensions, data: data, settings: settings}" />
</f:defaultCase>
</f:switch>
Частичные носители / Тип / Pdf
{namespace cv=Conversion\HelperUtils\ViewHelpers}
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:ce="http://typo3.org/ns/TYPO3/CMS/FluidStyledContent/ViewHelpers" data-namespace-typo3-fluid="true">
<cv:forEachPdfThumbnail document="{file}" pages="1" as="pdfPreviewPage">
<f:image src="{pdfPreviewPage}" alt="" />
</cv:forEachPdfThumbnail>
</html>
ViewHelper:
Этот помощник по просмотру преобразует несколько страниц из PDF, используя CommandUtility :: imageMagickCommand. Вы можете повысить плотность до более высокого значения, чтобы улучшить качество. Как уже упоминалось, этот помощник по видам разрабатывался несколько лет go и мог быть улучшен (например, сохранение в fileadmin / обработано вместо typo3temp. Не стесняйтесь клонировать и улучшать: https://github.com/conversion1/t3-pdfthumbnailviewhelper/blob/master/ForEachPdfThumbnailViewHelper.php
public static function renderStatic(array $arguments, \Closure $renderChildrenClosure, RenderingContextInterface $renderingContext)
{
$templateVariableContainer = $renderingContext->getVariableProvider();
/** @var \TYPO3\CMS\Core\Resource\FileReference $document */
$document = $arguments['document'];
$pages = explode(',', str_replace(' ', '', $arguments['pages']));
$colorspace = TRUE === isset($GLOBALS['TYPO3_CONF_VARS']['GFX']['colorspace']) ? $GLOBALS['TYPO3_CONF_VARS']['GFX']['colorspace'] : 'RGB';
$absFilePath = GeneralUtility::getFileAbsFileName($document->getOriginalFile()->getPublicUrl());
$destinationPath = 'typo3temp/';
$destinationFilePrefix = 'pdf-prev_' . $document->getOriginalFile()->getNameWithoutExtension();
$destinationFileExtension = 'png';
$output = '';
foreach ($pages as $pageNumber) {
if($pageNumber > 0) {
$pageNumber = intval($pageNumber);
} else {
$pageNumber = 1;
}
$destinationFileSuffix = '_page-' . $pageNumber;
$absDestinationFilePath = GeneralUtility::getFileAbsFileName($destinationPath . $destinationFilePrefix . $destinationFileSuffix . '.' . $destinationFileExtension);
$imgArguments = '-colorspace ' . $colorspace;
$imgArguments .= ' -density 300';
$imgArguments .= ' -sharpen 0x.6';
$imgArguments .= ' "' . $absFilePath . '"';
$imgArguments .= '['. intval($pageNumber - 1) .']';
$imgArguments .= ' "' . $absDestinationFilePath . '"';
if(!file_exists($absDestinationFilePath)) {
$command = CommandUtility::imageMagickCommand('convert', $imgArguments);
CommandUtility::exec($command);
}
$thumbnail = substr($absDestinationFilePath, strlen(Environment::getPublicPath()));
$templateVariableContainer->add($arguments['as'], $thumbnail);
$output .= $renderChildrenClosure();
$templateVariableContainer->remove($arguments['as']);
}
return $output;
}
Редактировать:
Третий способ: вы можете использовать библиотеку JavaScript для создания миниатюр на лету. Например: https://github.com/mozilla/pdf.js