Ostatnio dawno nic nie pisałem, ale niestety nie zajmowałem się niczym nadzwyczajnym, ciekawym czy ambitnym. Dzisiaj też nie będzie o niczym ambitnym (dla większości też o niczym ciekawym), ale być może niektórym ułatwi to pracę.
Niestety, jako że zajmuję się jednym podprojektem samodzielnie, to na mnie trafiła żmudna robota z generowaniem PDF’ów. A żeby nie było zbyt łatwo, to PDF”y muszą być wygenerowane na formularzu dostarczonym przez zewnętrzną instytucję w identycznym układzie. Słowem, trzeba nanieść masę różnych tekstów, ticków itp. w ściśle określone miejsca na skanie formularza. Jak to nazywa współpracownik – gra w statki
Na dodatek jakoś marnie mi szło to całe “trafianie”. Nijak “milimetry TCPDF nie pasowały mi do tego co pojawia się na ekranie, przez co “zabawa” była bardzo czasochłonna. Do czasu aż nie wpadłem na pomysł banalny w swej prostocie, ale znakomicie ułatwiający pracę.
Nałożymy sobie tymczasową siatkę na PDF z skalą
Od pomysłu do realizacji, chwila programowania i odpowiednia metoda TCPDF gotowa.
Prawda że genialne? A dzięki tej prostej siatce w jeden dzień udało mi się “trafić więcej statków” niż przez ostatnie 3
A dla chętnych troszkę kodu:
class Mao_TCPDF extends TCPDF
{
public function drawGrid ($minor = 5, $major = 10, $font = array(), $colors = array())
{
$_fontSize = $this->getFontSizePt();
$_fontFamily = $this->getFontFamily();
$_autoPageBreak = $this->AutoPageBreak;
$minorColor = array(0 , 0 , 0);
$majorColor = array(255 , 0 , 0);
if (isset($colors['minor'])) {
$minorColor = $colors['minor'];
}
if (isset($colors['major'])) {
$minorColor = $colors['major'];
}
if (is_array($font)) {
if (isset($font['family'])) {
$this->SetFont($font['family']);
}
$this->SetFontSize((isset($font['size']) ? $font['size'] : 6));
}
$this->SetAutoPageBreak(false, 0);
for ($x = 0; $x < $this->w; $x = $x + $minor) {
if ($x % $major == 0) {
$this->Line($x, 0, $x, $this->h, array('width' => 0.01 , 'color' => $majorColor));
} else {
$this->Line($x, 0, $x, $this->h, array('width' => 0.01 , 'color' => $minorColor));
}
$this->MultiCell(5, $this->getFontSizePt(), $x, 0, 'C', 0, 1, $x - 2.5, 0, true, 0, true);
$this->MultiCell(5, $this->getFontSizePt(), $x, 0, 'C', 0, 1, $x - 2.5, $this->h - ($this->getFontSizePt()/2), true, 0, true);
}
for ($y = 0; $y < $this->h; $y = $y + $minor) {
if ($y % $major == 0) {
$this->Line(0, $y, $this->w, $y, array('width' => 0.01 , 'color' => $majorColor));
} else {
$this->Line(0, $y, $this->w, $y, array('width' => 0.01 , 'color' => $minorColor));
}
$this->MultiCell(5, $this->getFontSizePt(), $y, 0, 'L', 0, 1, 0, $y - ($this->getFontSizePt()/2), true, 0, true);
$this->MultiCell(5, $this->getFontSizePt(), $y, 0, 'R', 0, 1, $this->w - 5 , $y - ($this->getFontSizePt()/2), true, 0, true);
}
$this->SetFont($_fontFamily);
$this->SetFontSize($_fontSize);
$this->SetAutoPageBreak($_autoPageBreak);
}
}
Metoda przeznaczona jest do TCPDF lub klasy dziedziczącej, ze względu na użycie kilku pól prywatnych. Mam nadzieję że komuś się przyda.