mirror of
https://github.com/alchemy-fr/Phraseanet.git
synced 2025-10-12 20:43:25 +00:00
generate pdf subdef
This commit is contained in:
@@ -10,6 +10,7 @@
|
||||
|
||||
namespace Alchemy\Phrasea\Filesystem;
|
||||
|
||||
use Alchemy\Phrasea\Media\Subdef\Specification\PdfSpecification;
|
||||
use Alchemy\Phrasea\Model\RecordInterface;
|
||||
use MediaAlchemyst\Specification\SpecificationInterface;
|
||||
|
||||
@@ -163,6 +164,8 @@ class FilesystemService
|
||||
return $this->getExtensionFromVideoCodec($spec->getVideoCodec());
|
||||
case SpecificationInterface::TYPE_SWF:
|
||||
return 'swf';
|
||||
case PdfSpecification::TYPE_PDF:
|
||||
return 'pdf';
|
||||
}
|
||||
|
||||
return null;
|
||||
@@ -205,8 +208,6 @@ class FilesystemService
|
||||
return 'jpg';
|
||||
case 'png':
|
||||
return 'png';
|
||||
case 'pdf':
|
||||
return 'pdf';
|
||||
}
|
||||
|
||||
return null;
|
||||
|
@@ -34,7 +34,7 @@ class Image extends Provider
|
||||
$this->registerOption(new OptionType\Boolean($this->translator->trans('Remove ICC Profile'), self::OPTION_STRIP, false));
|
||||
$this->registerOption(new OptionType\Boolean($this->translator->trans('Flatten layers'), self::OPTION_FLATTEN, false));
|
||||
$this->registerOption(new OptionType\Range($this->translator->trans('Quality'), self::OPTION_QUALITY, 0, 100, 75));
|
||||
$this->registerOption(new OptionType\Enum('Image Codec', self::OPTION_ICODEC, array('jpeg', 'png', 'tiff', 'pdf'), 'jpeg'));
|
||||
$this->registerOption(new OptionType\Enum('Image Codec', self::OPTION_ICODEC, array('jpeg', 'png', 'tiff'), 'jpeg'));
|
||||
}
|
||||
|
||||
public function getType()
|
||||
|
36
lib/Alchemy/Phrasea/Media/Subdef/Pdf.php
Normal file
36
lib/Alchemy/Phrasea/Media/Subdef/Pdf.php
Normal file
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
|
||||
namespace Alchemy\Phrasea\Media\Subdef;
|
||||
|
||||
use Symfony\Component\Translation\TranslatorInterface;
|
||||
use Alchemy\Phrasea\Media\Subdef\Specification\PdfSpecification;
|
||||
|
||||
class Pdf extends Provider
|
||||
{
|
||||
protected $options = [];
|
||||
|
||||
public function __construct(TranslatorInterface $translator)
|
||||
{
|
||||
$this->translator = $translator;
|
||||
}
|
||||
|
||||
public function getType()
|
||||
{
|
||||
return self::TYPE_PDF;
|
||||
}
|
||||
|
||||
public function getDescription()
|
||||
{
|
||||
return $this->translator->trans('Generates a pdf file');
|
||||
}
|
||||
|
||||
public function getMediaAlchemystSpec()
|
||||
{
|
||||
if (! $this->spec) {
|
||||
$this->spec = new PdfSpecification();
|
||||
}
|
||||
|
||||
return $this->spec;
|
||||
}
|
||||
|
||||
}
|
@@ -0,0 +1,15 @@
|
||||
<?php
|
||||
|
||||
namespace Alchemy\Phrasea\Media\Subdef\Specification;
|
||||
|
||||
use MediaAlchemyst\Specification\AbstractSpecification;
|
||||
|
||||
class PdfSpecification extends AbstractSpecification
|
||||
{
|
||||
const TYPE_PDF = 'pdf';
|
||||
|
||||
public function getType()
|
||||
{
|
||||
return self::TYPE_PDF;
|
||||
}
|
||||
}
|
@@ -22,6 +22,7 @@ interface Subdef
|
||||
const TYPE_VIDEO = 'video';
|
||||
const TYPE_AUDIO = 'audio';
|
||||
const TYPE_FLEXPAPER = 'flexpaper';
|
||||
const TYPE_PDF = 'pdf';
|
||||
const TYPE_UNKNOWN = 'unknown';
|
||||
|
||||
/**
|
||||
|
@@ -19,11 +19,16 @@ use Alchemy\Phrasea\Core\Event\Record\SubDefinitionsCreationEvent;
|
||||
use Alchemy\Phrasea\Core\Event\Record\SubDefinitionCreationFailedEvent;
|
||||
use Alchemy\Phrasea\Core\Event\Record\RecordEvents;
|
||||
use Alchemy\Phrasea\Filesystem\FilesystemService;
|
||||
use Alchemy\Phrasea\Media\Subdef\Specification\PdfSpecification;
|
||||
use MediaAlchemyst\Alchemyst;
|
||||
use MediaAlchemyst\Specification\Image;
|
||||
use MediaVorus\MediaVorus;
|
||||
use MediaAlchemyst\Exception\ExceptionInterface as MediaAlchemystException;
|
||||
use Neutron\TemporaryFilesystem\Manager;
|
||||
use Psr\Log\LoggerInterface;
|
||||
use Unoconv\Exception\ExceptionInterface as UnoconvException;
|
||||
use Unoconv\Exception\RuntimeException;
|
||||
use Unoconv\Unoconv;
|
||||
|
||||
class SubdefGenerator
|
||||
{
|
||||
@@ -70,12 +75,8 @@ class SubdefGenerator
|
||||
|
||||
}
|
||||
}
|
||||
$recordType = $record->getType();
|
||||
if(isset($this->tmpFilePath) && $recordType != 'image'){
|
||||
$recordType = 'image';
|
||||
}
|
||||
|
||||
if (null === $subdefs = $record->getDatabox()->get_subdef_structure()->getSubdefGroup($recordType)) {
|
||||
if (null === $subdefs = $record->getDatabox()->get_subdef_structure()->getSubdefGroup($record->getType())) {
|
||||
$this->logger->info(sprintf('Nothing to do for %s', $record->getType()));
|
||||
$subdefs = [];
|
||||
}
|
||||
@@ -169,14 +170,48 @@ class SubdefGenerator
|
||||
|
||||
return;
|
||||
}
|
||||
if(isset($this->tmpFilePath)){
|
||||
$this->alchemyst->turnInto($this->tmpFilePath , $pathdest, $subdef_class->getSpecs());
|
||||
}else{
|
||||
|
||||
if (isset($this->tmpFilePath) && $subdef_class->getSpecs() instanceof Image) {
|
||||
|
||||
$this->alchemyst->turnInto($this->tmpFilePath, $pathdest, $subdef_class->getSpecs());
|
||||
|
||||
} elseif ($subdef_class->getSpecs() instanceof PdfSpecification){
|
||||
|
||||
$this->generatePdfSubdef($record->get_hd_file()->getPathname(), $pathdest);
|
||||
|
||||
} else {
|
||||
|
||||
$this->alchemyst->turnInto($record->get_hd_file()->getPathname(), $pathdest, $subdef_class->getSpecs());
|
||||
|
||||
}
|
||||
|
||||
} catch (MediaAlchemystException $e) {
|
||||
$this->logger->error(sprintf('Subdef generation failed for record %d with message %s', $record->getRecordId(), $e->getMessage()));
|
||||
}
|
||||
}
|
||||
|
||||
private function generatePdfSubdef($source, $pathdest)
|
||||
{
|
||||
try {
|
||||
$mediafile = $this->app['mediavorus']->guess($source);
|
||||
} catch (MediaVorusFileNotFoundException $e) {
|
||||
throw new FileNotFoundException(sprintf('File %s not found', $source));
|
||||
}
|
||||
|
||||
try {
|
||||
if ($mediafile->getFile()->getMimeType() != 'application/pdf') {
|
||||
$this->app['unoconv']->transcode(
|
||||
$mediafile->getFile()->getPathname(), Unoconv::FORMAT_PDF, $pathdest
|
||||
);
|
||||
|
||||
} else {
|
||||
copy($mediafile->getFile()->getPathname(), $pathdest);
|
||||
}
|
||||
} catch (UnoconvException $e) {
|
||||
throw new RuntimeException('Unable to transmute document to pdf due to Unoconv', null, $e);
|
||||
} catch (\Exception $e) {
|
||||
throw $e;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@@ -13,6 +13,7 @@ use Alchemy\Phrasea\Media\Subdef\Video;
|
||||
use Alchemy\Phrasea\Media\Subdef\FlexPaper;
|
||||
use Alchemy\Phrasea\Media\Subdef\Gif;
|
||||
use Alchemy\Phrasea\Media\Subdef\Unknown;
|
||||
use Alchemy\Phrasea\Media\Subdef\Pdf;
|
||||
use Alchemy\Phrasea\Media\Subdef\Subdef as SubdefSpecs;
|
||||
use Alchemy\Phrasea\Media\Type\Type as SubdefType;
|
||||
use MediaAlchemyst\Specification\SpecificationInterface;
|
||||
@@ -40,9 +41,9 @@ class databox_subdef
|
||||
protected $translator;
|
||||
protected static $mediaTypeToSubdefTypes = [
|
||||
SubdefType::TYPE_AUDIO => [SubdefSpecs::TYPE_IMAGE, SubdefSpecs::TYPE_AUDIO],
|
||||
SubdefType::TYPE_DOCUMENT => [SubdefSpecs::TYPE_IMAGE, SubdefSpecs::TYPE_FLEXPAPER],
|
||||
SubdefType::TYPE_DOCUMENT => [SubdefSpecs::TYPE_IMAGE, SubdefSpecs::TYPE_FLEXPAPER, SubdefSpecs::TYPE_PDF],
|
||||
SubdefType::TYPE_FLASH => [SubdefSpecs::TYPE_IMAGE],
|
||||
SubdefType::TYPE_IMAGE => [SubdefSpecs::TYPE_IMAGE],
|
||||
SubdefType::TYPE_IMAGE => [SubdefSpecs::TYPE_IMAGE, SubdefSpecs::TYPE_PDF],
|
||||
SubdefType::TYPE_VIDEO => [SubdefSpecs::TYPE_IMAGE, SubdefSpecs::TYPE_VIDEO, SubdefSpecs::TYPE_ANIMATION],
|
||||
SubdefType::TYPE_UNKNOWN => [SubdefSpecs::TYPE_IMAGE],
|
||||
];
|
||||
@@ -100,6 +101,9 @@ class databox_subdef
|
||||
case SubdefSpecs::TYPE_FLEXPAPER:
|
||||
$this->subdef_type = $this->buildFlexPaperSubdef($sd);
|
||||
break;
|
||||
case SubdefSpecs::TYPE_PDF:
|
||||
$this->subdef_type = $this->buildPdfSubdef($sd);
|
||||
break;
|
||||
case SubdefSpecs::TYPE_UNKNOWN:
|
||||
$this->subdef_type = $this->buildImageSubdef($sd);
|
||||
break;
|
||||
@@ -216,6 +220,16 @@ class databox_subdef
|
||||
{
|
||||
return new FlexPaper($this->translator);
|
||||
}
|
||||
/**
|
||||
* Build Pdf Subdef object depending the SimpleXMLElement
|
||||
*
|
||||
* @param SimpleXMLElement $sd
|
||||
* @return Pdf
|
||||
*/
|
||||
protected function buildPdfSubdef(SimpleXMLElement $sd)
|
||||
{
|
||||
return new Pdf($this->translator);
|
||||
}
|
||||
/**
|
||||
*
|
||||
* @return string
|
||||
@@ -360,6 +374,9 @@ class databox_subdef
|
||||
case SubdefSpecs::TYPE_VIDEO:
|
||||
$mediatype_obj = new Video($this->translator);
|
||||
break;
|
||||
case SubdefSpecs::TYPE_PDF:
|
||||
$mediatype_obj = new Pdf($this->translator);
|
||||
break;
|
||||
case SubdefSpecs::TYPE_UNKNOWN:
|
||||
$mediatype_obj = new Unknown($this->translator);
|
||||
break;
|
||||
|
51
tests/Alchemy/Tests/Phrasea/Media/Subdef/PdfTest.php
Normal file
51
tests/Alchemy/Tests/Phrasea/Media/Subdef/PdfTest.php
Normal file
@@ -0,0 +1,51 @@
|
||||
<?php
|
||||
|
||||
namespace Alchemy\Tests\Phrasea\Media\Subdef;
|
||||
|
||||
use Alchemy\Phrasea\Media\Subdef\Pdf;
|
||||
use Alchemy\Phrasea\Media\Subdef\Subdef;
|
||||
use Alchemy\Tests\Tools\TranslatorMockTrait;
|
||||
|
||||
/**
|
||||
* @group functional
|
||||
* @group legacy
|
||||
*/
|
||||
class PdfTest extends \PhraseanetTestCase
|
||||
{
|
||||
use TranslatorMockTrait;
|
||||
|
||||
/**
|
||||
* @var Pdf
|
||||
*/
|
||||
protected $object;
|
||||
|
||||
public function setUp()
|
||||
{
|
||||
parent::setUp();
|
||||
$this->object = new Pdf($this->createTranslatorMock());
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers Alchemy\Phrasea\Media\Subdef\Pdf::getType
|
||||
*/
|
||||
public function testGetType()
|
||||
{
|
||||
$this->assertEquals(Subdef::TYPE_PDF, $this->object->getType());
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers Alchemy\Phrasea\Media\Subdef\Pdf::getDescription
|
||||
*/
|
||||
public function testGetDescription()
|
||||
{
|
||||
$this->assertTrue(is_string($this->object->getDescription()));
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers Alchemy\Phrasea\Media\Subdef\Pdf::getMediaAlchemystSpec
|
||||
*/
|
||||
public function testGetMediaAlchemystSpec()
|
||||
{
|
||||
$this->assertInstanceOf('Alchemy\\Phrasea\\Media\\Subdef\\Specification\\PdfSpecification', $this->object->getMediaAlchemystSpec());
|
||||
}
|
||||
}
|
@@ -0,0 +1,17 @@
|
||||
<?php
|
||||
|
||||
namespace Alchemy\Tests\Phrasea\Media\Subdef\Specification;
|
||||
|
||||
use Alchemy\Phrasea\Media\Subdef\Specification\PdfSpecification;
|
||||
|
||||
class PdfTest extends \PHPUnit_Framework_TestCase
|
||||
{
|
||||
/**
|
||||
* @covers Alchemy\Phrasea\Media\Subdef\Specification\PdfSpecification::getType
|
||||
*/
|
||||
public function testGetType()
|
||||
{
|
||||
$specs = new PdfSpecification();
|
||||
$this->assertEquals(PdfSpecification::TYPE_PDF, $specs->getType());
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user