2017-09-21 2 views
0

J'essaye de créer un PNG à partir d'un SVG en utilisant Inkscape. J'utilise Linux. la commande,Comment lire les binaires de pipe en PHP

cat in.svg | inkscape -z /dev/stdin -w 800 -h 475 -e /dev/stderr 2> out.png 

fonctionne très bien, mais je préfère ne pas écrire les fichiers de sortie sur le serveur.

Mon code est

<?php 
$svg_data = file_get_contents('in.svg'); 

$descriptorspec = array(
    0 => array("pipe", "r"), // stdin 
    1 => array("pipe", "w"), // stdout 
    2 => array("pipe", "w") // stderr 
); 

$pipes = array(); 

$process = proc_open("inkscape -z /dev/stdin -w 800 -h 475 -e /dev/stderr", $descriptorspec, $pipes); 
if (is_resource($process)) { 
    fwrite($pipes[0], $svg_data); 
    fclose($pipes[0]); 
    $fil_data = stream_get_contents($pipes[2]); 
    fclose($pipes[1]); 
    fclose($pipes[2]); 
    proc_close($process); 
    file_put_contents("out.png", $fil_data); 
} 

?> 

Si je change la ligne,

$process = proc_open("inkscape -z /dev/stdin -w 800 -h 475 -e /dev/stderr", $descriptorspec, $pipes); 

à

$process = proc_open("inkscape -z /dev/stdin -w 800 -h 475 -e out.png", $descriptorspec, $pipes); 

Le correct "out.png" est imprimé.

Le code actuel écrit un fichier, mais le fichier est endommagé. Il semble qu'il soit corrompu du début à la fin, mais il s'agit de la bonne taille.

Je veux les données (out.png) dans $ fil_data, mais je ne veux pas le lire à partir du lecteur de disque.

Pourquoi est-ce que out.png est corrompu et comment puis-je effectuer la conversion correcte sans recourir à l'écriture du disque.

Répondre

0

Inkscape envoyait des messages à stderr avant d'écrire le fichier. La même chose s'est produite sur stdout. Le problème a été résolu en ignorant les messages. Ainsi, la ligne,

$fil_data = stream_get_contents($pipes[2]); 

a été changé,

$fil_data = stream_get_contents($pipes[2], -1, 150); 

S'il y a une meilleure façon, je voudrais le voir.