diff --git a/.idea/modules.xml b/.idea/modules.xml index f7c0b20..680bee0 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -2,7 +2,7 @@ - + \ No newline at end of file diff --git a/.idea/pdf2text-php-client.iml b/.idea/pdf2txt-php-client.iml similarity index 96% rename from .idea/pdf2text-php-client.iml rename to .idea/pdf2txt-php-client.iml index 421d364..d45d885 100644 --- a/.idea/pdf2text-php-client.iml +++ b/.idea/pdf2txt-php-client.iml @@ -2,9 +2,8 @@ - - - + + diff --git a/README.md b/README.md index 70a64e2..ffb3746 100644 --- a/README.md +++ b/README.md @@ -12,19 +12,19 @@ composer require codeinc/pdf2txt-client ## Usage -This client requires a running instance of the [pdf2text](https://github.com/codeinchq/pdf2text) service. The service can be run locally [using Docker](https://hub.docker.com/r/codeinchq/pdf2text) or deployed to a server. +This client requires a running instance of the [pdf2txt](https://github.com/codeinchq/pdf2txt) service. The service can be run locally [using Docker](https://hub.docker.com/r/codeinchq/pdf2txt) or deployed to a server. -Base example: +### Base example: ```php -use CodeInc\Pdf2TextClient\Pdf2TextClient; -use CodeInc\Pdf2TextClient\Exception; +use CodeInc\Pdf2TxtClient\Pdf2TxtClient; +use CodeInc\Pdf2TxtClient\Exception; $apiBaseUri = 'http://localhost:3000/'; $localPdfPath = '/path/to/local/file.pdf'; try { // convert - $client = new Pdf2TextClient($apiBaseUri); + $client = new Pdf2TxtClient($apiBaseUri); $stream = $client->convertLocalFile($localPdfPath); // display the text @@ -35,12 +35,11 @@ catch (Exception $e) { } ``` -With options: - +### With options: ```php -use CodeInc\Pdf2TextClient\Pdf2TextClient; -use CodeInc\Pdf2TextClient\ConvertOptions; -use CodeInc\Pdf2TextClient\Format; +use CodeInc\Pdf2TxtClient\Pdf2TxtClient; +use CodeInc\Pdf2TxtClient\ConvertOptions; +use CodeInc\Pdf2TxtClient\Format; $apiBaseUri = 'http://localhost:3000/'; $localPdfPath = '/path/to/local/file.pdf'; @@ -52,7 +51,7 @@ $convertOption = new ConvertOptions( try { // convert - $client = new Pdf2TextClient($apiBaseUri); + $client = new Pdf2TxtClient($apiBaseUri); $jsonResponse = $client->convertLocalFile($localPdfPath, $convertOption); $decodedJson = $client->processJsonResponse($jsonResponse); diff --git a/composer.json b/composer.json index 986febd..9fdfec9 100644 --- a/composer.json +++ b/composer.json @@ -1,8 +1,8 @@ { - "name": "codeinc/pdf2text-client", + "name": "codeinc/pdf2txt-client", "version": "v1.0", - "description": "A PHP client for the pdf2text service", - "homepage": "https://github.com/codeinchq/pdf2text-php-client", + "description": "A PHP client for the pdf2txt service", + "homepage": "https://github.com/codeinchq/pdf2txt-php-client", "type": "library", "license": "MIT", "require": { @@ -14,12 +14,12 @@ }, "autoload": { "psr-4": { - "CodeInc\\Pdf2TextClient\\": "src" + "CodeInc\\Pdf2TxtClient\\": "src" } }, "autoload-dev": { "psr-4": { - "CodeInc\\Pdf2TextClient\\Tests\\": "tests/" + "CodeInc\\Pdf2TxtClient\\Tests\\": "tests/" } }, "authors": [ diff --git a/composer.lock b/composer.lock index 7be2ff0..1cc4fd8 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "2d589f3cc49f5f5edaed578061ed80ff", + "content-hash": "ac7de71aed6c3c5d980100db7d16af4a", "packages": [ { "name": "nyholm/psr7", diff --git a/src/ConvertOptions.php b/src/ConvertOptions.php index 666138c..12536d3 100644 --- a/src/ConvertOptions.php +++ b/src/ConvertOptions.php @@ -9,12 +9,12 @@ declare(strict_types=1); -namespace CodeInc\Pdf2TextClient; +namespace CodeInc\Pdf2TxtClient; /** - * pdf2text convert options. + * pdf2txt convert options. * - * @see https://github.com/codeinchq/pdf2text?tab=readme-ov-file#usage + * @see https://github.com/codeinchq/pdf2txt?tab=readme-ov-file#usage */ final readonly class ConvertOptions { diff --git a/src/Exception.php b/src/Exception.php index 7ac09e1..f85ce34 100644 --- a/src/Exception.php +++ b/src/Exception.php @@ -9,7 +9,7 @@ declare(strict_types=1); -namespace CodeInc\Pdf2TextClient; +namespace CodeInc\Pdf2TxtClient; use Exception as BaseException; diff --git a/src/Format.php b/src/Format.php index d1ea474..8834704 100644 --- a/src/Format.php +++ b/src/Format.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace CodeInc\Pdf2TextClient; +namespace CodeInc\Pdf2TxtClient; enum Format { diff --git a/src/Pdf2TextClient.php b/src/Pdf2TxtClient.php similarity index 97% rename from src/Pdf2TextClient.php rename to src/Pdf2TxtClient.php index 43f910f..806bc11 100644 --- a/src/Pdf2TextClient.php +++ b/src/Pdf2TxtClient.php @@ -9,7 +9,7 @@ declare(strict_types=1); -namespace CodeInc\Pdf2TextClient; +namespace CodeInc\Pdf2TxtClient; use Http\Discovery\Psr17FactoryDiscovery; use Http\Discovery\Psr18ClientDiscovery; @@ -21,7 +21,7 @@ use Psr\Http\Message\StreamFactoryInterface; use Psr\Http\Message\StreamInterface; -class Pdf2TextClient +class Pdf2TxtClient { public function __construct( private readonly string $baseUrl, @@ -57,7 +57,7 @@ public function convert(mixed $stream, ConvertOptions $options = new ConvertOpti ) ->addResource('firstPage', (string)$options->firstPage) ->addResource('normalizeWhitespace', (string)$options->normalizeWhitespace) - ->addResource('raw', $options->format === Format::text ? 'true' : 'false'); + ->addResource('format', $options->format->name); if ($options->lastPage !== null) { $multipartStreamBuilder->addResource('lastPage', (string)$options->lastPage); diff --git a/tests/Pdf2TextClientTest.php b/tests/Pdf2TextClientTest.php deleted file mode 100644 index 025f78b..0000000 --- a/tests/Pdf2TextClientTest.php +++ /dev/null @@ -1,96 +0,0 @@ - - * - * Use of this source code is governed by an MIT-style - * license that can be found in the LICENSE file or at - * https://opensource.org/licenses/MIT. - */ - -declare(strict_types=1); - -namespace CodeInc\Pdf2TextClient\Tests; - -use CodeInc\Pdf2TextClient\ConvertOptions; -use CodeInc\Pdf2TextClient\Exception; -use CodeInc\Pdf2TextClient\Format; -use CodeInc\Pdf2TextClient\Pdf2TextClient; -use JsonException; -use PHPUnit\Framework\TestCase; -use Psr\Http\Message\StreamInterface; - -final class Pdf2TextClientTest extends TestCase -{ - private const string DEFAULT_PDF2TEXT_BASE_URL = 'http://localhost:3000'; - private const string TEST_PDF_PATH = __DIR__.'/assets/file.pdf'; - private const string TEST_PDF_RESULT_TXT = __DIR__.'/assets/file.txt'; - private const string TEST_PDF_RESULT_JSON = __DIR__.'/assets/file.json'; - - /** - * @throws Exception|JsonException - */ -// public function testConvertLocalFileToText(): void -// { -// $stream = $this->getClient()->convertLocalFile(self::TEST_PDF_PATH); -// $this->assertInstanceOf(StreamInterface::class, $stream, "The stream is not valid"); -// -// $text = (string)$stream; -// $this->assertNotEmpty($text, "The stream is empty"); -// $this->assertStringEqualsFile(self::TEST_PDF_RESULT_TXT, $text, "The text is not valid"); -// } - - /** - * @throws Exception|JsonException - */ - public function testConvertLocalFileToJson(): void - { - $client = $this->getNewClient(); - $stream = $client->convertLocalFile(self::TEST_PDF_PATH, new ConvertOptions(format: Format::json)); - $this->assertInstanceOf(StreamInterface::class, $stream, "The stream is not valid"); - - $json = $client->processJsonResponse($stream); - $this->assertIsArray($json, "The processed JSON is not valid"); - - - $expectedJson = json_decode(file_get_contents(self::TEST_PDF_RESULT_JSON), true); - ray($json); - ray($expectedJson); - - $this->assertArrayIsEqualToArrayOnlyConsideringListOfKeys( - $json, - $expectedJson, - ["meta", "pages"] - ); - } - -// /** -// * @throws Exception|JsonException -// */ -// public function testConvertLocalFileProcessedJson(): void -// { -// $client = $this->getClient(); -// $stream = $client->convertLocalFile( -// pdfPath: self::TEST_PDF_PATH, -// options: new ConvertOptions(format: Format::json) -// ); -// -// $this->assertInstanceOf(StreamInterface::class, $stream, "The stream is not valid"); -// $json = $client->processJsonResponse($stream); -// $this->assertIsArray($json, "The processed JSON is not valid"); -// $this->assertNotEmpty($json, "The processed JSON is empty"); -// $this->assertEquals( -// serialize($stream), -// serialize(json_decode(file_get_contents(self::TEST_PDF_RESULT_JSON), true)), -// "The processed JSON is not valid" -// ); -// } - - private function getNewClient(): Pdf2TextClient - { - $apiBaseUrl = self::DEFAULT_PDF2TEXT_BASE_URL; - if (defined('PDF2TEXT_BASE_URL')) { - $apiBaseUrl = constant('PDF2TEXT_BASE_URL'); - } - return new Pdf2TextClient($apiBaseUrl); - } -} \ No newline at end of file diff --git a/tests/Pdf2TxtClientTest.php b/tests/Pdf2TxtClientTest.php new file mode 100644 index 0000000..296138e --- /dev/null +++ b/tests/Pdf2TxtClientTest.php @@ -0,0 +1,84 @@ + + * + * Use of this source code is governed by an MIT-style + * license that can be found in the LICENSE file or at + * https://opensource.org/licenses/MIT. + */ + +declare(strict_types=1); + +namespace CodeInc\Pdf2TxtClient\Tests; + +use CodeInc\Pdf2TxtClient\ConvertOptions; +use CodeInc\Pdf2TxtClient\Exception; +use CodeInc\Pdf2TxtClient\Format; +use CodeInc\Pdf2TxtClient\Pdf2TxtClient; +use JsonException; +use PHPUnit\Framework\TestCase; +use Psr\Http\Message\StreamInterface; + +final class Pdf2TxtClientTest extends TestCase +{ + private const string DEFAULT_PDF2TEXT_BASE_URL = 'http://localhost:3000'; + private const string TEST_PDF_PATH = __DIR__.'/assets/file.pdf'; + private const string TEST_PDF_RESULT_TXT = __DIR__.'/assets/file.txt'; + private const string TEST_PDF_RESULT_JSON = __DIR__.'/assets/file.json'; + + /** + * @throws Exception|JsonException + */ + public function testConvertLocalFileToText(): void + { + $stream = $this->getNewClient()->convertLocalFile(self::TEST_PDF_PATH); + $this->assertInstanceOf(StreamInterface::class, $stream, "The stream is not valid"); + + $text = (string)$stream; + $this->assertNotEmpty($text, "The stream is empty"); + $this->assertStringEqualsFile(self::TEST_PDF_RESULT_TXT, $text, "The text is not valid"); + } + + /** + * @throws Exception|JsonException + */ + public function testConvertLocalFileToRawJson(): void + { + $client = $this->getNewClient(); + $stream = $client->convertLocalFile(self::TEST_PDF_PATH, new ConvertOptions(format: Format::json)); + $this->assertInstanceOf(StreamInterface::class, $stream, "The stream is not valid"); + + $rawJson = (string)$stream; + $this->assertJson($rawJson, "The JSON is not valid"); + $this->assertStringEqualsFile(self::TEST_PDF_RESULT_JSON, $rawJson, "The JSON is not valid"); + } + + /** + * @throws Exception|JsonException + */ + public function testConvertLocalFileToProcessedJson(): void + { + $client = $this->getNewClient(); + $stream = $client->convertLocalFile(self::TEST_PDF_PATH, new ConvertOptions(format: Format::json)); + $this->assertInstanceOf(StreamInterface::class, $stream, "The stream is not valid"); + + $json = $client->processJsonResponse($stream); + $this->assertIsArray($json, "The processed JSON is not valid"); + + $expectedJson = json_decode(file_get_contents(self::TEST_PDF_RESULT_JSON), true); + $this->assertArrayIsEqualToArrayOnlyConsideringListOfKeys( + $json, + $expectedJson, + ["meta", "pages"] + ); + } + + private function getNewClient(): Pdf2TxtClient + { + $apiBaseUrl = self::DEFAULT_PDF2TEXT_BASE_URL; + if (defined('PDF2TEXT_BASE_URL')) { + $apiBaseUrl = constant('PDF2TEXT_BASE_URL'); + } + return new Pdf2TxtClient($apiBaseUrl); + } +} \ No newline at end of file diff --git a/tests/assets/file.json b/tests/assets/file.json index 8bcd695..7415ec2 100644 --- a/tests/assets/file.json +++ b/tests/assets/file.json @@ -1 +1 @@ -{"meta":{"info":{"PDFFormatVersion":"1.4","Language":null,"EncryptFilterName":null,"IsLinearized":false,"IsAcroFormPresent":false,"IsXFAPresent":false,"IsCollectionPresent":false,"IsSignaturesPresent":false,"Title":"Document de test","Producer":"Skia/PDF m123 Google Docs Renderer"},"metadata":null},"pages":[{"pageInfo":{"num":1,"scale":1,"rotation":0,"offsetX":0,"offsetY":0,"width":596,"height":842},"links":[],"content":[{"x":42.519684,"y":102.2099988,"str":"Document de test","dir":"ltr","width":203.71340028283205,"height":26.000001,"fontName":"g_d0_f1"},{"x":42.519684,"y":126.80999997749996,"str":"","dir":"ltr","width":0,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":126.80999997749996,"str":"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut tristique purus ut tortor fringilla faucibus. Ut in","dir":"ltr","width":505.25314535403817,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":141.80999997749996,"str":"","dir":"ltr","width":0,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":141.80999997749996,"str":"ullamcorper orci. Cras lectus tellus, auctor vitae condimentum sed, eleifend eget velit. Vestibulum vel nisi","dir":"ltr","width":508.9320943005421,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":156.80999997749996,"str":"","dir":"ltr","width":0,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":156.80999997749996,"str":"ut odio lacinia iaculis. Mauris eleifend ante sapien, tempus dignissim quam lacinia ut. Vivamus faucibus","dir":"ltr","width":501.4310885249997,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":171.80999997749996,"str":"","dir":"ltr","width":0,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":171.80999997749996,"str":"quam nulla, et efficitur lacus bibendum et. Maecenas ullamcorper non neque ut auctor. Sed in viverra","dir":"ltr","width":490.4550074040382,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":186.80999997749996,"str":"","dir":"ltr","width":0,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":186.80999997749996,"str":"velit. Etiam consequat egestas dictum. Nam elementum dapibus nibh, id varius lorem accumsan eget.","dir":"ltr","width":494.8921117244579,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":201.80999997749996,"str":"","dir":"ltr","width":0,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":201.80999997749996,"str":"Curabitur placerat lectus non bibendum interdum.","dir":"ltr","width":240.74073949945807,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":231.80999997749996,"str":"","dir":"ltr","width":0,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":231.80999997749996,"str":"Donec velit nibh, sagittis ac ornare faucibus, placerat quis est. Duis in orci egestas, accumsan quam","dir":"ltr","width":486.9582761682517,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":246.80999997749996,"str":"","dir":"ltr","width":0,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":246.80999997749996,"str":"vitae, tincidunt risus. Donec sit amet convallis nibh. Curabitur accumsan ultrices laoreet. Nunc arcu","dir":"ltr","width":480.20942232903747,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":261.80999997749996,"str":"","dir":"ltr","width":0,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":261.80999997749996,"str":"tellus, finibus eu blandit vel, bibendum eget risus. Duis hendrerit, mauris a lobortis laoreet, risus massa","dir":"ltr","width":499.1666548290377,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":276.80999997749996,"str":"","dir":"ltr","width":0,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":276.80999997749996,"str":"maximus mi, id euismod lorem nibh ut lacus. Aenean sit amet ornare justo. Nam ultrices semper neque","dir":"ltr","width":500.368914279038,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":291.80999997749996,"str":"","dir":"ltr","width":0,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":291.80999997749996,"str":"at sodales. Sed rhoncus, metus convallis fermentum gravida, justo tellus sodales magna, nec auctor","dir":"ltr","width":486.9650990682517,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":306.80999997749996,"str":"","dir":"ltr","width":0,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":306.80999997749996,"str":"justo risus vitae diam. Integer nunc elit, sodales eu semper id, tincidunt tincidunt nulla.","dir":"ltr","width":417.9306988994575,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":336.8099999775,"str":"","dir":"ltr","width":0,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":336.8099999775,"str":"Fusce in egestas ligula, eu lobortis nibh. In hac habitasse platea dictumst. Aliquam feugiat aliquam","dir":"ltr","width":479.05225346825165,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":351.8099999775,"str":"","dir":"ltr","width":0,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":351.8099999775,"str":"neque sed vestibulum. Morbi blandit sem leo, sit amet ullamcorper orci aliquet sed. Ut in euismod quam.","dir":"ltr","width":506.4962055494577,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":366.8099999775,"str":"","dir":"ltr","width":0,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":366.8099999775,"str":"Etiam ut malesuada justo. Pellentesque habitant morbi tristique senectus et netus et malesuada fames","dir":"ltr","width":498.59731919999956,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":381.8099999775,"str":"","dir":"ltr","width":0,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":381.8099999775,"str":"ac turpis egestas. Phasellus placerat sed diam interdum efficitur. Nullam pulvinar quam eget est","dir":"ltr","width":464.75964949945796,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":396.8099999775,"str":"","dir":"ltr","width":0,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":396.8099999775,"str":"condimentum rutrum nec ac arcu. Sed ac enim feugiat, accumsan lacus eget, ornare libero. Sed tristique","dir":"ltr","width":508.34471067903837,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":411.8099999775,"str":"","dir":"ltr","width":0,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":411.8099999775,"str":"dui nec purus egestas blandit. Proin luctus sollicitudin leo, nec efficitur mauris sodales ut. Aliquam","dir":"ltr","width":475.16083826825206,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":426.8099999775,"str":"","dir":"ltr","width":0,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":426.8099999775,"str":"interdum imperdiet nisl vel iaculis. Aliquam erat volutpat. Mauris tempor mauris vitae elit viverra, vitae","dir":"ltr","width":491.7866542290381,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":441.8099999775,"str":"","dir":"ltr","width":0,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":441.8099999775,"str":"pulvinar nulla venenatis. Aenean nisi mi, aliquet et rhoncus sed, suscipit sed dolor.","dir":"ltr","width":400.22900134945814,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":471.8099999775,"str":"","dir":"ltr","width":0,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":471.8099999775,"str":"Suspendisse vitae elementum ex. Nam ac ligula tempus, vehicula neque sed, posuere mi. Aenean","dir":"ltr","width":478.4382574290379,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":486.8099999775,"str":"","dir":"ltr","width":0,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":486.8099999775,"str":"porttitor ornare orci, at porttitor orci pretium eu. In eu interdum sapien. Etiam in augue in nulla ornare","dir":"ltr","width":488.1852196290379,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":501.8099999775,"str":"","dir":"ltr","width":0,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":501.8099999775,"str":"porttitor sed nec dolor. Etiam tempus ultricies libero, ultrices tincidunt purus malesuada ut. Donec","dir":"ltr","width":471.6745733999999,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":516.8099999775,"str":"","dir":"ltr","width":0,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":516.8099999775,"str":"hendrerit elementum odio vitae cursus. Maecenas consectetur gravida consectetur. Integer iaculis justo","dir":"ltr","width":501.6351667290378,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":531.8099999775,"str":"","dir":"ltr","width":0,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":531.8099999775,"str":"quis purus lobortis, id blandit enim mollis. Integer vel vulputate ligula, a posuere eros. Ut commodo nec","dir":"ltr","width":499.7941943249996,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":546.8099999775,"str":"","dir":"ltr","width":0,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":546.8099999775,"str":"neque in malesuada. Praesent vel nulla mattis, faucibus nulla non, laoreet diam.","dir":"ltr","width":389.2372466744579,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":576.8099999775,"str":"","dir":"ltr","width":0,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":576.8099999775,"str":"Proin eget ipsum nec lacus vestibulum ullamcorper nec in nunc. Phasellus condimentum sit amet augue","dir":"ltr","width":505.2960992790381,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":591.8099999775,"str":"","dir":"ltr","width":0,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":591.8099999775,"str":"eu bibendum. Maecenas consectetur sit amet augue nec tempus. Vestibulum egestas feugiat volutpat.","dir":"ltr","width":497.392865074458,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":606.8099999775,"str":"","dir":"ltr","width":0,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":606.8099999775,"str":"Suspendisse vestibulum tristique nunc, non pharetra nunc tempor id. Nullam mollis pellentesque","dir":"ltr","width":468.036423804038,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":621.8099999775,"str":"","dir":"ltr","width":0,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":621.8099999775,"str":"pellentesque. Fusce scelerisque bibendum tristique. Vestibulum ante ipsum primis in faucibus orci luctus","dir":"ltr","width":507.1201118250001,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":636.8099999775,"str":"","dir":"ltr","width":0,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":636.8099999775,"str":"et ultrices posuere cubilia curae; Aenean gravida non tortor sed aliquet. Praesent pretium mattis sem,","dir":"ltr","width":493.0779850994579,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":651.8099999775,"str":"","dir":"ltr","width":0,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":651.8099999775,"str":"vitae ornare lectus hendrerit vel. Sed pharetra semper venenatis. Cras dapibus tempor enim eget","dir":"ltr","width":472.30663744945775,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":666.8099999775,"str":"","dir":"ltr","width":0,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":666.8099999775,"str":"condimentum. Nam semper sem vestibulum, hendrerit ipsum sit amet, fermentum tortor. Aenean ac enim","dir":"ltr","width":510.12840229325195,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":681.8099999775,"str":"","dir":"ltr","width":0,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":681.8099999775,"str":"ac lacus pharetra tincidunt eget sed massa.","dir":"ltr","width":212.02579219945784,"height":11.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":799.6799998275,"str":"","dir":"ltr","width":0,"height":8.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":799.6799998275,"str":"Code Inc. / SAS au capital de 10 000 € / RCS LYON 832757306 / SIRET 83275730600010 / TVA FR70832757306","dir":"ltr","width":404.91596273403843,"height":8.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":810.9299998275,"str":"","dir":"ltr","width":0,"height":8.00000025,"fontName":"g_d0_f1"},{"x":42.519684,"y":810.9299998275,"str":"18 avenue Félix Faure 69007 Lyon, France / contact@codeinc.co / www.codeinc.co","dir":"ltr","width":295.2579776340383,"height":8.00000025,"fontName":"g_d0_f1"},{"x":507.4369214999999,"y":822.1799998275,"str":"","dir":"ltr","width":0,"height":8.00000025,"fontName":"g_d0_f1"},{"x":507.4369214999999,"y":822.1799998275,"str":"Page 1 sur 1","dir":"ltr","width":45.32334885903785,"height":8.00000025,"fontName":"g_d0_f1"}]}],"filename":"temp/27788aa345b8ff512a59dd5037bdc7d0"} \ No newline at end of file +{"meta":{"info":{"PDFFormatVersion":"1.4","Language":null,"EncryptFilterName":null,"IsLinearized":false,"IsAcroFormPresent":false,"IsXFAPresent":false,"IsCollectionPresent":false,"IsSignaturesPresent":false,"Title":"Document de test","Producer":"Skia/PDF m123 Google Docs Renderer"},"metadata":null},"pages":[{"pageInfo":{"num":1,"scale":1,"rotation":0,"offsetX":0,"offsetY":0,"width":596,"height":842},"links":[],"content":[{"x":42.519684,"y":102.2099988,"str":"Document de test","dir":"ltr","width":203.71340028283205,"height":26.000001},{"x":42.519684,"y":126.80999997749996,"str":"","dir":"ltr","width":0,"height":11.00000025},{"x":42.519684,"y":126.80999997749996,"str":"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut tristique purus ut tortor fringilla faucibus. Ut in","dir":"ltr","width":505.25314535403817,"height":11.00000025},{"x":42.519684,"y":141.80999997749996,"str":"","dir":"ltr","width":0,"height":11.00000025},{"x":42.519684,"y":141.80999997749996,"str":"ullamcorper orci. Cras lectus tellus, auctor vitae condimentum sed, eleifend eget velit. Vestibulum vel nisi","dir":"ltr","width":508.9320943005421,"height":11.00000025},{"x":42.519684,"y":156.80999997749996,"str":"","dir":"ltr","width":0,"height":11.00000025},{"x":42.519684,"y":156.80999997749996,"str":"ut odio lacinia iaculis. Mauris eleifend ante sapien, tempus dignissim quam lacinia ut. Vivamus faucibus","dir":"ltr","width":501.4310885249997,"height":11.00000025},{"x":42.519684,"y":171.80999997749996,"str":"","dir":"ltr","width":0,"height":11.00000025},{"x":42.519684,"y":171.80999997749996,"str":"quam nulla, et efficitur lacus bibendum et. Maecenas ullamcorper non neque ut auctor. Sed in viverra","dir":"ltr","width":490.4550074040382,"height":11.00000025},{"x":42.519684,"y":186.80999997749996,"str":"","dir":"ltr","width":0,"height":11.00000025},{"x":42.519684,"y":186.80999997749996,"str":"velit. Etiam consequat egestas dictum. Nam elementum dapibus nibh, id varius lorem accumsan eget.","dir":"ltr","width":494.8921117244579,"height":11.00000025},{"x":42.519684,"y":201.80999997749996,"str":"","dir":"ltr","width":0,"height":11.00000025},{"x":42.519684,"y":201.80999997749996,"str":"Curabitur placerat lectus non bibendum interdum.","dir":"ltr","width":240.74073949945807,"height":11.00000025},{"x":42.519684,"y":231.80999997749996,"str":"","dir":"ltr","width":0,"height":11.00000025},{"x":42.519684,"y":231.80999997749996,"str":"Donec velit nibh, sagittis ac ornare faucibus, placerat quis est. Duis in orci egestas, accumsan quam","dir":"ltr","width":486.9582761682517,"height":11.00000025},{"x":42.519684,"y":246.80999997749996,"str":"","dir":"ltr","width":0,"height":11.00000025},{"x":42.519684,"y":246.80999997749996,"str":"vitae, tincidunt risus. Donec sit amet convallis nibh. Curabitur accumsan ultrices laoreet. Nunc arcu","dir":"ltr","width":480.20942232903747,"height":11.00000025},{"x":42.519684,"y":261.80999997749996,"str":"","dir":"ltr","width":0,"height":11.00000025},{"x":42.519684,"y":261.80999997749996,"str":"tellus, finibus eu blandit vel, bibendum eget risus. Duis hendrerit, mauris a lobortis laoreet, risus massa","dir":"ltr","width":499.1666548290377,"height":11.00000025},{"x":42.519684,"y":276.80999997749996,"str":"","dir":"ltr","width":0,"height":11.00000025},{"x":42.519684,"y":276.80999997749996,"str":"maximus mi, id euismod lorem nibh ut lacus. Aenean sit amet ornare justo. Nam ultrices semper neque","dir":"ltr","width":500.368914279038,"height":11.00000025},{"x":42.519684,"y":291.80999997749996,"str":"","dir":"ltr","width":0,"height":11.00000025},{"x":42.519684,"y":291.80999997749996,"str":"at sodales. Sed rhoncus, metus convallis fermentum gravida, justo tellus sodales magna, nec auctor","dir":"ltr","width":486.9650990682517,"height":11.00000025},{"x":42.519684,"y":306.80999997749996,"str":"","dir":"ltr","width":0,"height":11.00000025},{"x":42.519684,"y":306.80999997749996,"str":"justo risus vitae diam. Integer nunc elit, sodales eu semper id, tincidunt tincidunt nulla.","dir":"ltr","width":417.9306988994575,"height":11.00000025},{"x":42.519684,"y":336.8099999775,"str":"","dir":"ltr","width":0,"height":11.00000025},{"x":42.519684,"y":336.8099999775,"str":"Fusce in egestas ligula, eu lobortis nibh. In hac habitasse platea dictumst. Aliquam feugiat aliquam","dir":"ltr","width":479.05225346825165,"height":11.00000025},{"x":42.519684,"y":351.8099999775,"str":"","dir":"ltr","width":0,"height":11.00000025},{"x":42.519684,"y":351.8099999775,"str":"neque sed vestibulum. Morbi blandit sem leo, sit amet ullamcorper orci aliquet sed. Ut in euismod quam.","dir":"ltr","width":506.4962055494577,"height":11.00000025},{"x":42.519684,"y":366.8099999775,"str":"","dir":"ltr","width":0,"height":11.00000025},{"x":42.519684,"y":366.8099999775,"str":"Etiam ut malesuada justo. Pellentesque habitant morbi tristique senectus et netus et malesuada fames","dir":"ltr","width":498.59731919999956,"height":11.00000025},{"x":42.519684,"y":381.8099999775,"str":"","dir":"ltr","width":0,"height":11.00000025},{"x":42.519684,"y":381.8099999775,"str":"ac turpis egestas. Phasellus placerat sed diam interdum efficitur. Nullam pulvinar quam eget est","dir":"ltr","width":464.75964949945796,"height":11.00000025},{"x":42.519684,"y":396.8099999775,"str":"","dir":"ltr","width":0,"height":11.00000025},{"x":42.519684,"y":396.8099999775,"str":"condimentum rutrum nec ac arcu. Sed ac enim feugiat, accumsan lacus eget, ornare libero. Sed tristique","dir":"ltr","width":508.34471067903837,"height":11.00000025},{"x":42.519684,"y":411.8099999775,"str":"","dir":"ltr","width":0,"height":11.00000025},{"x":42.519684,"y":411.8099999775,"str":"dui nec purus egestas blandit. Proin luctus sollicitudin leo, nec efficitur mauris sodales ut. Aliquam","dir":"ltr","width":475.16083826825206,"height":11.00000025},{"x":42.519684,"y":426.8099999775,"str":"","dir":"ltr","width":0,"height":11.00000025},{"x":42.519684,"y":426.8099999775,"str":"interdum imperdiet nisl vel iaculis. Aliquam erat volutpat. Mauris tempor mauris vitae elit viverra, vitae","dir":"ltr","width":491.7866542290381,"height":11.00000025},{"x":42.519684,"y":441.8099999775,"str":"","dir":"ltr","width":0,"height":11.00000025},{"x":42.519684,"y":441.8099999775,"str":"pulvinar nulla venenatis. Aenean nisi mi, aliquet et rhoncus sed, suscipit sed dolor.","dir":"ltr","width":400.22900134945814,"height":11.00000025},{"x":42.519684,"y":471.8099999775,"str":"","dir":"ltr","width":0,"height":11.00000025},{"x":42.519684,"y":471.8099999775,"str":"Suspendisse vitae elementum ex. Nam ac ligula tempus, vehicula neque sed, posuere mi. Aenean","dir":"ltr","width":478.4382574290379,"height":11.00000025},{"x":42.519684,"y":486.8099999775,"str":"","dir":"ltr","width":0,"height":11.00000025},{"x":42.519684,"y":486.8099999775,"str":"porttitor ornare orci, at porttitor orci pretium eu. In eu interdum sapien. Etiam in augue in nulla ornare","dir":"ltr","width":488.1852196290379,"height":11.00000025},{"x":42.519684,"y":501.8099999775,"str":"","dir":"ltr","width":0,"height":11.00000025},{"x":42.519684,"y":501.8099999775,"str":"porttitor sed nec dolor. Etiam tempus ultricies libero, ultrices tincidunt purus malesuada ut. Donec","dir":"ltr","width":471.6745733999999,"height":11.00000025},{"x":42.519684,"y":516.8099999775,"str":"","dir":"ltr","width":0,"height":11.00000025},{"x":42.519684,"y":516.8099999775,"str":"hendrerit elementum odio vitae cursus. Maecenas consectetur gravida consectetur. Integer iaculis justo","dir":"ltr","width":501.6351667290378,"height":11.00000025},{"x":42.519684,"y":531.8099999775,"str":"","dir":"ltr","width":0,"height":11.00000025},{"x":42.519684,"y":531.8099999775,"str":"quis purus lobortis, id blandit enim mollis. Integer vel vulputate ligula, a posuere eros. Ut commodo nec","dir":"ltr","width":499.7941943249996,"height":11.00000025},{"x":42.519684,"y":546.8099999775,"str":"","dir":"ltr","width":0,"height":11.00000025},{"x":42.519684,"y":546.8099999775,"str":"neque in malesuada. Praesent vel nulla mattis, faucibus nulla non, laoreet diam.","dir":"ltr","width":389.2372466744579,"height":11.00000025},{"x":42.519684,"y":576.8099999775,"str":"","dir":"ltr","width":0,"height":11.00000025},{"x":42.519684,"y":576.8099999775,"str":"Proin eget ipsum nec lacus vestibulum ullamcorper nec in nunc. Phasellus condimentum sit amet augue","dir":"ltr","width":505.2960992790381,"height":11.00000025},{"x":42.519684,"y":591.8099999775,"str":"","dir":"ltr","width":0,"height":11.00000025},{"x":42.519684,"y":591.8099999775,"str":"eu bibendum. Maecenas consectetur sit amet augue nec tempus. Vestibulum egestas feugiat volutpat.","dir":"ltr","width":497.392865074458,"height":11.00000025},{"x":42.519684,"y":606.8099999775,"str":"","dir":"ltr","width":0,"height":11.00000025},{"x":42.519684,"y":606.8099999775,"str":"Suspendisse vestibulum tristique nunc, non pharetra nunc tempor id. Nullam mollis pellentesque","dir":"ltr","width":468.036423804038,"height":11.00000025},{"x":42.519684,"y":621.8099999775,"str":"","dir":"ltr","width":0,"height":11.00000025},{"x":42.519684,"y":621.8099999775,"str":"pellentesque. Fusce scelerisque bibendum tristique. Vestibulum ante ipsum primis in faucibus orci luctus","dir":"ltr","width":507.1201118250001,"height":11.00000025},{"x":42.519684,"y":636.8099999775,"str":"","dir":"ltr","width":0,"height":11.00000025},{"x":42.519684,"y":636.8099999775,"str":"et ultrices posuere cubilia curae; Aenean gravida non tortor sed aliquet. Praesent pretium mattis sem,","dir":"ltr","width":493.0779850994579,"height":11.00000025},{"x":42.519684,"y":651.8099999775,"str":"","dir":"ltr","width":0,"height":11.00000025},{"x":42.519684,"y":651.8099999775,"str":"vitae ornare lectus hendrerit vel. Sed pharetra semper venenatis. Cras dapibus tempor enim eget","dir":"ltr","width":472.30663744945775,"height":11.00000025},{"x":42.519684,"y":666.8099999775,"str":"","dir":"ltr","width":0,"height":11.00000025},{"x":42.519684,"y":666.8099999775,"str":"condimentum. Nam semper sem vestibulum, hendrerit ipsum sit amet, fermentum tortor. Aenean ac enim","dir":"ltr","width":510.12840229325195,"height":11.00000025},{"x":42.519684,"y":681.8099999775,"str":"","dir":"ltr","width":0,"height":11.00000025},{"x":42.519684,"y":681.8099999775,"str":"ac lacus pharetra tincidunt eget sed massa.","dir":"ltr","width":212.02579219945784,"height":11.00000025},{"x":42.519684,"y":799.6799998275,"str":"","dir":"ltr","width":0,"height":8.00000025},{"x":42.519684,"y":799.6799998275,"str":"Code Inc. / SAS au capital de 10 000 € / RCS LYON 832757306 / SIRET 83275730600010 / TVA FR70832757306","dir":"ltr","width":404.91596273403843,"height":8.00000025},{"x":42.519684,"y":810.9299998275,"str":"","dir":"ltr","width":0,"height":8.00000025},{"x":42.519684,"y":810.9299998275,"str":"18 avenue Félix Faure 69007 Lyon, France / contact@codeinc.co / www.codeinc.co","dir":"ltr","width":295.2579776340383,"height":8.00000025},{"x":507.4369214999999,"y":822.1799998275,"str":"","dir":"ltr","width":0,"height":8.00000025},{"x":507.4369214999999,"y":822.1799998275,"str":"Page 1 sur 1","dir":"ltr","width":45.32334885903785,"height":8.00000025}]}]} \ No newline at end of file diff --git a/tests/assets/file.txt b/tests/assets/file.txt index 6804518..56611bd 100644 --- a/tests/assets/file.txt +++ b/tests/assets/file.txt @@ -1 +1,38 @@ -Document de testLorem ipsum dolor sit amet, consectetur adipiscing elit. Ut tristique purus ut tortor fringilla faucibus. Ut inullamcorper orci. Cras lectus tellus, auctor vitae condimentum sed, eleifend eget velit. Vestibulum vel nisiut odio lacinia iaculis. Mauris eleifend ante sapien, tempus dignissim quam lacinia ut. Vivamus faucibusquam nulla, et efficitur lacus bibendum et. Maecenas ullamcorper non neque ut auctor. Sed in viverravelit. Etiam consequat egestas dictum. Nam elementum dapibus nibh, id varius lorem accumsan eget.Curabitur placerat lectus non bibendum interdum.Donec velit nibh, sagittis ac ornare faucibus, placerat quis est. Duis in orci egestas, accumsan quamvitae, tincidunt risus. Donec sit amet convallis nibh. Curabitur accumsan ultrices laoreet. Nunc arcutellus, finibus eu blandit vel, bibendum eget risus. Duis hendrerit, mauris a lobortis laoreet, risus massamaximus mi, id euismod lorem nibh ut lacus. Aenean sit amet ornare justo. Nam ultrices semper nequeat sodales. Sed rhoncus, metus convallis fermentum gravida, justo tellus sodales magna, nec auctorjusto risus vitae diam. Integer nunc elit, sodales eu semper id, tincidunt tincidunt nulla.Fusce in egestas ligula, eu lobortis nibh. In hac habitasse platea dictumst. Aliquam feugiat aliquamneque sed vestibulum. Morbi blandit sem leo, sit amet ullamcorper orci aliquet sed. Ut in euismod quam.Etiam ut malesuada justo. Pellentesque habitant morbi tristique senectus et netus et malesuada famesac turpis egestas. Phasellus placerat sed diam interdum efficitur. Nullam pulvinar quam eget estcondimentum rutrum nec ac arcu. Sed ac enim feugiat, accumsan lacus eget, ornare libero. Sed tristiquedui nec purus egestas blandit. Proin luctus sollicitudin leo, nec efficitur mauris sodales ut. Aliquaminterdum imperdiet nisl vel iaculis. Aliquam erat volutpat. Mauris tempor mauris vitae elit viverra, vitaepulvinar nulla venenatis. Aenean nisi mi, aliquet et rhoncus sed, suscipit sed dolor.Suspendisse vitae elementum ex. Nam ac ligula tempus, vehicula neque sed, posuere mi. Aeneanporttitor ornare orci, at porttitor orci pretium eu. In eu interdum sapien. Etiam in augue in nulla ornareporttitor sed nec dolor. Etiam tempus ultricies libero, ultrices tincidunt purus malesuada ut. Donechendrerit elementum odio vitae cursus. Maecenas consectetur gravida consectetur. Integer iaculis justoquis purus lobortis, id blandit enim mollis. Integer vel vulputate ligula, a posuere eros. Ut commodo necneque in malesuada. Praesent vel nulla mattis, faucibus nulla non, laoreet diam.Proin eget ipsum nec lacus vestibulum ullamcorper nec in nunc. Phasellus condimentum sit amet augueeu bibendum. Maecenas consectetur sit amet augue nec tempus. Vestibulum egestas feugiat volutpat.Suspendisse vestibulum tristique nunc, non pharetra nunc tempor id. Nullam mollis pellentesquepellentesque. Fusce scelerisque bibendum tristique. Vestibulum ante ipsum primis in faucibus orci luctuset ultrices posuere cubilia curae; Aenean gravida non tortor sed aliquet. Praesent pretium mattis sem,vitae ornare lectus hendrerit vel. Sed pharetra semper venenatis. Cras dapibus tempor enim egetcondimentum. Nam semper sem vestibulum, hendrerit ipsum sit amet, fermentum tortor. Aenean ac enimac lacus pharetra tincidunt eget sed massa.Code Inc. / SAS au capital de 10 000 € / RCS LYON 832757306 / SIRET 83275730600010 / TVA FR7083275730618 avenue Félix Faure 69007 Lyon, France / contact@codeinc.co / www.codeinc.coPage 1 sur 1 \ No newline at end of file +Document de test +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut tristique purus ut tortor fringilla faucibus. Ut in +ullamcorper orci. Cras lectus tellus, auctor vitae condimentum sed, eleifend eget velit. Vestibulum vel nisi +ut odio lacinia iaculis. Mauris eleifend ante sapien, tempus dignissim quam lacinia ut. Vivamus faucibus +quam nulla, et efficitur lacus bibendum et. Maecenas ullamcorper non neque ut auctor. Sed in viverra +velit. Etiam consequat egestas dictum. Nam elementum dapibus nibh, id varius lorem accumsan eget. +Curabitur placerat lectus non bibendum interdum. +Donec velit nibh, sagittis ac ornare faucibus, placerat quis est. Duis in orci egestas, accumsan quam +vitae, tincidunt risus. Donec sit amet convallis nibh. Curabitur accumsan ultrices laoreet. Nunc arcu +tellus, finibus eu blandit vel, bibendum eget risus. Duis hendrerit, mauris a lobortis laoreet, risus massa +maximus mi, id euismod lorem nibh ut lacus. Aenean sit amet ornare justo. Nam ultrices semper neque +at sodales. Sed rhoncus, metus convallis fermentum gravida, justo tellus sodales magna, nec auctor +justo risus vitae diam. Integer nunc elit, sodales eu semper id, tincidunt tincidunt nulla. +Fusce in egestas ligula, eu lobortis nibh. In hac habitasse platea dictumst. Aliquam feugiat aliquam +neque sed vestibulum. Morbi blandit sem leo, sit amet ullamcorper orci aliquet sed. Ut in euismod quam. +Etiam ut malesuada justo. Pellentesque habitant morbi tristique senectus et netus et malesuada fames +ac turpis egestas. Phasellus placerat sed diam interdum efficitur. Nullam pulvinar quam eget est +condimentum rutrum nec ac arcu. Sed ac enim feugiat, accumsan lacus eget, ornare libero. Sed tristique +dui nec purus egestas blandit. Proin luctus sollicitudin leo, nec efficitur mauris sodales ut. Aliquam +interdum imperdiet nisl vel iaculis. Aliquam erat volutpat. Mauris tempor mauris vitae elit viverra, vitae +pulvinar nulla venenatis. Aenean nisi mi, aliquet et rhoncus sed, suscipit sed dolor. +Suspendisse vitae elementum ex. Nam ac ligula tempus, vehicula neque sed, posuere mi. Aenean +porttitor ornare orci, at porttitor orci pretium eu. In eu interdum sapien. Etiam in augue in nulla ornare +porttitor sed nec dolor. Etiam tempus ultricies libero, ultrices tincidunt purus malesuada ut. Donec +hendrerit elementum odio vitae cursus. Maecenas consectetur gravida consectetur. Integer iaculis justo +quis purus lobortis, id blandit enim mollis. Integer vel vulputate ligula, a posuere eros. Ut commodo nec +neque in malesuada. Praesent vel nulla mattis, faucibus nulla non, laoreet diam. +Proin eget ipsum nec lacus vestibulum ullamcorper nec in nunc. Phasellus condimentum sit amet augue +eu bibendum. Maecenas consectetur sit amet augue nec tempus. Vestibulum egestas feugiat volutpat. +Suspendisse vestibulum tristique nunc, non pharetra nunc tempor id. Nullam mollis pellentesque +pellentesque. Fusce scelerisque bibendum tristique. Vestibulum ante ipsum primis in faucibus orci luctus +et ultrices posuere cubilia curae; Aenean gravida non tortor sed aliquet. Praesent pretium mattis sem, +vitae ornare lectus hendrerit vel. Sed pharetra semper venenatis. Cras dapibus tempor enim eget +condimentum. Nam semper sem vestibulum, hendrerit ipsum sit amet, fermentum tortor. Aenean ac enim +ac lacus pharetra tincidunt eget sed massa. +Code Inc. / SAS au capital de 10 000 € / RCS LYON 832757306 / SIRET 83275730600010 / TVA FR70832757306 +18 avenue Félix Faure 69007 Lyon, France / contact@codeinc.co / www.codeinc.co +Page 1 sur 1 \ No newline at end of file