Изображение всегда вверху в конвертированном html из pdf

Я использую следующий код, и все содержимое конкретной страницы PDF конвертируется правильно. Но если в середине страницы PDF есть какое-либо изображение, это изображение в HTML отображается вверху.

PHP-код:

umask(0);
$output = shell_exec('pdftohtml create.pdf create.html');

Редактировать:

Пожалуйста, проверьте PDF-файл, который я использовал для этого: https://www.dropbox.com/s/6uy9wq27ff00n0x/create.pdf?dl=0

В этом PDF изображение находится после 2 строк.

// Загрузить преобразованную html-страницу. shell_exec добавляет 's' в html файл, create.html

$html = file_get_contents('creates.html');
print_r($html);

// выход

<!DOCTYPE html><html>
<head>
</head>
<body>
<img src="/var/www/html/pdf-sign/public/converted_path/create-1_1.png"/><br/>
Test document PDF&#160;<br/>&#160;<br/>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla est purus, ultrices in porttitor&#160;<br/>in, accumsan non quam. Nam consectetur porttitor rhoncus. Curabitur eu est et leo feugiat&#160;<br/>auctor vel quis lorem. Ut et ligula dolor, sit amet consequat lorem. Aliquam porta eros sed&#160;<br/>velit imperdiet egestas. Maecenas tempus eros ut diam ullamcorper id dictum libero&#160;<br/>tempor. Donec quis augue quis magna condimentum lobortis. Quisque imperdiet ipsum vel&#160;<br/>magna viverra rutrum. Cras viverra molestie urna, vitae vestibulum turpis varius id.&#160;<br/>&#160; &#160;PLACEHOLDER &#160; &#160; &#160;<br/>nulla ac dolor. Maecenas urna elit, tincidunt in dapibus nec, vehicula eu dui. Duis lacinia&#160;<br/>fringilla massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur&#160;<br/>
suscipit felis eget condimentum. Cum sociis natoque penatibus et magnis dis parturient&#160;<br/>montes, nascetur ridiculus mus. Integer bibendum sagittis ligula, non faucibus nulla volutpat&#160;<br/>vitae. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. &#160;<br/>In aliquet quam et velit bibendum accumsan. Cum sociis natoque penatibus et magnis dis&#160;<br/>parturient montes, nascetur ridiculus mus. Vestibulum vitae ipsum nec arcu semper&#160;<br/>adipiscing at ac lacus. Praesent id pellentesque orci. Morbi congue viverra nisl nec rhoncus.&#160;<br/>Integer mattis, ipsum a tincidunt commodo, lacus arcu elementum elit, at mollis eros ante ac&#160;<br/>risus. In volutpat, ante at pretium ultricies, velit magna suscipit enim, aliquet blandit massa&#160;<br/>orci nec lorem. Nulla facilisi. Duis eu vehicula arcu. Nulla facilisi. Maecenas pellentesque&#160;<br/>volutpat felis, quis tristique ligula luctus vel. Sed nec mi eros. Integer augue enim, sollicitudin&#160;<br/>ullamcorper mattis eget, aliquam in est. Morbi sollicitudin libero nec augue dignissim ut&#160;<br/>consectetur dui volutpat. Nulla facilisi. Mauris egestas vestibulum neque cursus tincidunt.&#160;<br/>Donec sit amet pulvinar orci. &#160;<br/>Quisque volutpat pharetra tincidunt. Fusce sapien arcu, molestie eget varius egestas,&#160;<br/>faucibus ac urna. Sed at nisi in velit egestas aliquam ut a felis. Aenean malesuada iaculis nisl,&#160;<br/>ut tempor lacus egestas consequat. Nam nibh lectus, gravida sed egestas ut, feugiat quis&#160;<br/>dolor. Donec eu leo enim, non laoreet ante. Morbi dictum tempor vulputate. Phasellus&#160;<br/>ultricies risus vel augue sagittis euismod. Vivamus tincidunt placerat nisi in aliquam. Cras&#160;<br/>quis mi ac nunc pretium aliquam. Aenean elementum erat ac metus commodo rhoncus.&#160;<br/>
<hr/>
</body>
</html>

Теперь см.

<img src="/var/www/html/pdf-sign/public/converted_path/create-1_1.png"/>

находится сразу после тега BODY. Это означает, что изображение ушло наверх вместо третьей строки.


person naf4me    schedule 26.01.2016    source источник
comment
Хотя вы включили строку php-кода для вызова pdftohtml, на самом деле это не вопрос программирования, потому что вы в основном спрашиваете об использовании pdftohtml, поэтому здесь это не по теме. Задайте его на serverfault.com.   -  person Gavriel    schedule 26.01.2016
comment
@Nadimul De Cj также обсуждает эти же проблемы в stackoverflow.com/questions/35008183/. Но похоже нет решения.   -  person naf4me    schedule 27.01.2016
comment
@gavriel: я обновил свой вопрос. Я думаю, что это не по теме.   -  person naf4me    schedule 27.01.2016
comment
ИМХО, это все еще не по теме, как и другой, который вы нашли, точно такой же, как этот. Вы не должны открывать повторяющиеся вопросы.   -  person Gavriel    schedule 27.01.2016
comment
@Gavriel: Это все еще не по теме? В любом случае, я хочу решения. К вашему сведению, пожалуйста, проверьте время публикации.   -  person naf4me    schedule 27.01.2016
comment
ИМХО да, тот факт, что вы вызываете его из php с помощью shell_exec, не делает его связанным с программированием, если только у вас нет проблем с shell_exec. Ваша проблема связана исключительно с pdftohtml, и если есть решение, то оно связано с аргументами командной строки pdftohtml. Другими словами: работает ли это из командной строки? Если да, то это вопрос программирования, если нет, то нет.   -  person Gavriel    schedule 27.01.2016
comment
@gavriel Да, это работает из командной строки.   -  person naf4me    schedule 28.01.2016
comment
Можете ли вы запустить $output = shell_exec('pdftohtml create.pdf create-php.html'); из php, а pdftohtml create.pdf create-cmd.html ; diff create-cmd.html create-php.html из командной строки и показать нам разницу?   -  person Gavriel    schedule 28.01.2016
comment
@gavriel Образец PDF-файла: dropbox.com/s/6uy9wq27ff00n0x/create.pdf ?dl=0. HTML-код команды: dropbox.com/s/q7c42nb56s7knam/create- cmds.html?dl=0. HTML-код PHP: dropbox.com/s/lihx7enxurk8f26/create- phps.html?dl=0 А diff — это dropbox. com/s/5ssosjpqiq0z4fd/diff.txt?dl=0   -  person naf4me    schedule 31.01.2016
comment
другими словами, нет никакой разницы. Так в чем твоя проблема?   -  person Gavriel    schedule 31.01.2016


Ответы (2)


Я тоже столкнулся с такой проблемой. У меня есть решение. Сначала вам нужно конвертировать pdf-документ в XML

$output = shell_exec('pdftohtml -xml create.pdf create.xml');

Вывод XML выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE pdf2xml SYSTEM "pdf2xml.dtd">
<pdf2xml producer="poppler" version="0.33.0">
<page number="1" position="absolute" top="0" left="0" height="1262" width="892">
<fontspec id="0" size="16" family="Times" color="#000000"/>
<image top="117" left="51" width="424" height="96" src="converted_path/create1.jpg"/>
<text top="57" left="99" width="144" height="16" font="0">Test document PDF</text>
</page>
</pdf2xml>

Затем вы конвертируете эту строку XML в объект

$xml = simplexml_load_string($xmlContent);

После этого вам нужно измерить точное место изображения с верхним значением атрибутов xml, как показано ниже.

$pg = 0;
foreach($xml->page as $page) {
        foreach ($page as $e) {
            $all_attribute[$pg][(int)$e['top']] = $e;
        }
        $pg++;
    }

После обнаружения всех атрибутов верхнего значения отсортируйте значения на основе массива [ключ]

foreach($all_attribute as $page) {
        ksort($page);
}

Когда все атрибуты отсортированы на основе верхнего значения xml, просто обработайте html, как показано ниже.

foreach($xml->page as $page) {
  foreach($page as $p){
      if($p->getName() == 'image'){
         <img width="'.$p['width'].'" height="'.$p['height'].'" src="'.$p['src'].'" >
      }
  }
}

Я думаю, это поможет вам
Вы также можете управлять своим текстовым шрифтом
xml сохраняет весь шрифт в атрибуте fontspec и дает идентификатор

<fontspec id="0" size="16" family="Times" color="#000000"/>

и этот идентификатор вызывает значение шрифта текстового атрибута

<text top="57" left="99" width="144" height="16" font="0">

теперь с помощью этих значений вам нужно обработать шрифт, как показано ниже

$font = [];
    foreach($xml->page as $page) {
        foreach ($page as $e) {
            if($e->getName() == 'fontspec'){
                $font[(int)$e['id']]['family'] = (string)$e['family'];
                $font[(int)$e['id']]['size'] = (string)$e['size'];
                $font[(int)$e['id']]['color'] = (string)$e['color'];
            }
        }
    }

После этого нужно переработать этот шрифт в html

foreach($page as $p){
            if($p->getName() == 'text'){
                $ind = (int)$p['font'];
                $font_size = $font[$ind]['size'];
                $font_color = $font[$ind]['color'];
                $font_family = $font[$ind]['family'];
                '<span style="font-size:'.$font_size.'px;color:'.$font_color.';font-family:'.$font_family.'; font-weight: 900;">'.(string)$p.'</span>=';
          }
}
person Nadimul De Cj    schedule 09.02.2016
comment
Я тоже так думал, но не в деталях реализации. Как вы решили проблему со шрифтом? - person naf4me; 09.02.2016
comment
Да, это круто. Я был заблокирован в этом шрифте на самом деле. Большое спасибо. - person naf4me; 09.02.2016

Вместо print_r просто распечатайте содержимое файла:

<?php
echo file_get_contents('creates.html');
?>

И убедитесь, что это и только это выводится в вашем php. Если у вас есть какой-то html в начале, это испортит макет.

person Gavriel    schedule 31.01.2016