60 lines
1.6 KiB
PHP
60 lines
1.6 KiB
PHP
<?php
|
|
|
|
namespace App\BusProNet\XmlParser;
|
|
|
|
use App\BusProNet\Model\File;
|
|
use PhpZip\Exception\ZipException;
|
|
use PhpZip\ZipFile;
|
|
use Symfony\Component\DomCrawler\Crawler;
|
|
|
|
class DocumentsParser
|
|
{
|
|
public function parseConfirmation(Crawler $result): ?File
|
|
{
|
|
$pdfData = $this->decode($result->filterXPath('//bestaetigungpdf'));
|
|
|
|
return new File('bestaetigung.pdf', $pdfData, 'application/pdf');
|
|
}
|
|
|
|
public function parseDocuments(Crawler $result): ?File
|
|
{
|
|
$documents = $result->filterXPath('//reisedokumente/reisedokument');
|
|
|
|
if (1 === $documents->count()) {
|
|
$node = $documents->first();
|
|
[$filename, $pdfData] = $this->getFileInfo($node);
|
|
|
|
return new File($filename.'.pdf', $pdfData, 'application/pdf');
|
|
}
|
|
|
|
// In case of multiple documents create ZIP file
|
|
try {
|
|
$zip = new ZipFile();
|
|
|
|
$documents->each(function (Crawler $node) use (&$zip) {
|
|
[$filename, $pdfData] = $this->getFileInfo($node);
|
|
$zip->addFromString($filename.'.pdf', $pdfData);
|
|
});
|
|
|
|
return new File('reisedokumente.zip', $zip->outputAsString(), 'application/zip');
|
|
} catch (ZipException $e) {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
private function decode(Crawler $node): string
|
|
{
|
|
[, $pdfData] = explode(',', $node->text());
|
|
|
|
return base64_decode($pdfData);
|
|
}
|
|
|
|
private function getFileInfo(Crawler $node): array
|
|
{
|
|
$pdfData = $this->decode($node->filterXPath('//pdf'));
|
|
$filename = $node->filterXPath('//datei')->text();
|
|
|
|
return [$filename, $pdfData];
|
|
}
|
|
}
|