2017-04-21 5 views
7

Y at-il un moyen d'ajuster les coordonnées xy pour tenir dans une boîte englobante dans PDF crevettes si elles sont plus grandes que la hauteur de la boîte?Crevette PDF ligne adaptée à la boîte de délimitation

J'utilise le petit bijou 'rails-pad-signature' pour capturer les signatures qui stocke ensuite les éléments suivants:

[{"lx":98,"ly":23,"mx":98,"my":22},{"lx":98,"ly":21,"mx":98,"my":23},{"lx":98,"ly":18,"mx":98,"my":21}, ... {"lx":405,"ly":68,"mx":403,"my":67},{"lx":406,"ly":69,"mx":405,"my":68}] 

J'ai le suivi pour montrer la signature dans mon pdf:

bounding_box([0, cursor], width: 540, height: 100) do 
     stroke_bounds 
     @witness_signature.each do |e| 
     stroke { line [e["lx"], 100 - e["ly"]], 
         [e["mx"], 100 - e["my"] ] } 
     end 
    end 

Mais la signature s'écoule de la page dans certains cas, n'est pas le centre et se fâche généralement.

+0

Pouvez-vous montrer un exemple (image) de votre sortie en courant et une autre avec la sortie désirée? – Gerry

Répondre

1

Votre question est assez vague, donc je devine ce que vous voulez dire.

pour redimensionner une séquence de coordonnées (x[i], y[i]), i = 1..n pour tenir dans une zone de délimitation de taille donnée (width, height) avec (0,0) origine comme dans Postscript, premier décider de conserver le rapport d'aspect de l'image originale. Ajuster à une boîte ne fera généralement pas cela. Puisque vous ne voulez probablement pas déformer la signature, dites la réponse est "oui".

Lors de la mise à l'échelle d'une image dans un format de conservation de boîte, l'axe des abscisses ou des ordonnées détermine le facteur d'échelle sauf si la boîte présente exactement l'aspect de l'image. La prochaine étape est de décider quoi faire avec "l'espace supplémentaire" sur l'axe alternatif. Par exemple. si l'image est grande et mince par rapport à la boîte englobante, l'espace supplémentaire sera sur l'axe des x; si court et gros, c'est l'axe des ordonnées. Disons que l'image est centrée dans l'espace supplémentaire; cela semble approprié pour une signature.

Alors voici à pseudocode re échelle des points pour s'adapter à la boîte:

x_min = y_min = +infty, x_max = y_max = -infty 
for i in 1 to n 
    if x[i] < x_min, x_min = x[i] 
    if x[i] > x_max, x_max = x[i] 
    if y[i] < y_min, y_min = y[i] 
    if y[i] > y_max, y_max = y[i] 
end for 
dx = x_max - x_min 
dy = y_max - y_min 
x_scale = width/dx 
y_scale = height/dy 
if x_scale < y_scale then 
    // extra space is on the y-dimension 
    scale = x_scale 
    x_org = 0 
    y_org = 0.5 * (height - dy * scale) // equal top and bottom extra space 
else 
    // extra space is on the x_dimension 
    scale = y_scale 
    x_org = 0.5 * (width - dx * scale) // equal left and right extra space 
    y_org = 0 
end 
for i in 1 to n 
    x[i] = x_org + scale * (x[i] - x_min) 
    y[i] = y_org + scale * (y[i] - y_min) 
end