• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • PDF_setcolor()

    (PHP 4 >= 4.0.5, PECL pdflib >= 1.0.0)

    Set fill and stroke color

    说明

    PDF_setcolor (resource $p,string $fstype,string $colorspace,float $c1,float $c2,float $c3,float $c4) : bool

    Sets the current color space and color. 成功时返回 TRUE, 或者在失败时返回 FALSE

    If you encounter errors of the form function 'PDF_setcolor' must not be called in 'path' scope this generally means that you've called the PDFLib functions in the wrong order. For example, the following would be *incorrect* because PDF_rect marks the beginning of the "path scope", and set_color must not be called in path scope:
    <?php
    // THIS CODE WILL PRODUCE AN ERROR
    PDF_rect($pdf,0,0,$width,$height);
    PDF_setcolor($pdf,$red,$green,$blue);
    PDF_fill($pdf);
    <p>The correct order of function calls is as follows:
    <p>// Correct order of function calls
    PDF_setcolor($pdf,$red,$green,$blue);
    PDF_rect($pdf,0,0,$width,$height);
    PDF_fill($pdf);
    ?>
    
    Here is a quick snippet to convert CMYK to RGB. It has better precision than a lot of other solutions that also don't factor in colour profiles.
    <?php
    $cmyk = '10,20,100,31';
    list($c, $m, $y, $k) = explode(',', $cmyk);
    # Gets the rgb as floats (cast via (int) if you want int )
    $r = (1 - min(($c / 100) * (1 - $k /= 100) + 1 * $k, 1)) * 255;
    $g = (1 - min(($m / 100) * (1 - $k) + 1 * $k, 1)) * 255;
    $b = (1 - min(($y / 100) * (1 - $k) + 1 * $k, 1)) * 255;
    echo "$r $g $b\r\n";
    # Converts the rgb to hex with leading 0's
    $r = str_pad(dechex($r), 2, '0', STR_PAD_LEFT);
    $g = str_pad(dechex($g), 2, '0', STR_PAD_LEFT);
    $b = str_pad(dechex($b), 2, '0', STR_PAD_LEFT);
    echo "hex: $r$g$b\r\n";
    /* an example to see the colour via html
    echo '<div style="width: 80px; height: 80px; background-color:#', "$r$g$b", '"></div>';
    */
    ?>
    
    Damn, this took me some real long time! Maybe it's helpfull for those who even have no idea of color-Schemes like me ;)
    If u want to generate PDF's for Print Offices u need to set all the colors in CMYK.
    Here is a Function that will convert RGB to CMYK
    <?
    function hex2rgb($hex) {
     $color = str_replace('#','',$hex);
     $rgb = array('r' => hexdec(substr($color,0,2)),
            'g' => hexdec(substr($color,2,2)),
            'b' => hexdec(substr($color,4,2)));
     return $rgb;
    }
    function rgb2cmyk($var1,$g=0,$b=0) {
      if(is_array($var1)) {
       $r = $var1['r'];
       $g = $var1['g'];
       $b = $var1['b'];
      }
      else $r=$var1;
      $cyan  = 255 - $r;
      $magenta = 255 - $g;
      $yellow = 255 - $b;
      $black  = min($cyan, $magenta, $yellow);
      $cyan  = @(($cyan  - $black) / (255 - $black)) * 255;
      $magenta = @(($magenta - $black) / (255 - $black)) * 255;
      $yellow = @(($yellow - $black) / (255 - $black)) * 255;
      return array('c' => $cyan / 255,
            'm' => $magenta / 255,
            'y' => $yellow / 255,
            'k' => $black / 255);
    }
    $color=rgb2cmyk(hex2rgb('#FF0000')); 
    pdf_setcolor($pdf, "both", "cmyk", $color['c'], $color['m'], $color['y'], $color['k']);
    ?>
    U can call it with parameters (r,g,b) or just an array(r,g,b) that contains these values.
    Hope it works correct. All testing was fine.
    This seems a little less complicated:
    this is the color you want to use : 'FF11AA'
    <?php
    pdf_setcolor ($pdf, 'both', 0xFF / 255, 0x11 / 255, 0xAA / 255);
    ?>
    
    Here's a better implementation for setting HTML hexadecimal colors:
    function pdf_setcolor_hex($hexcolor, $type = '')
    {
      global $pdf;   ## match this to your pdf resource handle
        $color['r'] = hexdec(substr($hexcolor, 0, 2))/255; 
        $color['g'] = hexdec(substr($hexcolor, 2, 2))/255; 
        $color['b'] = hexdec(substr($hexcolor, 4, 2))/255;
        if ($type != 'fill' && $type != 'stroke') $type = 'both';
        pdf_setcolor($pdf, $type, 'rgb', $color['r'], $color['g'], $color['b']);
    }
    Sample usage:
    pdf_setcolor_hex('FFFFFF', 'fill');
    -Derek
    Here's a function for converting HTML hexadecimal colors to RGB decimals suitable for this function:
    $color_hex = "FF0000";    ## whatever hex color you want
    $color = convert_hexcolor_rgbdec($color_hex);
    pdf_setcolor($pdf, 'fill', 'rgb', $color['r'], $color['g'], $color['b']);
    function convert_hexcolor_rgbdec($color_hex)
    {
      $color['r'] = hexdec(substr($color_hex, 0, 2))/255; 
      $color['g'] = hexdec(substr($color_hex, 2, 2))/255; 
      $color['b'] = hexdec(substr($color_hex, 4, 2))/255;
      return $color;
    }
    -Derek
    Bonjour,
    Cette fonction est utilisable pour dfinir une couleur de police.
    Hello,
    I search for the way of setting colors for the font in pdf and I find this.
    Hope it could help.
    <?php
    /**
    *  set font color
    *  maurice.anglebert@free.fr
    */
    // path for the pdf file and string to show
    $pdfFilePath = $_SERVER[DOCUMENT_ROOT]."/the_dir_of_the_file/test.pdf";
    $string = "The new color of my font";
    $pdf = pdf_new();
    pdf_open_file($pdf, $pdfFilePath);
    pdf_set_info($pdf, "Title", "Test pdf");
    // A4 page
    pdf_begin_page($pdf, 595, 842);
    // set up of the font
    $font = pdf_findfont($pdf, "Courier", "host", FALSE); 
      if (isset($font)) { 
        pdf_setfont($pdf, $font, 10) or die ("unknown font"); 
      } 
    pdf_setColor($pdf, "fill", "rgb",0, 0, 1); 
    // this for blue color 
    // pdf_setColor($pdf, "fill", "rgb",1, 0, 0) for red
    pdf_set_value($pdf, "textrendering", 0);
    // show at the top of the page center
    pdf_show_boxed($pdf, $string, 0, 832, 595, 10, "center", "");
    // resets graphic state
    pdf_initGraphics($pdf);
    // end of page and pdf_object 
    pdf_end_page($pdf); 
    pdf_close($pdf);
    pdf_delete($pdf);
    // use header to get the file
    header("Content-type: application/pdf");
    header("Content-length: ".filesize($pdfFilePath));
    header("Content-disposition: inline; filename=test.pdf");
    readfile($pdfFilePath);  
    ?>
    
    If you want to change the font color you need to set type to "fill", not "stroke" ("both" also works, of course).