Html2PDF HTML code issue - php

Well I have been at this for hours now. I'm using HTML2PDF to generate an invoice. My program creates a temporary invoice without issue. The issue I'm having is once the program tries to create a PDF from the temp file I'm getting an error:
ERROR n°5
File : /home/x/public_html/office/cron/invoices/php-pdf/_class/parsingHtml.class.php
Line : 218
HTML code invalid, all tags must be closed.
Status :
Array
(
[0] => page
[1] => table
[2] => tr
[3] => td
[4] => table
[5] => tr
[6] => td
)
I understand its saying all the HTML tags have not been closed. I've validated my code many different times, many different ways and sites and all are returning valid. I had some style issues that have been fixed but I still have no luck. My html is as follows:
<!doctype html>
<html>
<head>
<title>Untitled Document</title>
<style>
<!--
body {font-family:Gotham, "Helvetica Neue", Helvetica, Arial, sans-serif;}
.center {text-align:center;}
.ltgray {color:#C5C5C5;}
.invoice {vertical-align:text-top;}
.gbk td {background-color:#EDEBEB; border:none; font-size:13px; padding-bottom:8px; padding-top:8px; padding-left:10px}
.btboader { border-bottom:thin dotted; border-color:#E4E2E2; padding-bottom:8px; padding-top:8px; padding-left:10px }
.ltgrayt {color:#969696;}
.center {align-content:center; font-size:12px; font-weight:bold;}
.db {border:thin dotted; background-color:#EDEBEB;}
.padded {padding-left:15px;}
.hr { border: 0; height: 1px; background-image: -webkit-linear-gradient(left, rgba(0,0,0,0), rgba(0,0,0,0.75), rgba(0,0,0,0)); background-image: -moz-linear-gradient(left, rgba(0,0,0,0), rgba(0,0,0,0.75), rgba(0,0,0,0)); background-image: -ms-linear-gradient(left, rgba(0,0,0,0), rgba(0,0,0,0.75), rgba(0,0,0,0)); background-image: -o-linear-gradient(left, rgba(0,0,0,0), rgba(0,0,0,0.75), rgba(0,0,0,0)); }
-->
</style>
</head>
<body>
<table style="width: 100%">
<tr>
<td class="invoice"><h2 class="ltgray">Invoice</h2> </td>
<td style="float: right">
<table>
<tr>
<td>Date:</td> <td> 03/12/2015</td>
</tr>
<tr>
<td>Invoice #:</td> <td> 100367</td>
</tr>
<tr>
<td> Propery </td> <td> N/a </td>
</tr>
</table>
</td>
</tr>
</table>
<p></p>
<table style="width: 95%; margin: 0 auto;">
<tr>
<td style="width: 50%"><span class="ltgray">Company Information</span><br />
<strong>XXX</strong><br />XXXX<br />XXXX</td>
<td style="width: 50%"><span class="ltgray">Customer Information</span><br />
<strong>XXXX</strong><br />XXXX<br />
XXXX<br />XXXX<br />Phone: XXXX<br />Email: XXXX</td>
</tr>
</table>
<br /><p></p>
<table style="width: 100%" class="tbl">
<tr class="gbk">
<td style="width: 60%"><strong>Item</strong></td>
<td style="width: 15%"><strong>Price</strong></td>
<td style="width: 10%"><strong>Qty</strong></td>
<td style="width: 15%; margin: 0 auto;"> <strong>Total</strong> </td>
</tr>
<tr>
<td style="width: 60%" class="btboader">Mulch - Red</td>
<td style="width: 15%" class="btboader">$2.50</td>
<td style="width: 10%" class="btboader">153</td>
<td style="width: 15%; margin: 0 auto;" class="btboader">$382.50</td>
</tr>
<tr>
<td style="width: 60%" class="btboader">Mulch - Black</td>
<td style="width: 15%" class="btboader">$3.50</td>
<td style="width: 10%" class="btboader">1</td>
<td style="width: 15%; margin: 0 auto;" class="btboader">$3.50</td>
</tr>
<tr>
<td style="width: 60%" class="btboader">Mulch - Brown<br><small>Bagged mulch, price includes delivery - Total 2 1/2 pallets</small> </td>
<td style="width: 15%" class="btboader">$3.50</td>
<td style="width: 10%" class="btboader">160</td>
<td style="width: 15%; margin: 0 auto;" class="btboader">$560.00</td>
</tr>
<tr>
<td colspan="2">
<table style="width: 100%">
<tr>
<td style="width: 20%">Payment Terms:</td>
<td style="width: 80%">Due On Receipt</td>
</tr>
<tr>
<td style="width: 50%">Discount(%):</td>
<td style="width: 50%">10.0</td>
</tr>
<tr>
<td style="width: 50%">Past Due Amount:</td>
<td style="width: 50%">$0.00</td>
</tr>
</table>
</td>
<td colspan="2">
<table style="width: 100%">
<tr>
<td style="width: 50%" class="ltgrayt">Subtotal:</td>
<td style="width: 50%; float: right;">$946.00</td>
</tr>
<tr>
<td style="width: 50%" class="ltgrayt">Tax (6.5%):</td>
<td style="width: 50%; float: right;"> $0.00</td>
</tr>
<tr>
<td style="width: 50%" class="ltgrayt">Discount:</td>
<td style="width: 50%; float: right;"> $94.60</td>
</tr>
<tr>
<td style="width: 50%" class="ltgrayt">Past Due:</td>
<td style="width: 50%; float: right;"><strong> $0.00 </strong></td>
</tr>
<tr>
<td style="width: 50%" class="ltgrayt">Total:</td>
<td style="width: 50%; float: right;"><strong> $851.40 </strong></td>
</tr>
</table>
</td>
</tr>
</table>
<br /><br />
<table class="db" style="width: 80%; margin: 0 auto;">
<tr>
<td><strong class="padded"><small>Order Notes:</small></strong><br /><p class="padded">Thank you for your business!</p>
</td>
</tr>
</table>
<hr class="hr">
<p class="center">XXXX, XXXX, XXXX - Phone: XXXX - Direct Cell: XXXX Email:XXXX<br />
Please make checks payable to: XXXX</p>
</body>
</html>
What am I missing that's causing this error? The only other thing I could think of is that HTML2PDF doesn't support something in my styling. I use HTML2PDF for another project without issue so Im not sure where I made a wrong turn.

Related

How do I vertically align text & image in a table cell

So my problem can be seen in this picture:
How do I make every cell have the text at the same height? The last <th> (text+img) drags it down for some reason.
My css:
.table {
width: 100%;
padding: 0;
margin: 15px 0 0;
border-collapse: collapse
}
.table th {
text-align: left;
color: #fff;
background: 0 0;
text-transform: uppercase;
font-size: .9em;
line-height: 1em;
padding: .5em;
}
.table th.gold {
color: #ffdd45
}
.table td {
padding: .7em .5em .6em;
font-size: 1.1em;
line-height: 1.2em;
background: #222;
border: 2px solid rgba(0, 0, 0, 0);
vertical-align: middle;
}
<table class="table rate" style="margin-top: 0;">
<thead>
<tr>
<th>#</th>
<th>User</th>
<th>Number 1</th>
<th class="gold">Number 2</th>
<th>text+img</th>
</tr>
</thead>
<tbody id="players-table1">
<tr>
<td style="text-align: center;">1</td>
<td>
<a href="/user/9842394892389" class="username">
<img src="piclink" alt="Аvatar"><span>user0</span></a>
</td>
<td>4</td>
<td class="bold gold">500</td>
<td style="width:10%"><i>35x<img src="http://placekitten.com/301/301" style="width:55%;height:10%"/></i></td>
</tr>
<tr>
<td style="text-align: center;">2</td>
<td>
<a href="/user/9842394892389" class="username">
<img src="piclink" alt="Аvatar"><span>user</span></a>
</td>
<td>4</td>
<td class="bold gold">400</td>
<td style="width:10%"><i>35x<img src="piclink" style="width:55%;height:10%"/></i></td>
</tr>
<tr>
<td style="text-align: center;">3</td>
<td>
<a href="/user/9842394892389" class="username">
<img src="piclink" alt="Аvatar"><span>user2</span></a>
</td>
<td>3</td>
<td class="bold gold">300</td>
<td style="width:10%"><i>35x<img src="piclink" style="width:55%;height:10%"/></i></td>
</tr>
<tr>
<td style="text-align: center;">4</td>
<td>
<a href="/user/9842394892389" class="username">
<img src="piclink" alt="Аvatar"><span>user2</span></a>
</td>
<td>3</td>
<td class="bold gold">300</td>
<td style="width:10%"><i>35x<img src="piclink"/></i></td>
</tr>
</tbody>
</table>
There are 2 ways to fix this:
Decreasing the height of the image(which is what I did in answer), this was 10% before and I made it as 5%. The td content was pushing down due to that.
If you don't want to decrease the height of the image then you have to increase the height of the each row so that the height can easily fit-in.
so call is yours what to choose.
.table {
width: 100%;
padding: 0;
margin: 15px 0 0;
border-collapse: collapse
}
.table th {
text-align: left;
color: #fff;
background: 0 0;
text-transform: uppercase;
font-size: .9em;
line-height: 1em;
padding: .5em;
}
.table th.gold {
color: #ffdd45
}
.table td {
padding: .7em .5em .6em;
font-size: 1.1em;
line-height: 1.2em;
background: #222;
border: 2px solid rgba(0, 0, 0, 0);
vertical-align: middle;
border: 1px solid red;
}
<table class="table rate" style="margin-top: 0;">
<thead>
<tr>
<th>#</th>
<th>User</th>
<th>Number 1</th>
<th class="gold">Number 2</th>
<th>text+img</th>
</tr>
</thead>
<tbody id="players-table1">
<tr>
<td style="text-align: center;">1</td>
<td>
<a href="/user/9842394892389" class="username">
<img src="piclink" alt="Аvatar"><span>user0</span></a>
</td>
<td>4</td>
<td class="bold gold">500</td>
<td style="width:10%"><i>35x<img src="http://placekitten.com/301/301" style="width:55%;height:5%"/></i></td>
</tr>
<tr>
<td style="text-align: center;">2</td>
<td>
<a href="/user/9842394892389" class="username">
<img src="piclink" alt="Аvatar"><span>user</span></a>
</td>
<td>4</td>
<td class="bold gold">400</td>
<td style="width:10%"><i>35x<img src="http://placekitten.com/301/301" style="width:55%;height:5%"/></i></td>
</tr>
<tr>
<td style="text-align: center;">3</td>
<td>
<a href="/user/9842394892389" class="username">
<img src="piclink" alt="Аvatar"><span>user2</span></a>
</td>
<td>3</td>
<td class="bold gold">300</td>
<td style="width:10%"><i>35x<img src="http://placekitten.com/301/301" style="width:55%;height:5%"/></i></td>
</tr>
<tr>
<td style="text-align: center;">4</td>
<td>
<a href="/user/9842394892389" class="username">
<img src="piclink" alt="Аvatar"><span>user2</span></a>
</td>
<td>3</td>
<td class="bold gold">300</td>
<td style="width:10%"><i>35x<img src="http://placekitten.com/301/301" style="width:55%;height:5%"/></i></td>
</tr>
</tbody>
</table>

Dompdf table border issue when HTML code converted to pdf file

I am using the DOMPdf library to convert HTML code to PDF. I have designed the table in HTML when I run the file in the browser which renders fine but when I actually generate the PDF file one cell has right side border missing and one cell which should not display the border has borders.
Expected result
Actual Result I Got.
Here is my code
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>PaySlip</title>
<style>
.custom-font {
font-weight: bold;
}
table.blueTable {
border: 1px solid #000000;
background-color: #ffffff;
width: 100%;
text-align: left;
border-collapse: collapse;
}
table.blueTable td,
table.blueTable th {
border: 1px solid #020202;
padding: 3px 2px;
}
table.blueTable tbody td {
font-size: 13px;
}
table.blueTable tr:nth-child(even) {
background: #ffffff;
}
table.blueTable thead {
background: #1c6ea4;
background: -moz-linear-gradient(top,
#5592bb 0%,
#327cad 66%,
#1c6ea4 100%);
background: -webkit-linear-gradient(top,
#5592bb 0%,
#327cad 66%,
#1c6ea4 100%);
background: linear-gradient(to bottom,
#5592bb 0%,
#327cad 66%,
#1c6ea4 100%);
border-bottom: 2px solid #444444;
}
table.blueTable thead th {
font-size: 15px;
font-weight: bold;
color: #ffffff;
border-left: 2px solid #d0e4f5;
}
table.blueTable tfoot td {
font-size: 14px;
}
table.blueTable tfoot .links {
text-align: right;
}
</style>
</head>
<body>
<table class="blueTable">
<thead>
<tr>
<th colspan="4" style="text-align: center">
Payslip for the Month of XYZ - 2019
</th>
</tr>
</thead>
<tbody>
<tr>
<td class="custom-font">Name Of Employee</td>
<td>Placeholder</td>
<td class="custom-font">Payable Days</td>
<td>Placeholder</td>
</tr>
<tr>
<td class="custom-font">Employee Code</td>
<td>Placeholder</td>
<td class="custom-font">Paid Days</td>
<td>Placeholder</td>
</tr>
<tr>
<td class="custom-font">Designation</td>
<td>Placeholder</td>
<td class="custom-font">Joining Date</td>
<td>Placeholder</td>
</tr>
<tr>
<td class="custom-font">PAN No.</td>
<td>Placeholder</td>
<td class="custom-font">Date Of Birth</td>
<td>Placeholder</td>
</tr>
<tr>
<td class="custom-font">Aadhaar No.</td>
<td>Placeholder</td>
<td class="custom-font">Bank Name</td>
<td>Placeholder</td>
</tr>
<tr>
<td class="custom-font">PF No.</td>
<td>Placeholder</td>
<td class="custom-font">Bank Account No</td>
<td>Placeholder</td>
</tr>
<tr>
<td class="custom-font">UAN</td>
<td>Placeholder</td>
<td class="custom-font">Location</td>
<td>Placeholder</td>
</tr>
<!-- space -->
<tr style="border-right:">
<td style="border-right-style: hidden;"> </td>
<td style="border-right-style: hidden;"> </td>
<td style="border-right-style: hidden;"> </td>
<td> </td>
</tr>
<!-- Salary info -->
<tr style="text-align: center">
<th>Earnings</th>
<th>Amount[INR]</th>
<th>Deductions</th>
<th>Amount[INR]</th>
</tr>
<tr>
<td class="custom-font">Basic Salary</td>
<td></td>
<td class="custom-font">Provident Fund</td>
<td></td>
</tr>
<tr>
<td class="custom-font">House Rent Allowance</td>
<td class="custom-font"></td>
<td class="custom-font">Professional Tax</td>
<td></td>
</tr>
<tr>
<td class="custom-font">Conveyance Allowance</td>
<td></td>
<td class="custom-font">TDS</td>
<td></td>
</tr>
<tr>
<td class="custom-font">Medical Allowance</td>
<td></td>
<td rowspan="3"></td>
<td rowspan="3"></td>
</tr>
<tr>
<td class="custom-font">Mobile Allowance</td>
<td></td>
</tr>
<tr>
<td class="custom-font">Executive Allowance</td>
<td></td>
</tr>
<!-- space -->
<tr>
<td style="border-right-style: hidden;"> </td>
<td style="border-right-style: hidden;"> </td>
<td style="border-right-style: hidden;"> </td>
<td> </td>
</tr>
<!-- Totals -->
<tr>
<th>Total Earnings</th>
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
<tr>
<th colspan="4">Net Pay : - Rs. 00,000.00/-</th>
</tr>
<tr>
<th colspan="4">
Net Pay (In Words): - Rs. 0 Thousand 0 Hundred and 0 Only
</th>
</tr>
<!-- space -->
<tr style="border-bottom:hidden">
<td colspan="4" style="border-left-style: hidden;border-right-style: hidden;text-align: center">
"This is a computer generated statement and does not require any
signature or stamp."
</td>
</tr>
<!-- leave details -->
<tr>
<th class="custom-font" colspan="4" style="border-left-style:hidden;border-right-style:hidden">Leave Balance</th>
</tr>
<tr>
<td class="custom-font" colspan="2">Accumulated Leave (Opening Leaves)</td>
<td colspan="2">0</td>
</tr>
<tr>
<td class="custom-font" colspan="2">Leave Taken</td>
<td colspan="2">0</td>
</tr>
<tr>
<td class="custom-font" colspan="2">Leave Balance (Closing Leaves)</td>
<td colspan="2">0</td>
</tr>
</tbody>
</table>
</body>
</html>
This is a rendering issue with Dompdf versions 0.8.3 and earlier. The core of the issue is the rendering order of the table cells in combination with the technique used to render table cell borders and backgrounds when the borders are collapsed.
First, as with everything in Dompdf earlier elements are rendered before later elements in the document structure. When a cell spans rows it is rendered prior to cells in the following rows. This is important because of the stacking order of objects in the PDF (later objects are rendered above earlier ones).
Second, cell borders are rendered by a single cell within a grouping of any two adjacent cells. For horizontally adjacent cells the cell on the right renders the left border. For vertically adjacent cells the cell on the bottom renders the top border.
Third, cell backgrounds are rendered to the edge of the cell without consideration of borders.
Now take these three facts into account in consideration of a row-spanned cell that is to the right of other table cells. The left border of the row-spanned cell will be rendered. The adjacent cells in the following row will not render a border, and any background is rendered the full width of the cell. Because of this the later cell's background will render over top of the border of the row-spanned cell.
You can see this issue in the following example (when run in, for example, Dompdf 0.8.3):
<head>
<title>Row-span overlap</title>
<style>
table {
border-collapse: collapse;
}
table td {
border: 1px solid red;
background-color: #0000ff66;
}
.rowspan {
border-left-width: 10px;
}
</style>
</head>
<body>
<table>
<tbody>
<tr>
<td>1</td>
<td rowspan="2">2</td>
</tr>
<tr>
<td>3</td>
</tr>
</tbody>
</table>
</html>
The issue will be addressed in Dompdf 0.8.4. The primary change to address the bug was to render the background within the border.

Call to undefined method Dompdf\Renderer\TableCell::_border_1px solid black()

i'm using dompdf for generating pdf but it is giving some wiered error
Call to undefined method Dompdf\Renderer\TableCell::_border_1px solid
black() At TableCell.php (line 97)
i'm able to generate pdf with simple html (same php code)
below is my code
<?php
use Dompdf\Dompdf;
$html2 = '<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Todo</title>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet">
<script type="text/javascript" src="https://ajax.aspnetcdn.com/ajax/knockout/knockout-3.3.0.js"></script>
<script type="text/javascript" src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
<style>
p, strong {
font-weight: 500 !important;
}
body{
overflow-x: hidden;
}
.table-bordered>tbody>tr>td, .table-bordered>tbody>tr>th, .table-bordered>tfoot>tr>td, .table-bordered>tfoot>tr>th, .table-bordered>thead>tr>td, .table-bordered>thead>tr>th{
border-width:3px;
border-style:outset;
}
.table>thead:first-child>tr:first-child>td{
border-width:3px;
border-style:outset;
}
.table>thead:first-child>tr:first-child>th {
border-width:3px;
border-style:outset;
}
.table>thead:first-child>tr:first-child>th {
border-width:3px;
border-style:outset;
}
</style>
</head>
<body style="padding:40px 20px 20px 150px;">
<div id="divModel" style="max-width: 1000px;">
<h1 style="text-align: center;"> Proforma Invoice</h1>
<table class="table table-bordered table-responsive">
<thead>
<tr>
<td style="border-top-style:1px solid black !important;" rowspan="3" ><b>DOLPHIN SYSTEM TECHNOLOGIES</b><p>NO 6 Electronic Plaza,Shop No 322122-Dec-20173rd Floor,3rd Cross,P.R.LaneDelivery NoteMode/Terms of PaymentS.P.Road,BangaloreGSTIN/UIN: 29ABUPU2335F1Z5Suppliers Ref.Other Reference(s)E-Mail : dolphinsystech#gmail.com</p></td>
<td style="width: 800px; "><p>Invoice No.e-Sugann No.</p><br>221</td>
<td style="width: 500px; text-align: right;"><p>Dated</p><br>22-Dec-2017</td>
</tr>
<tr>
<td style="width: 500px;height: 100px;"><p>Delivery Note.</p></td>
<td style="width: 500px; text-align: right;"><p>Mode/Terms of Payment</p></td>
</tr>
<tr>
<td style="width: 500px; "><p>Suppliers Ref.</p></td>
<td style="width: 500px; text-align: right;"><p>Other Reference(s)</p></td>
</tr>
<tr>
<td rowspan="3" style="border-bottom-style:none !important"><p>Buyer</p><b>Alliance Fitness Consultancy</b><p>No 187,New No 3,T R S Lane, Nagarthpet,</p><p>Bangalore-560002</p><p>State Name: Karnataka, Code : 29</p><p>GSTIN/UIN29AHYPM5388E1ZG</p>
</td>
<td style="width: 500px;height: 100px;"><p>Buyers Order No</p></td>
<td style="width: 500px; text-align: right;"><p>Dated</p></td>
</tr>
<tr>
<td style="width: 500px; "><p>Despatch Document No</p></td>
<td style="width: 500px; text-align: right;"><p>Delivery Note Date</p></td>
</tr>
<tr>
<td style="width: 800px; "><p>Despatched through</p></td>
<td style="width: 500px; text-align: right;"><p>Destination</p></td>
</tr>
<tr>
<td style="width: 500px; text-align: right;border-top-style:none !important"><p></p></td>
<td colspan="2" style="width:500px;border-left-style:none !important;text-align:right;"><p>Terms Of Delivary</p></td>
</tr>
</thead>
</table>
<table class="table table-bordered" style="margin-top: -20px;">
<thead>
<tr>
<th style="width: 5px;">Sl NO</th>
<th>Description of Goods</th>
<th style="width: 10px;">HSN/SAC</th>
<th style="width: 10px; text-align: right;">Quantity</th>
<th style="width: 10px; text-align: right">Rate</th>
<th style="width: 10px; text-align: right;">Per</th>
<th style="width: 10px; text-align: right">Amount</th>
</tr>
<tr>
<th style="width: 5px;">1</th>
<th>Side Board<br><br><br>CGST<br>SGST</th>
<th style="width: 10px;"></th>
<th style="width: 10px; text-align: right;">1 NOS</th>
<th style="width: 10px; text-align: right">4,000.00</th>
<th style="width: 10px; text-align: right;">N0s</th>
<th style="width: 10px; text-align: right">4,000.00<br> <br> 360.00<br>360.00</th>
</tr>
<tr>
<th style="width: 5px;"></th>
<th>Total</th>
<th style="width: 10px;"></th>
<th style="width: 10px; text-align: right;">1 N0S</th>
<th style="width: 10px; text-align: right"></th>
<th style="width: 10px; text-align: right;"></th>
<th style="width: 10px; text-align: right"> 4,720.00</th>
</tr>
<tr>
<th colspan="7"><p>Amount Chargeable (in words)</p><b>INR Four Thousand Seven Hundred Twenty Only</b></th>
</tr>
<tr>
<th style=" border-bottom-style:none !important;">HSN/SAC</th>
<th style="width: 10px;border-bottom-style:none !important">Taxable Value</th>
<th colspan="2" style="width: 10px; text-align: right;">Central Tax</th>
<th colspan="2" style="width: 10px; text-align: right;">State Tax</th>
<th style="width: 10px;border-bottom-style:none !important; text-align: right">Total<br>Tax Amount</th>
</tr>
<tr>
<th style="border-top-style:none !important"></th>
<th style="width: 10px;border-top-style:none !important">Taxable Value</th>
<th style="width: 10px; text-align: right;">Central Tax</th>
<th style="width: 10px; text-align: right">Rate</th>
<th style="width: 10px; text-align: right;">State Tax</th>
<th style="width: 10px; text-align: right">Total<br>Tax Amount</th>
<th style="width: 10px;border-top-style:none !important; text-align: right"></th>
</tr>
<tr>
<th></th>
<th style="width: 10px;">4000.00</th>
<th style="width: 10px; text-align: right;"></th>
<th style="width: 10px; text-align: right">360.00</th>
<th style="width: 10px; text-align: right;"></th>
<th style="width: 10px; text-align: right">360.00</th>
<th style="width: 10px; text-align: right">720.00</th>
</tr>
<tr>
<th>Total</th>
<th style="width: 10px;">4000.00</th>
<th style="width: 10px; text-align: right;"></th>
<th style="width: 10px; text-align: right">360.00</th>
<th style="width: 10px; text-align: right;"></th>
<th style="width: 10px; text-align: right">360.00</th>
<th style="width: 10px; text-align: right">720.00</th>
</tr>
<tr>
<th colspan="7" style=" border-bottom-style:none !important;padding-bottom: 100px;"><p>Tax Amount (in words)</p><b>INR Seven Hundread And Twenty Only</b></th>
</tr>
<tr>
<th colspan="2" style="border-top-style:none !important">
<p>Declaration</p>
<p>We declare that this invoice shows <br> the actual price of thegoods described <br>and that all particulars are true and <br>correct</p></th>
<th colspan="7">
<p>for DOLPHIN SYSTEM TECHNOLOGIES</p>
<p><br>Authorised Signatory</p>
</th>
</tr>
</thead>
</table>
</div>
</body>
</html>';
$dompdf = new Dompdf();
$dompdf->loadHtml($html2);
// (Optional) Setup the paper size and orientation
$dompdf->setPaper('A4', 'landscape');
// Render the HTML as PDF
$dompdf->render();
// Output the generated PDF to Browser
//$dompdf->stream();
//$dompdf->render();
$output = $dompdf->output();
$publicPath = public_path();
$filePath = $publicPath.'/generated_pdf/downlaod.pdf';
file_put_contents($filePath, $output);
?>
The problem is here:
<td style="border-top-style:1px solid black !important;"
You're not using correct CSS syntax here and that's why Dompdf renderer gives you the error. You should do something like this to make it work:
<td style="border-top-style: solid"
https://www.w3schools.com/cssref/pr_border-top_style.asp

DOMPDF hangs when table spans pages

I updated from dompdf 0.5 to 0.6 b3 in order to get better support of some CSS I'd like to
use when generating a PDF in an application.
In the old code version, my current page generation worked fine - one table spanned multiple pages with no problem.
But in the new version, DOMPDF hangs once the code tries to generate a PDF where a table spans onto another page.
My error logs give me
PHP Fatal error: Maximum execution time of 60 seconds exceeded in
../sfDomPDFPlugin/lib/dompdf/include/frame.cls.php on line 374...
I figure it's a CSS rule, but I'm not clear on what it might be. Suggestions?
Update: Here's some example code that fails. I had to cut it down a bit,
but it includes you all of the relevant tags.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>PDF</title>
<style type="text/css">
body
{
font-family: Helvetica, Arial, sans-serif;
background-image: url('/images/draft_watermark_small.png');
}
th {
font-size: 8pt;
}
#sf_admin_container ul, #sf_admin_container ol, #sf_admin_container li, #sf_admin_container h1, #sf_admin_container h2, #sf_admin_container h3, #sf_admin_container h4, #sf_admin_container h5, #sf_admin_container h6, #sf_admin_container pre, #sf_admin_container form, #sf_admin_container body, #sf_admin_container html, #sf_admin_container p, #sf_admin_container blockquote, #sf_admin_container fieldset, #sf_admin_container input { margin: 0; padding: 0; }
#sf_admin_container a img,:link img,:visited img { border: none; }
#sf_admin_container td
{
margin: 0;
font-family: Helvetica, Arial, sans-serif;
font-size: 8px;
background-color: #fff;
padding: 2px;
}
#sf_admin_container p
{
margin-bottom: 5px;
}
#sf_admin_container h1
{
margin: 2px 0pt;
padding: 3px;
padding-left: 0px;
color: #555;
font-family: Helvetica, Arial, Verdana, sans-serif;
font-size: 22px;
}
#sf_admin_container .sf_admin_default_action
{
background-color: #fc6 !important;
font-weight: bold !important;
}
#sf_admin_container .sf_admin_list
{
width: 100%;
border: 1px solid #000;
border-bottom: 1px;
border-right: 1px;
border-collapse: collapse;
}
#sf_admin_container .sf_admin_list th
{
color: #fff;
padding: 2px;
background-color: #900;
text-align: left;
}
#sf_admin_container .sf_admin_list th a
{
color: #333;
}
#sf_admin_container .sf_admin_list td
{
padding: 2px;
border-bottom: 1px solid #000;
border-right: 1px solid #000;
}
#sf_admin_container .sf_admin_filters li
{
list-style-type: none;
}
#sf_admin_container .sf_admin_row_0 td
{
background-color: #eee;
}
#sf_admin_container .sf_admin_row_1 td
{
border-bottom: 1px solid #FFF;
background-color: #EEF;
}
#sf_admin_container .sf_admin_row_2 td
{
}
#sf_admin_container .sf_admin_row_total td
{
border: 2px solid #000;
}
#sf_admin_container #heading
{
color: #fff;
background-color: #900;
padding: 3px;
font-size: 14pt;
font-weight: bold;
text-align: center;
}
#sf_admin_container #heading-bold
{
font-weight: bold;
}
#sf_admin_container #heading-total
{
color: #fff;
padding: 2px;
background-color: #900;
text-align: left;
}
div.wysiwyg-view h1
{
font-size: 2em; margin: .67em 0;
background-color: transparent !important;
color: #000 !important;
}
div.wysiwyg-view h2
{
font-size: 1.5em; margin: .75em 0;
background-color: transparent !important;
color: #000 !important;
}
div.wysiwyg-view h3
{
font-size: 1.17em; margin: .83em 0;
background-color: transparent !important;
color: #000 !important;
}
div.wysiwyg-view ol, ul, dir,
menu, dd { margin-left: 40px !important;}
div.wysiwyg-view ol { list-style-type: decimal !important; }
div.wysiwyg-view ol ul, ul ol,
ul ul, ol ol { margin-top: 0; margin-bottom: 0; }
div.wysiwyg-view blockquote { margin-left: 40px !important; margin-right: 40px !important;}
#watermark { position: fixed; bottom: 0px; right: 0px; width: 200px; height: 200px; opacity: .5; }
</style>
</head>
<body>
<div id="sf_admin_container">
<table width="100%">
<tbody>
<tr>
<td>
<img width="500" src="https://test-quote.expedient.com/images/expedient-logo-010313.png">
</td>
<td width="40%" style="border: 1px solid #000;vertical-align: top;padding: 0px;">
<div id="heading" style="font-size: 14pt;vertical-align: top;"> Quotation # 40414 </div>
<br>
<div style="left: 2px;position: relative;">
1050 Hull Street
<br>
Baltimore, MD 21230
<br>
Phone: 410-209-6700
<br>
www.datapointinc.com
<br>
<br>
Date: 03/14/13
</div>
</td>
</tr>
<tr>
<td colspan="2">
<table class="sf_admin_list" width="100%">
<tbody>
<tr>
<td id="heading" width="100%" colspan="6">
<b>Sample Quote</b>
</td>
</tr>
<tr>
<td id="heading-bold" width="40%">
<center> QUOTED FOR </center>
</td>
<td id="heading-bold" width="12%">
<center> SALES REP </center>
</td>
<td id="heading-bold" width="12%">
<center> SALES ENGINEER </center>
</td>
<td id="heading-bold" width="12%">
<center> CONTRACT TERM </center>
</td>
<td id="heading-bold" width="12%">
<center> TERMS </center>
</td>
<td id="heading-bold" width="12%">
<center> EST. DELIVERY </center>
</td>
</tr>
<tr>
<td>
<center> CeraTech (Kim Shumaker) </center>
</td>
<td>
<center> Geoffrey Maddock </center>
</td>
<td>
<center> Brian Willis </center>
</td>
<td>
<center> 36 Months</center>
</td>
<td>
<center> Net 30</center>
</td>
<td>
<center> 3.00 weeks </center>
</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
<table class="sf_admin_list">
<tbody>
<tr>
<th style="width: 1em;">
<center>SKU</center>
</th>
<th style="width: 1em;">
<center>Type</center>
</th>
<th style="width: 1em;">
<center>Quantity</center>
</th>
<th>Name</th>
<th style="width: 4em;">
<center>Unit</center>
</th>
<th style="width: 4em;">
<center>One Time Costs</center>
</th>
<th style="width: 4em;">
<center>Monthly Recurring Cost</center>
</th>
</tr>
<tr>
<td id="topmenu" style="background-color: #ccc;text-align:center;" colspan="7">Cleveland (151)</td>
</tr>
<tr>
<td id="submenu" style="background-color: #ddd;text-align:center;" colspan="7">Managed Virtualization</td>
</tr>
<tr class="sf_admin_row_1">
<td width="25px">
<div style="text-align: center;"> 1 </div>
</td>
<td width="25px">
<div style="text-align: center;"> New </div>
</td>
<td width="25px">
<div style="text-align: center;"> 1 </div>
</td>
<td>
<div>
<b>Enterprise Virtual Instance - Level 1</b>
</div>
</td>
<td width="50px" style="text-align: right;">
<div id="lineitem_sale_unit_396047">
<b>0.00</b>
</div>
</td>
<td width="50px" style="text-align: right;">
<div id="lineitem_nrp_total_396047">
<b></b>
</div>
</td>
<td width="50px" style="text-align: right;">
<div id="lineitem_mrp_total_396047">
<b>0.00</b>
</div>
</td>
</tr>
<tr class="sf_admin_row_2">
<td width="25px"> </td>
<td width="25px"> </td>
<td width="25px"> </td>
<td>
<div id="lineitem_detail_396047" style="color:#333; text-indent: 10px;"> 1Ghz Peak, .5Ghz Average CPU; 1GB RAM</div>
</td>
<td width="50px"> </td>
<td width="50px"> </td>
<td width="50px"> </td>
</tr>
<tr class="sf_admin_row_1">
<td width="25px">
<div style="text-align: center;"> 1 </div>
</td>
<td width="25px">
<div style="text-align: center;"> New </div>
</td>
<td width="25px">
<div style="text-align: center;"> 1 </div>
</td>
<td>
<div>
<b>Enterprise Virtual Instance - Level 1</b>
</div>
</td>
<td width="50px" style="text-align: right;">
<div id="lineitem_sale_unit_396051">
<b>0.00</b>
</div>
</td>
<td width="50px" style="text-align: right;">
<div id="lineitem_nrp_total_396051">
<b></b>
</div>
</td>
<td width="50px" style="text-align: right;">
<div id="lineitem_mrp_total_396051">
<b>0.00</b>
</div>
</td>
</tr>
<tr class="sf_admin_row_2">
<td width="25px"> </td>
<td width="25px"> </td>
<td width="25px"> </td>
<td>
<div id="lineitem_detail_396051" style="color:#333; text-indent: 10px;"> 1Ghz Peak, .5Ghz Average CPU; 1GB RAM</div>
</td>
<td width="50px"> </td>
<td width="50px"> </td>
<td width="50px"> </td>
</tr>
<tr class="sf_admin_row_1">
<td width="25px">
<div style="text-align: center;"> 2 </div>
</td>
<td width="25px">
<div style="text-align: center;"> New </div>
</td>
<td width="25px">
<div style="text-align: center;"> 1 </div>
</td>
<td>
<div>
<b>Enterprise Virtual Instance Level 1 - Installation</b>
</div>
</td>
<td width="50px" style="text-align: right;">
<div id="lineitem_sale_unit_396048">
<b>0.00</b>
</div>
</td>
<td width="50px" style="text-align: right;">
<div id="lineitem_nrp_total_396048">
<b>0.00</b>
</div>
</td>
<td width="50px" style="text-align: right;">
<div id="lineitem_mrp_total_396048">
<b> </b>
</div>
</td>
</tr>
<tr class="sf_admin_row_2">
<td width="25px"> </td>
<td width="25px"> </td>
<td width="25px"> </td>
<td>
<div id="lineitem_detail_396048" style="color:#333; text-indent: 10px;"> Per Virtual Instance. Setup and Configuration of Virtual Instance(2 Hours Maximum)</div>
</td>
<td width="50px"> </td>
<td width="50px"> </td>
<td width="50px"> </td>
</tr>
<tr class="sf_admin_row_1">
<td width="25px">
<div style="text-align: center;"> 2 </div>
</td>
<td width="25px">
<div style="text-align: center;"> New </div>
</td>
<td width="25px">
<div style="text-align: center;"> 1 </div>
</td>
<td>
<div>
<b>Enterprise Virtual Instance Level 1 - Installation</b>
</div>
</td>
<td width="50px" style="text-align: right;">
<div id="lineitem_sale_unit_396049">
<b>0.00</b>
</div>
</td>
<td width="50px" style="text-align: right;">
<div id="lineitem_nrp_total_396049">
<b>0.00</b>
</div>
</td>
<td width="50px" style="text-align: right;">
<div id="lineitem_mrp_total_396049">
<b> </b>
</div>
</td>
</tr>
<tr class="sf_admin_row_2">
<td width="25px"> </td>
<td width="25px"> </td>
<td width="25px"> </td>
<td>
<div id="lineitem_detail_396049" style="color:#333; text-indent: 10px;"> Per Virtual Instance. Setup and Configuration of Virtual Instance(2 Hours Maximum)</div>
</td>
<td width="50px"> </td>
<td width="50px"> </td>
<td width="50px"> </td>
</tr>
<tr class="sf_admin_row_1">
<td width="25px">
<div style="text-align: center;"> 4 </div>
</td>
<td width="25px">
<div style="text-align: center;"> New </div>
</td>
<td width="25px">
<div style="text-align: center;"> 1 </div>
</td>
<td>
<div>
<b>Enterprise Virtual Instance Level 2 - Installation</b>
</div>
</td>
<td width="50px" style="text-align: right;">
<div id="lineitem_sale_unit_396050">
<b>0.00</b>
</div>
</td>
<td width="50px" style="text-align: right;">
<div id="lineitem_nrp_total_396050">
<b>0.00</b>
</div>
</td>
<td width="50px" style="text-align: right;">
<div id="lineitem_mrp_total_396050">
<b> </b>
</div>
</td>
</tr>
<tr class="sf_admin_row_2">
<td width="25px"> </td>
<td width="25px"> </td>
<td width="25px"> </td>
<td>
<div id="lineitem_detail_396050" style="color:#333; text-indent: 10px;"> Per Virtual Instance. Setup and Configuration of Virtual Instance(2 Hours Maximum)</div>
</td>
<td width="50px"> </td>
<td width="50px"> </td>
<td width="50px"> </td>
</tr>
<tr class="sf_admin_row_1">
<td width="25px">
<div style="text-align: center;"> 5 </div>
</td>
<td width="25px">
<div style="text-align: center;"> New </div>
</td>
<td width="25px">
<div style="text-align: center;"> 1 </div>
</td>
<td>
<div>
<b>Enterprise Virtual Instance - Level 3</b>
</div>
</td>
<td width="50px" style="text-align: right;">
<div id="lineitem_sale_unit_396052">
<b>0.00</b>
</div>
</td>
<td width="50px" style="text-align: right;">
<div id="lineitem_nrp_total_396052">
<b></b>
</div>
</td>
<td width="50px" style="text-align: right;">
<div id="lineitem_mrp_total_396052">
<b>0.00</b>
</div>
</td>
</tr>
<tr class="sf_admin_row_2">
<td width="25px"> </td>
<td width="25px"> </td>
<td width="25px"> </td>
<td>
<div id="lineitem_detail_396052" style="color:#333; text-indent: 10px;"> 3Ghz Peak, 1.5Ghz Average CPU; 3GB RAM</div>
</td>
<td width="50px"> </td>
<td width="50px"> </td>
<td width="50px"> </td>
</tr>
<tr>
<td id="topmenu" style="background-color: #ccc;text-align:center;" colspan="7">Baltimore - 1050 Hull St.</td>
</tr>
<tr>
<td id="submenu" style="background-color: #ddd;text-align:center;" colspan="7">Managed Virtualization</td>
</tr>
<tr class="sf_admin_row_1">
<td width="25px">
<div style="text-align: center;"> 7 </div>
</td>
<td width="25px">
<div style="text-align: center;"> New </div>
</td>
<td width="25px">
<div style="text-align: center;"> 1 </div>
</td>
<td>
<div>
<b>Enterprise Virtual Instance - Level 4</b>
</div>
</td>
<td width="50px" style="text-align: right;">
<div id="lineitem_sale_unit_396024">
<b>0.00</b>
</div>
</td>
<td width="50px" style="text-align: right;">
<div id="lineitem_nrp_total_396024">
<b></b>
</div>
</td>
<td width="50px" style="text-align: right;">
<div id="lineitem_mrp_total_396024">
<b>0.00</b>
</div>
</td>
</tr>
<tr class="sf_admin_row_2">
<td width="25px"> </td>
<td width="25px"> </td>
<td width="25px"> </td>
<td>
<div id="lineitem_detail_396024" style="color:#333; text-indent: 10px;"> 4Ghz Peak, 2Ghz Average CPU; 4GB RAM (File)</div>
</td>
<td width="50px"> </td>
<td width="50px"> </td>
<td width="50px"> </td>
</tr>
<tr class="sf_admin_row_1">
<td width="25px">
<div style="text-align: center;"> 8 </div>
</td>
<td width="25px">
<div style="text-align: center;"> New </div>
</td>
<td width="25px">
<div style="text-align: center;"> 1 </div>
</td>
<td>
<div>
<b>Enterprise Virtual Instance Level 4 - Installation</b>
</div>
</td>
<td width="50px" style="text-align: right;">
<div id="lineitem_sale_unit_396025">
<b>0.00</b>
</div>
</td>
<td width="50px" style="text-align: right;">
<div id="lineitem_nrp_total_396025">
<b>0.00</b>
</div>
</td>
<td width="50px" style="text-align: right;">
<div id="lineitem_mrp_total_396025">
<b> </b>
</div>
</td>
</tr>
<tr class="sf_admin_row_2">
<td width="25px"> </td>
<td width="25px"> </td>
<td width="25px"> </td>
<td>
<div id="lineitem_detail_396025" style="color:#333; text-indent: 10px;"> Per Virtual Instance. Setup and Configuration of Virtual Instance(2 Hours Maximum)</div>
</td>
<td width="50px"> </td>
<td width="50px"> </td>
<td width="50px"> </td>
</tr>
<tr class="sf_admin_row_1">
<td width="25px">
<div style="text-align: center;"> 396 </div>
</td>
<td width="25px">
<div style="text-align: center;"> New </div>
</td>
<td width="25px">
<div style="text-align: center;"> 1 </div>
</td>
<td>
<div>
<b>Enterprise Virtual Instance - Level 8</b>
</div>
</td>
<td width="50px" style="text-align: right;">
<div id="lineitem_sale_unit_396045">
<b>0.00</b>
</div>
</td>
<td width="50px" style="text-align: right;">
<div id="lineitem_nrp_total_396045">
<b></b>
</div>
</td>
<td width="50px" style="text-align: right;">
<div id="lineitem_mrp_total_396045">
<b>0.00</b>
</div>
</td>
</tr>
<tr class="sf_admin_row_2">
<td width="25px"> </td>
<td width="25px"> </td>
<td width="25px"> </td>
<td>
<div id="lineitem_detail_396045" style="color:#333; text-indent: 10px;"> 8Ghz Peak, 4Ghz Average CPU; 8GB RAM</div>
</td>
<td width="50px"> </td>
<td width="50px"> </td>
<td width="50px"> </td>
</tr>
<tr>
<td id="submenu" style="background-color: #ddd;text-align:center;" colspan="7">Shared Managed Firewall</td>
</tr>
<tr class="sf_admin_row_1">
<td width="25px">
<div style="text-align: center;"> 168 </div>
</td>
<td width="25px">
<div style="text-align: center;"> New </div>
</td>
<td width="25px">
<div style="text-align: center;"> 1 </div>
</td>
<td>
<div>
<b>Managed Firewall - Level 2</b>
</div>
</td>
<td width="50px" style="text-align: right;">
<div id="lineitem_sale_unit_396030">
<b>0.00</b>
</div>
</td>
<td width="50px" style="text-align: right;">
<div id="lineitem_nrp_total_396030">
<b></b>
</div>
</td>
<td width="50px" style="text-align: right;">
<div id="lineitem_mrp_total_396030">
<b>0.00</b>
</div>
</td>
</tr>
<tr class="sf_admin_row_2">
<td width="25px"> </td>
<td width="25px"> </td>
<td width="25px"> </td>
<td>
<div id="lineitem_detail_396030" style="color:#333; text-indent: 10px;"> 3 Mbps Sustained Bandwidth, 2 VLAN's, Up to 20 Rules</div>
</td>
<td width="50px"> </td>
<td width="50px"> </td>
<td width="50px"> </td>
</tr>
<tr class="sf_admin_row_1">
<td width="25px">
<div style="text-align: center;"> 169 </div>
</td>
<td width="25px">
<div style="text-align: center;"> New </div>
</td>
<td width="25px">
<div style="text-align: center;"> 1 </div>
</td>
<td>
<div>
<b>Managed Firewall - Level 2 - Setup and Configuration</b>
</div>
</td>
<td width="50px" style="text-align: right;">
<div id="lineitem_sale_unit_396018">
<b>0.00</b>
</div>
</td>
<td width="50px" style="text-align: right;">
<div id="lineitem_nrp_total_396018">
<b>0.00</b>
</div>
</td>
<td width="50px" style="text-align: right;">
<div id="lineitem_mrp_total_396018">
<b> </b>
</div>
</td>
</tr>
<tr class="sf_admin_row_2">
<td width="25px"> </td>
<td width="25px"> </td>
<td width="25px"> </td>
<td>
<div id="lineitem_detail_396018" style="color:#333; text-indent: 10px;"> Managed Firewall Configuration (2 hours maximum)</div>
</td>
<td width="50px"> </td>
<td width="50px"> </td>
<td width="50px"> </td>
</tr>
<tr>
<td id="submenu" style="background-color: #ddd;text-align:center;" colspan="7">Colocation and Data Center Connectivity</td>
</tr>
<tr class="sf_admin_row_1">
<td width="25px">
<div style="text-align: center;"> 221 </div>
</td>
<td width="25px">
<div style="text-align: center;"> New </div>
</td>
<td width="25px">
<div style="text-align: center;"> 3 </div>
</td>
<td>
<div>
<b>Mbps Dedicated Internet Access to Colocation - Burstable</b>
</div>
</td>
<td width="50px" style="text-align: right;">
<div id="lineitem_sale_unit_396020">
<b>0.00</b>
</div>
</td>
<td width="50px" style="text-align: right;">
<div id="lineitem_nrp_total_396020">
<b></b>
</div>
</td>
<td width="50px" style="text-align: right;">
<div id="lineitem_mrp_total_396020">
<b>0.00</b>
</div>
</td>
</tr>
<tr class="sf_admin_row_2">
<td width="25px"> </td>
<td width="25px"> </td>
<td width="25px"> </td>
<td>
<div id="lineitem_detail_396020" style="color:#333; text-indent: 10px;"> Sustained Internet Access burstable to 10Mbps ($150/Mbps)</div>
</td>
<td width="50px"> </td>
<td width="50px"> </td>
<td width="50px"> </td>
</tr>
<tr class="sf_admin_row_1">
<td colspan="4"></td>
<td width="50px">
<center>
<b>TOTAL</b>
</center>
</td>
<td id="heading-total" width="50px" style="text-align: right;">
<div id="lineitem_nrp_grand">$0.00</div>
</td>
<td id="heading-total" width="50px" style="text-align: right;">
<div id="lineitem_mrp_grand">$0.00</div>
</td>
</tr>
</tbody>
</table>
<div style="border: 1px solid #000;padding: 5px; margin-right: 3px; font-size: 8px;">
<div class="wysiwyg-view"> </div>
All product, service and pricing information is based on latest information available.
<br>
Subject to change without notice or obligation. Quote subject to, and not inclusive of, applicable shipping, handling and tax.
</div>
</div>
</body>
</html>
Thanks to Brian S. He mentioned that it worked for him with 0.6.0 beta 3, but not the latest, unreleased code. That made me double check, and it looks like I HAD swapped in the latest code to test something. Reverting back to that release version, I got this working.

XPATH not working on the HTML

I have a code that reads an HTML file from my local web server localhost and then converts it to XHTML with tidy. Then i load that XHTML into my DOM. the code looks like this
<?php
function getXHTML($html)
{
$options = array("output-html" => true,"quote-nbsp" => true, "drop-proprietary-attributes" => true,"drop-font-tags" => true,"drop-empty-paras" => true,"hide-comments" => true);
$tidy=new tidy();
$xhtml=$tidy->repairString($html,$options);
echo $xhtml;
return $xhtml;
}
$content = file_get_contents("http://localhost/filename.htm");
$page = new DOMDocument();
$xpath=new DOMXPath($page);
$content = getXHTML($content); // this is a tidy function to return XHTML
$page->loadHTML($content);
$totalPath = "//body/table[3]/tbody/tr[1]/td[4]";
$total = $xpath->query($totalPath);
echo $total->length; // this shows zero
?>
the contents of filename.htm looks like this
<!-- saved from url=(0041)http://www.rtu.ac.in/results/reformat.php -->
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="SHORTCUT ICON" href="http://www.rtu.ac.in/favicon.ico">
<link href="./Result - Rajasthan Technical University6_files/styleresults.css" rel="stylesheet" type="text/css">
<title>Result - Rajasthan Technical University</title>
</head>
<body>
<table width="773" cellpadding="5" cellspacing="0" align="center">
<tbody><tr height="60">
<td width="16%" height="60" valign="top"><font color="brown" size="+2"><img src="./Result - Rajasthan Technical University6_files/logo.jpg" width="100" height="102" border="0" align="right"> </font></td>
<td width="72%" height="60" align="center" valign="top"><p><font color="brown" size="+2"><strong>RAJASTHAN TECHNICAL UNIVERSITY </strong></font></p><font color="brown" size="+2">
<p><font size="+1"><strong>B.Tech -IVth SEMESTER -2010(Main) 16.5.2011</strong></font></p><font size="+1"> </font></font></td>
<td width="12%" height="80"><strong>www.rtu.ac.in</strong> </td>
</tr>
</tbody></table>
<br>
<br>
<table width="783" align="center" cellpadding="5" cellspacing="0" class="table">
<tbody>
<tr>
<td width="34%" align="center" valign="top" rowspan="2"><strong>Subject(s) Name </strong> </td>
<td width="10%" align="center" valign="top" colspan="1" rowspan="2"> <strong>Subject(s) Code </strong> </td>
<td align="center" valign="top" colspan="3" rowspan="1"><strong>Marks Obtained </strong> </td>
</tr>
<tr>
<td width="20%" align="center"><strong>Internal</strong> </td>
<td width="18%" align="center"><strong>Theory</strong> </td>
<td width="18%" align="center"> </td>
</tr>
<tr>
<td width="34%" align="center" style=" border-bottom: 0px none transparent;"><strong>SUBJECT-1</strong> </td>
<td width="10%" align="center" style=" border-bottom: 0px none transparent;">4551</td>
<td width="20%" align="center" style=" border-bottom: 0px none transparent;"> 16</td>
<td width="18%" align="center" style=" border-bottom: 0px none transparent;"> 50</td>
<td width="18%" align="center" style=" border-bottom: 0px none transparent;"> </td>
</tr>
<tr>
<td width="34%" align="center" style=" border-bottom: 0px none transparent;"><strong>SUBJECT-2</strong> </td>
<td width="10%" align="center" style=" border-bottom: 0px none transparent;"> 4552</td>
<td width="20%" align="center" style=" border-bottom: 0px none transparent;"> 17</td>
<td width="18%" align="center" style=" border-bottom: 0px none transparent;"> 61</td>
<td width="18%" align="center" style=" border-bottom: 0px none transparent;"> </td>
</tr>
<tr>
<td width="34%" align="center" style=" border-bottom: 0px none transparent;"><strong>SUBJECT-3</strong> </td>
<td width="10%" align="center" style=" border-bottom: 0px none transparent;">4553</td>
<td width="20%" align="center" style=" border-bottom: 0px none transparent;"> 19</td>
<td width="18%" align="center" style=" border-bottom: 0px none transparent;"> 49</td>
<td width="18%" align="center" style=" border-bottom: 0px none transparent;"> </td>
</tr>
<tr>
<td align="center" style=" border-bottom: 0px none transparent;"><strong>SUBJECT-4</strong> </td>
<td align="center" style=" border-bottom: 0px none transparent;">4554</td>
<td align="center" style=" border-bottom: 0px none transparent;"> 14</td>
<td align="center" style=" border-bottom: 0px none transparent;"> 68</td>
<td align="center" style=" border-bottom: 0px none transparent;"> </td>
</tr>
<tr>
<td align="center" style=" border-bottom: 0px none transparent;"><strong>SUBJECT-5</strong> </td>
<td align="center" style=" border-bottom: 0px none transparent;">4555</td>
<td align="center" style=" border-bottom: 0px none transparent;"> 14</td>
<td align="center" style=" border-bottom: 0px none transparent;"> 36</td>
<td align="center" style=" border-bottom: 0px none transparent;"> </td>
</tr>
<tr>
<td width="34%" align="center" style=" border-bottom: 0px none transparent;"><strong>SUBJECT-6</strong> </td>
<td width="10%" align="center" style=" border-bottom: 0px none transparent;">4556</td>
<td width="20%" align="center" style=" border-bottom: 0px none transparent;"> 19</td>
<td width="18%" align="center" style=" border-bottom: 0px none transparent;"> 48</td>
<td width="18%" align="center" style=" border-bottom: 0px none transparent;"> </td>
</tr><tr>
<td align="center" style=" border-bottom: 0px none transparent;"> </td>
<td align="center" style=" border-bottom: 0px none transparent;"> </td>
<td align="center" style=" border-bottom: 0px none transparent;"> </td>
<td align="center" style=" border-bottom: 0px none transparent;"> <strong>Internal</strong> </td>
<td width="18%" align="center" style=" border-bottom: 0px none transparent;"><strong>Practical</strong> </td>
</tr>
<tr>
<td width="34%" align="center" style=" border-bottom: 0px none transparent;"><strong>PSUBJECT-1</strong> </td>
<td width="10%" align="center" style=" border-bottom: 0px none transparent;">4174</td>
<td width="20%" align="center" style=" border-bottom: 0px none transparent;"> </td>
<td width="18%" align="center" style=" border-bottom: 0px none transparent;"> 29</td>
<td width="18%" align="center" style=" border-bottom: 0px none transparent;">48</td>
</tr>
<tr>
<td width="34%" align="center" style=" border-bottom: 0px none transparent;"><strong>PSUBJECT-2</strong> </td>
<td width="10%" align="center" style=" border-bottom: 0px none transparent;">4175</td>
<td width="20%" align="center" style=" border-bottom: 0px none transparent;"> </td>
<td width="18%" align="center" style=" border-bottom: 0px none transparent;"> 16</td>
<td width="18%" align="center" style=" border-bottom: 0px none transparent;">26</td>
</tr>
<tr>
<td width="34%" align="center" style=" border-bottom: 0px none transparent;"><strong>PSUBJECT-3</strong> </td>
<td width="10%" align="center" style=" border-bottom: 0px none transparent;">4171</td>
<td width="20%" align="center" style=" border-bottom: 0px none transparent;"> </td>
<td width="18%" align="center" style=" border-bottom: 0px none transparent;"> 15</td>
<td width="18%" align="center" style=" border-bottom: 0px none transparent;">27</td>
</tr>
<tr>
<td align="center" style=" border-bottom: 0px none transparent;"><strong>PSUBJECT-4</strong> </td>
<td align="center" style=" border-bottom: 0px none transparent;">4172</td>
<td align="center" style=" border-bottom: 0px none transparent;"> </td>
<td align="center" style=" border-bottom: 0px none transparent;"> 17</td>
<td align="center" style=" border-bottom: 0px none transparent;">29</td>
</tr>
<tr>
<td align="center" style=" border-bottom: 0px none transparent;"><strong>PSUBJECT-5</strong> </td>
<td align="center" style=" border-bottom: 0px none transparent;">4173</td>
<td align="center" style=" border-bottom: 0px none transparent;"> </td>
<td align="center" style=" border-bottom: 0px none transparent;"> 29</td>
<td align="center" style=" border-bottom: 0px none transparent;">46</td>
</tr>
<tr>
<td width="34%" align="center" style=" border-bottom: 0px none transparent;"><strong>Disipline (Deca)</strong> </td>
<td width="10%" align="center" style=" border-bottom: 0px none transparent;">4176</td>
<td width="20%" align="center" style=" border-bottom: 0px none transparent;"> </td>
<td width="18%" align="center" style=" border-bottom: 0px none transparent;"> </td>
<td width="18%" align="center" style=" border-bottom: 0px none transparent;">46</td>
</tr>
<tr><td> </td><td> </td><td> </td><td> </td><td> </td></tr></tbody>
</table>
<br><table width="783" align="center" cellpadding="5" cellspacing="0" class="table">
<tbody><tr>
<td width="18%" align="center" valign="top"><strong>Practical Marks </strong> </td>
<td width="18%" align="center" valign="top">328</td>
<td width="19%" align="center" valign="top"><strong>Theory Marks </strong> </td>
<td width="19%" align="center" valign="top">411</td>
</tr>
<tr>
<td width="18%" align="center"><strong>Institute Code </strong> </td>
<td width="18%" align="center"> 1229 </td>
<td width="19%" align="center"><strong>DECCA </strong> </td>
<td width="19%" align="center">4176</td>
</tr>
<tr>
<td width="18%" align="center"><strong>Division </strong> </td>
<td width="18%" align="center"> PASS </td>
<td width="19%" align="center"><strong>Grand Total </strong> </td>
<td width="19%" align="center">739</td>
</tr>
</tbody></table>
<!-- Reformatter by Shashank Kumar Jain (CS, IIIrd Year, 2010-11) -->
<div id="csscan-wrapper" style="display: none; "><h2 id="csscan-header">element</h2><table id="csscan-table"><tbody><tr><th colspan="2" id="csscan-header-font" class="csscan-header">Font</th></tr><tr id="csscan-row-font-family"><td id="csscan-property-font-family" class="csscan-property">font-family</td><td id="csscan-value-font-family" class="csscan-value"></td></tr><tr id="csscan-row-font-size"><td id="csscan-property-font-size" class="csscan-property">font-size</td><td id="csscan-value-font-size" class="csscan-value"></td></tr><tr id="csscan-row-font-style"><td id="csscan-property-font-style" class="csscan-property">font-style</td><td id="csscan-value-font-style" class="csscan-value"></td></tr><tr id="csscan-row-font-variant"><td id="csscan-property-font-variant" class="csscan-property">font-variant</td><td id="csscan-value-font-variant" class="csscan-value"></td></tr><tr id="csscan-row-font-weight"><td id="csscan-property-font-weight" class="csscan-property">font-weight</td><td id="csscan-value-font-weight" class="csscan-value"></td></tr><tr id="csscan-row-letter-spacing"><td id="csscan-property-letter-spacing" class="csscan-property">letter-spacing</td><td id="csscan-value-letter-spacing" class="csscan-value"></td></tr><tr id="csscan-row-line-height"><td id="csscan-property-line-height" class="csscan-property">line-height</td><td id="csscan-value-line-height" class="csscan-value"></td></tr><tr id="csscan-row-text-decoration"><td id="csscan-property-text-decoration" class="csscan-property">text-decoration</td><td id="csscan-value-text-decoration" class="csscan-value"></td></tr><tr id="csscan-row-text-align"><td id="csscan-property-text-align" class="csscan-property">text-align</td><td id="csscan-value-text-align" class="csscan-value"></td></tr><tr id="csscan-row-text-indent"><td id="csscan-property-text-indent" class="csscan-property">text-indent</td><td id="csscan-value-text-indent" class="csscan-value"></td></tr><tr id="csscan-row-text-transform"><td id="csscan-property-text-transform" class="csscan-property">text-transform</td><td id="csscan-value-text-transform" class="csscan-value"></td></tr><tr id="csscan-row-white-space"><td id="csscan-property-white-space" class="csscan-property">white-space</td><td id="csscan-value-white-space" class="csscan-value"></td></tr><tr id="csscan-row-word-spacing"><td id="csscan-property-word-spacing" class="csscan-property">word-spacing</td><td id="csscan-value-word-spacing" class="csscan-value"></td></tr><tr id="csscan-row-color"><td id="csscan-property-color" class="csscan-property">color</td><td id="csscan-value-color" class="csscan-value"></td></tr><tr><th colspan="2" id="csscan-header-background" class="csscan-header">Background</th></tr><tr id="csscan-row-background-attachment"><td id="csscan-property-background-attachment" class="csscan-property">bg-attachment</td><td id="csscan-value-background-attachment" class="csscan-value"></td></tr><tr id="csscan-row-background-color"><td id="csscan-property-background-color" class="csscan-property">bg-color</td><td id="csscan-value-background-color" class="csscan-value"></td></tr><tr id="csscan-row-background-image"><td id="csscan-property-background-image" class="csscan-property">bg-image</td><td id="csscan-value-background-image" class="csscan-value"></td></tr><tr id="csscan-row-background-position"><td id="csscan-property-background-position" class="csscan-property">bg-position</td><td id="csscan-value-background-position" class="csscan-value"></td></tr><tr id="csscan-row-background-repeat"><td id="csscan-property-background-repeat" class="csscan-property">bg-repeat</td><td id="csscan-value-background-repeat" class="csscan-value"></td></tr><tr><th colspan="2" id="csscan-header-size" class="csscan-header">Box</th></tr><tr id="csscan-row-width"><td id="csscan-property-width" class="csscan-property">width</td><td id="csscan-value-width" class="csscan-value"></td></tr><tr id="csscan-row-height"><td id="csscan-property-height" class="csscan-property">height</td><td id="csscan-value-height" class="csscan-value"></td></tr><tr id="csscan-row-border-top"><td id="csscan-property-border-top" class="csscan-property">border-top</td><td id="csscan-value-border-top" class="csscan-value"></td></tr><tr id="csscan-row-border-right"><td id="csscan-property-border-right" class="csscan-property">border-right</td><td id="csscan-value-border-right" class="csscan-value"></td></tr><tr id="csscan-row-border-bottom"><td id="csscan-property-border-bottom" class="csscan-property">border-bottom</td><td id="csscan-value-border-bottom" class="csscan-value"></td></tr><tr id="csscan-row-border-left"><td id="csscan-property-border-left" class="csscan-property">border-left</td><td id="csscan-value-border-left" class="csscan-value"></td></tr><tr id="csscan-row-margin"><td id="csscan-property-margin" class="csscan-property">margin</td><td id="csscan-value-margin" class="csscan-value"></td></tr><tr id="csscan-row-padding"><td id="csscan-property-padding" class="csscan-property">padding</td><td id="csscan-value-padding" class="csscan-value"></td></tr><tr id="csscan-row-max-height"><td id="csscan-property-max-height" class="csscan-property">max-height</td><td id="csscan-value-max-height" class="csscan-value"></td></tr><tr id="csscan-row-min-height"><td id="csscan-property-min-height" class="csscan-property">min-height</td><td id="csscan-value-min-height" class="csscan-value"></td></tr><tr id="csscan-row-max-width"><td id="csscan-property-max-width" class="csscan-property">max-width</td><td id="csscan-value-max-width" class="csscan-value"></td></tr><tr id="csscan-row-min-width"><td id="csscan-property-min-width" class="csscan-property">min-width</td><td id="csscan-value-min-width" class="csscan-value"></td></tr><tr id="csscan-row-outline-color"><td id="csscan-property-outline-color" class="csscan-property">outline-color</td><td id="csscan-value-outline-color" class="csscan-value"></td></tr><tr id="csscan-row-outline-style"><td id="csscan-property-outline-style" class="csscan-property">outline-style</td><td id="csscan-value-outline-style" class="csscan-value"></td></tr><tr id="csscan-row-outline-width"><td id="csscan-property-outline-width" class="csscan-property">outline-width</td><td id="csscan-value-outline-width" class="csscan-value"></td></tr><tr><th colspan="2" id="csscan-header-position" class="csscan-header">Positioning</th></tr><tr id="csscan-row-position"><td id="csscan-property-position" class="csscan-property">position</td><td id="csscan-value-position" class="csscan-value"></td></tr><tr id="csscan-row-top"><td id="csscan-property-top" class="csscan-property">top</td><td id="csscan-value-top" class="csscan-value"></td></tr><tr id="csscan-row-bottom"><td id="csscan-property-bottom" class="csscan-property">bottom</td><td id="csscan-value-bottom" class="csscan-value"></td></tr><tr id="csscan-row-right"><td id="csscan-property-right" class="csscan-property">right</td><td id="csscan-value-right" class="csscan-value"></td></tr><tr id="csscan-row-left"><td id="csscan-property-left" class="csscan-property">left</td><td id="csscan-value-left" class="csscan-value"></td></tr><tr id="csscan-row-float"><td id="csscan-property-float" class="csscan-property">float</td><td id="csscan-value-float" class="csscan-value"></td></tr><tr id="csscan-row-display"><td id="csscan-property-display" class="csscan-property">display</td><td id="csscan-value-display" class="csscan-value"></td></tr><tr id="csscan-row-clear"><td id="csscan-property-clear" class="csscan-property">clear</td><td id="csscan-value-clear" class="csscan-value"></td></tr><tr id="csscan-row-z-index"><td id="csscan-property-z-index" class="csscan-property">z-index</td><td id="csscan-value-z-index" class="csscan-value"></td></tr><tr><th colspan="2" id="csscan-header-list" class="csscan-header">List</th></tr><tr id="csscan-row-list-style-image"><td id="csscan-property-list-style-image" class="csscan-property">list-style-image</td><td id="csscan-value-list-style-image" class="csscan-value"></td></tr><tr id="csscan-row-list-style-type"><td id="csscan-property-list-style-type" class="csscan-property">list-style-type</td><td id="csscan-value-list-style-type" class="csscan-value"></td></tr><tr id="csscan-row-list-style-position"><td id="csscan-property-list-style-position" class="csscan-property">list-style-position</td><td id="csscan-value-list-style-position" class="csscan-value"></td></tr><tr><th colspan="2" id="csscan-header-table" class="csscan-header">Table</th></tr><tr id="csscan-row-vertical-align"><td id="csscan-property-vertical-align" class="csscan-property">vertical-align</td><td id="csscan-value-vertical-align" class="csscan-value"></td></tr><tr id="csscan-row-border-collapse"><td id="csscan-property-border-collapse" class="csscan-property">border-collapse</td><td id="csscan-value-border-collapse" class="csscan-value"></td></tr><tr id="csscan-row-border-spacing"><td id="csscan-property-border-spacing" class="csscan-property">border-spacing</td><td id="csscan-value-border-spacing" class="csscan-value"></td></tr><tr id="csscan-row-caption-side"><td id="csscan-property-caption-side" class="csscan-property">caption-side</td><td id="csscan-value-caption-side" class="csscan-value"></td></tr><tr id="csscan-row-empty-cells"><td id="csscan-property-empty-cells" class="csscan-property">empty-cells</td><td id="csscan-value-empty-cells" class="csscan-value"></td></tr><tr id="csscan-row-table-layout"><td id="csscan-property-table-layout" class="csscan-property">table-layout</td><td id="csscan-value-table-layout" class="csscan-value"></td></tr><tr><th colspan="2" id="csscan-header-effects" class="csscan-header">Effects</th></tr><tr id="csscan-row-text-shadow"><td id="csscan-property-text-shadow" class="csscan-property">text-shadow</td><td id="csscan-value-text-shadow" class="csscan-value"></td></tr><tr id="csscan-row--webkit-box-shadow"><td id="csscan-property--webkit-box-shadow" class="csscan-property">-webkit-box-shadow</td><td id="csscan-value--webkit-box-shadow" class="csscan-value"></td></tr><tr id="csscan-row-border-radius"><td id="csscan-property-border-radius" class="csscan-property">border-radius</td><td id="csscan-value-border-radius" class="csscan-value"></td></tr><tr><th colspan="2" id="csscan-header-other" class="csscan-header">Other</th></tr><tr id="csscan-row-overflow"><td id="csscan-property-overflow" class="csscan-property">overflow</td><td id="csscan-value-overflow" class="csscan-value"></td></tr><tr id="csscan-row-cursor"><td id="csscan-property-cursor" class="csscan-property">cursor</td><td id="csscan-value-cursor" class="csscan-value"></td></tr><tr id="csscan-row-visibility"><td id="csscan-property-visibility" class="csscan-property">visibility</td><td id="csscan-value-visibility" class="csscan-value"></td></tr></tbody></table></div></body></html>
the XPath above is correct as i have checked it with FirePath. can anyone tell me what i am doing wrong?
Try to use loadHTML($string) instead of loadXML. From manual:
The function parses the HTML contained in the string source. Unlike loading XML, HTML does not have to be well-formed to load.
Update 1
loadHTML creates the same DOM tree in memory as loadXML does. It only uses less strict parser. Here is example code with XPath:
<?php
$content = file_get_contents("1.html");
$page = new DOMDocument();
$page->loadHTML($content); // this will ignore most errors in formating
echo $page->saveHTML();
echo "=====\n";
$xpath = new DOMXPath($page); // use any "XML" parsing function
foreach ($xpath->query("//li[not(#id='3')]") as $elem) {
echo "[".trim($elem->textContent)."]\n";
}
Content of 1.html file is:
<li id="1">item 1
<li id="2">item 2
<li id="3">item 3
<li id="4">item 4
Output will be:
<!DOCTYPE html PUBLIC "...">
<html><body>
<li id="1">item 1
</li>
<li id="2">item 2
</li>
<li id="3">item 3
</li>
<li id="4">item 4
</li>
</body></html>
=====
[item 1]
[item 2]
[item 4]
Update 2
You just missed initializing for $xpath variable. I've also removed getXHTML call, because it's not necessary:
$content = file_get_contents("2.html");
$page = new DOMDocument();
//$content=getXHTML($content); // no need this if you're using loadHTML
$page->loadHTML($content);
$totalPath = "//body/table[3]/tbody/tr[1]/td[4]";
$xpath = new DOMXPath($page); // creating $xpath object
$total = $xpath->query($totalPath);
echo "[",$total->length,"]";
How much have you played with the PHP Tidy options? If the error you get refers to entities (specifically ) I wonder if setting numeric-entities "on" or playing with the value for preserve-entities would help.
Plan B: Try this. XPath worked even with poorly formed html files.
<?php
$oldSetting = libxml_use_internal_errors( true );
libxml_clear_errors();
$html = new DOMDocument();
$html->loadHtmlFile(
'myHtmlFile.html');
$xpath = new DOMXPath( $html );
$test = $xpath->query( "//div[#id='mydiv']" );
$div = $test->item(0);
echo $div->getAttribute('style');
libxml_clear_errors();
libxml_use_internal_errors( $oldSetting );
?>
the answer to the above question somewhat tricky. my original code looked something like
$xpath=new DOMXPath($page);
..
...
...
$page->loadHTML($content);
..
...
$totalPath = "//body/table[3]/tbody/tr[1]/td[4]";
$total = $xpath->query($totalPath);
...
...
what happens above is that $xpath is created on an empty document because the html is still not loaded in the Dom. so when xpath ran any query it ran the query on an empty document.
now i changed the order of the 2 statements
...
...
$page->loadHTML($content);
$xpath=new DOMXPath($page);
...
...
$totalPath = "//body/table[3]/tbody/tr[1]/td[4]";
$total = $xpath->query($totalPath);
now it works because $xpath is created on a nonempty document

Categories