9

hai everybody i am using html2pdf ,it doesn't support word-break:break-all css any idea?

example

   <td style="width:30%;word-break:break-all ;">
      testtestetstetstetstetstettstetstetstetstetstetstetstetstetstetstets
    </td>

output pdf take above 30% width like string length size

output pdf: testtestetstetstetstetstettstetstetstetstetstetstetstetstetstetstets

I want Output :

testtestetstetstetstetstettstets
tetstetstetstetstetstetstetstets

Ben D
  • 14,321
  • 3
  • 45
  • 59
srini
  • 876
  • 3
  • 12
  • 23

10 Answers10

15

Well, that's complicated. Your teststring is too long, but it's not composed of multiple words. That means that word-break won't work, because there aren't any words to break on. Obviously, this might well just be an example, in which case it might be that html2pdf just doesn't support relative widths and word-break, so you could try having an absolute width and word-break.

That said, here's something I know that will work: wordwrap in PHP. So, instead of echo $yourvar; you could use echo wordwrap($yourvar, 75, "\n", true) instead, which will always cut the string, even if it's just one long string. It takes a little fiddling to get the number of characters to match up with the width that you're looking for, but it will work.

<?php
$foo = str_repeat('test',12);
echo wordwrap($foo, 20, '<br />', true);

Output:

testtesttesttesttest
testtesttesttesttest
testtest
Berry Langerak
  • 18,561
  • 4
  • 45
  • 58
  • it is all dynamic content like user input firstname lastname – srini Oct 08 '12 at 13:47
  • @srini So? You can still use wordwrap to accomplish your goal. – Berry Langerak Oct 08 '12 at 13:57
  • 1
    Actually, using `wordwrap` is the only way for HTML2PDF these days... Pity I didn't use mPDF instead... One caveat though - **the line braker has to be HTML's `
    `**: `wordwrap($string, $length, '
    ');`.
    – shadyyx Jul 18 '14 at 14:12
7

try this;

<td style="width:30%; word-wrap:break-word;">
   testtestetstetstetstetstettstetstetstetstetstetstetstetstetstetstets
</td>

not word-break it is word-wrap ;

avalkab
  • 436
  • 3
  • 18
  • impossible it.I think there isnt a table tag of your html page.you can set td instead of div . – avalkab Oct 15 '12 at 09:37
  • 1
    i know it is work only html pages not in html2pdf thats why i am asking question here – srini Oct 15 '12 at 09:58
  • 1
    html2pdf does not support this http://www.yaronet.com/en/posts.php?sl=&h=0&s=151321#0 – srini Oct 15 '12 at 11:43
  • @ErhanSönmez - what makes you think this is "impossible"? CSS support is all over the place across platforms... it is not at all unusual that file-type conversion systems trip over rare-er css rules (or even non-rare ones, like `float`). The question pertains to a constructed PDF, not an HTML page rendered in a browser. – Ben D Oct 15 '12 at 20:57
  • Nice one, that did it for me. Thx! – daneczech Jul 18 '17 at 09:55
5

If you want long strings to wrap consistently within a boundary container I think you should be able to accomplish this by inserting zero-width space characters (&#8203; or \xe2\x80\x8b) between every letter of the orignial string. This will have the effect of wrapping as if every character was its own word, but without displaying the spaces to the end user. This may cause you trouble with text searches or indexing on the final product, but it should accomplish the task reliably from an aesthetic perspective.

Thus:

testtestetstetstetstetstettstetstetstetstetstetstetstetstetstetstets

Becomes

t&#8203;e&#8203;s&#8203;t&#8203;t&#8203;e&#8203;s&#8203;t&#8203;e&#8203;t&#8203;s&#8203;t&#8203;e&#8203;t&#8203;s&#8203;t&#8203;e&#8203;t&#8203;s&#8203;t&#8203;e&#8203;t&#8203;s&#8203;t&#8203;e&#8203;t&#8203;t&#8203;s&#8203;t&#8203;e&#8203;t&#8203;s&#8203;t&#8203;e&#8203;t&#8203;s&#8203;t&#8203;e&#8203;t&#8203;s&#8203;t&#8203;e&#8203;t&#8203;s&#8203;t&#8203;e&#8203;t&#8203;s&#8203;t&#8203;e&#8203;t&#8203;s&#8203;t&#8203;e&#8203;t&#8203;s&#8203;t&#8203;e&#8203;t&#8203;s&#8203;t&#8203;e&#8203;t&#8203;s&#8203;t&#8203;e&#8203;t&#8203;s

(which displays: "t​e​s​t​t​e​s​t​e​t​s​t​e​t​s​t​e​t​s​t​e​t​s​t​e​t​t​s​t​e​t​s​t​e​t​s​t​e​t​s​t​e​t​s​t​e​t​s​t​e​t​s​t​e​t​s​t​e​t​s​t​e​t​s​t​e​t​s")

So if you wrap it it will wrap exactly to the bounds of its container. Here's a fiddle of it as an example.

Just write a PHP script to loop though the string and insert the space:

$string="testtestetstetstetstetstettstetstetstetstetstetstetstetstetstetstets";
$new_string = "";
for($i=0;$i<strlen($string);$i++){
   if ($string[$i]==' ' || $string[$i+1]==' '){ //if it is a space or the next letter is a space, there's no reason to add a break character
      continue;
   }
   $new_string .= $string[$i]."&#8203;";
}
echo $new_string

This is a particularly nice solution, because unlike wordwrap(), it automatically adjusts for non-fixed-width fonts (which is basically 99% of fonts that are actually used).

Again, if you need to resulting PDF to be searchable, this is not a good approach, but it will make it look like you want it to.

Ben D
  • 14,321
  • 3
  • 45
  • 59
  • What encoding are you using? And are the `?` only showing up in the PDF or both the PDF and the HTML file? – Ben D Oct 15 '12 at 18:03
  • See what happens if you use `\xe2\x80\x8b` instead of `​` – Ben D Oct 15 '12 at 18:10
  • I've added the UTF-8 code in the answer as well, so if you're using that encoding just change the `$new_string .= $string[$i]."​"` line to `$new_string .= $string[$i]."\xe2\x80\x8b"` – Ben D Oct 15 '12 at 18:40
  • 1
    instead of inserting a zero-width space character, you can insert an empty HTML tag e.g. ``, this way the text will continue searcheable – Pedro Sanção Nov 27 '14 at 16:44
  • I get same problem as Srini, force Arial not working too : Same for \xe2\x80\x8b not working – Reign.85 Sep 06 '16 at 11:10
4

In your testing the word break will not work because the word break only works between the words in a particular sentence. So yo can use the multiple word sentence and then try with the word breaker

Kalaiyarasan
  • 12,134
  • 8
  • 31
  • 49
4

You just use substr function in your code. I put a example for this. First put your output in variable.

$get_value = "testtestetstetstetstetstettstetstetstet";
$first = substr("$get_value",0,3);
$second = substr("$get_value",4,7);

and so on.

Prem
  • 697
  • 3
  • 10
3

You can use "\r\n" to print newline character. make sure to use it with double quote. If your string is in the variable then you need to use word count function and append this string. You can also use PHP_EOL to avoid platform dependency.

Gautam Arya
  • 723
  • 14
  • 40
2

html2pdf does not support this word-break:break-all css

Ref: http://www.yaronet.com/en/posts.php?sl=&h=0&s=151321#0

srini
  • 876
  • 3
  • 12
  • 23
0

You may use this method.

<?php
$get_value = "testtestetstetstetstetstettstetstetstet";
$first = substr("$get_value",0,3);
$second = substr("$get_value",4,7);
$third = substr("$get_value",8,11);
?>
Amit Kumar
  • 195
  • 2
  • 4
  • 8
0

I want to add little bit of own experience with HTML2PDF and tables.

I used this solution to generate the PDF containing a table filled with delivery confirmation (list of products). Such list may contain up to thousand of products (rows).

I encountered a problem with formatting and long strings in cells. First problem was that the table was getting too wide even if I set the table's width to 100% and the width of header (<th>) columns (HTML2PDF does not support <colgroup> so I couldn't define it globally) - some columns were out of visible area. I used wordwrap() with <br /> as separator to break down the long strings which looked like it's working. Unfortunately, it turned out that if there is such long string in first and last row the whole table is prepended and appended with empty page. Not a real bugger but doesn't look nice either. The final solution was to (applies for tables which width could outreach the visible area):

  • set the fixed widths of table and each row in pixels
    • for A4 letter size I am using total width of 550 px with default margins but you'd have to play around a little to distribute the width between columns
  • in wordwrap use empty space or &#8203; / \xe2\x80\x8b as delimiter

For small tables that you'd like to spread for 100% of visible area width it is OK to use width expressed in %.

shadyyx
  • 15,825
  • 6
  • 60
  • 95
-1

I think this function is a limping solution.

function String2PDFString($string,$Length)
    {
    $Arry=explode(" ",$string);
    foreach($Arry as $Line)
        {
        if(strlen($Line)>$Length)
            $NewString.=wordwrap ($Line,$Length," ",true);
        else
            $NewString.=" ".$Line;
        }
    return $NewString;
    }