问题描述
使用 itext 和 xmlworker 版本 5.5.13.2
我需要将带有基本 CSS 的静态 HTML 转换为 pdf。但是生成的 PDF 格式/间距/位置不正确。有人可以通过指出我犯的错误或我在代码部分遗漏的东西来帮助我。
HTML
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<div style="margin:5px; width:100%">
<div style="border:1px solid black;padding: 25px;">
<div class="row1">
<div class="floatR" style="min-width: 33%;width: 33%;min-height: 1px; float: right;">
<h3>
Tax Invoice/Bill Of Supply/ Cash Memo
</h3>
(Original for Recipient)
</div>
</div>
<div class="row1 marginT50p">
<div style="min-width: 33%;width: 33%;min-height: 1px;float: left;">
<h4>
Sold By:
ArtisanIndia Shoppping Private Limited,</h4>
Shop On Plot No. 7 and 8,41 and 42,Vijay Nagar,Patrakar Colony Road,Mansarovar,Jaipur - 302020,Rajasthan
State/UT Code: 08
Country: India
</div>
<div style="min-width: 33%;width: 33%;min-height: 1px;float: left;"></div>
<div style="min-width: 33%;width: 33%;min-height: 1px ;float: left;">
<h4>
Sold By:
ArtisanIndia Shoppping Private Limited,Rajasthan
State/UT Code: 08
Country: India
</div>
</div>
<div class="row1 marginT25">
<div style="min-width: 33%;width: 33%;min-height: 1px;float: left;">
<label class="textUnderline">Comapny GSTIN:</label>JKDHFBGKJDJHJ
<br />
<label class="textUnderline">Comapny PAN:</label>SDJKHFGB
</div>
<div style="min-width: 33%;width: 33%;min-height: 1px;float: left;"></div>
<div style="min-width: 33%;width: 33%;min-height: 1px;float: left;">
<label class="textUnderline">Biller GSTIN:</label>JKDHFBGKJDJHJ
<br />
<label class="textUnderline">Biller PAN:</label>SDJKHFGB
</div>
</div>
<div class="row1 marginT25">
<div style="min-width: 33%;width: 33%;min-height: 1px;float: left;">
<label class="textBold">Order ID:</label>235235
<br />
<label class="textBold">Order Date:</label>12/12/1912
</div>
<div style="min-width: 33%;width: 33%;min-height: 1px;float: left;"></div>
<div style="min-width: 33%;width: 33%;min-height: 1px;float: left;">
<label class="textBold">Shipping Address:</label>
<br />
<label class="textBold"> </label>
<br />
Shop On Plot No. 7 and 8,Rajasthan
State/UT Code: 08
Country: India
</div>
</div>
<div class="row1 marginT25">
<div style="min-width: 33%;width: 33%;min-height: 1px;float: left;">
<label class="textBold">Invoice Date:</label>12/12/1912
<br />
<label class="textBold">Order ID:</label>AI/2012/907656767
</div>
<div style="min-width: 33%;width: 33%;min-height: 1px;float: left;"></div>
<div style="min-width: 33%;width: 33%;min-height: 1px;float: left;">
<label class="textBold">Place Of Supply:</label> Maharastra
<br />
<label class="textBold">Place Of Delivery:</label>Maharastra
</div>
</div>
<div class="row1 marginT25">
<table style="width:100%">
<tr>
<th>Sr. No.</th>
<th>Product</th>
<th>Description</th>
<th>HSN</th>
<th>GST %</th>
<th>QTY</th>
<th>Gross Amount</th>
<th>discount</th>
<th>Taxable value</th>
<th>CGST</th>
<th>SGST</th>
<th>IGST</th>
<th>Total</th>
</tr>
<tr>
<td>1</td>
<td>Product Description</td>
<td>Item Description</td>
<td>123456</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>2</td>
<td>Product Description</td>
<td>Item Description</td>
<td>123456</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>3</td>
<td>Product Description</td>
<td>Item Description</td>
<td>123456</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td colspan="5">Total</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</table>
</div>
<div class="row1">
<div style="min-width: 25%; width: 25%; min-height: 1px;float: left;">
<label class="textUnderline textBold">
Seller Registered Address:
ArtisanIndia Shoppping Private Limited,</label>
Shop On Plot No. 7 and 8,Rajasthan
State/UT Code: 08
Country: India
</div>
</div>
<div class="row1 marginT50p">
<div style="min-width: 25%; width: 25%; min-height: 1px;float: left;">
E. & O. E.
</div>
<div class=" floatR" style="min-width: 25%; width: 25%; min-height: 1px; float: right;">
<div class="signBox">
Sign/Stamp
</div>
<span> Ordered Through
</span>
<span class="textUnderline">
ArtisanIndia Shoppping Pvt Limited
<br />
Authorized Signature
</span>
</div>
</div>
</div>
</div>
</body>
</html>
CSS
* {
font-family: sans-serif;
font-size:8px
}
.width33 {
min-width: 33%;
width: 33%;
min-height: 1px;
border:1px solid red
}
.width25 {
min-width: 25%;
width: 25%;
min-height: 1px;
border: 1px solid green;
}
.row1:after {
content: "";
display: table;
clear: both;
}
.floatL {
float: left;
}
.floatR {
float: right;
}
.marginT25 {
margin-top: 25px;
}
.marginT50p {
margin-top: 50px
}
.textUnderline {
text-decoration: underline;
}
.textBold {
font-weight: bold;
}
table,th,td {
border: 1px solid black;
border-collapse: collapse;
font-size: 10px;
}
th,td {
height: 40px;
text-align: center;
}
.signBox {
vertical-align: middle;
text-align: center;
height: 50px;
border: 1px solid black;
/* margin: auto; */
}
Java
UploadUtil s3Upload = new UploadUtil();
PdfWriter pdfWriter = null;
ByteArrayOutputStream gg = new ByteArrayOutputStream();
try{
Document document = new Document();
PdfWriter.getInstance(document,gg);
document.open();
XMLWorkerHelper xmlWorkerHelper = XMLWorkerHelper.getInstance();
xmlWorkerHelper.parseXHtml(pdfWriter,document,new FileInputStream("C:\\Users\\jj\\Desktop\\asdf\\tt.html"),new FileInputStream("C:\\Users\\jj\\Desktop\\asdf\\ttt.css"));
document.close();
FileOutputStream fos = new FileOutputStream("C:\\Users\\jj\\Desktop\\asdf\\test.pdf");
fos.write(gg.toByteArray());
fos.close();
}
catch(Exception e){
System.out.println("asdf");
}
生成的 pdf 看起来像这样。
代替
这里有人能指出发生这种情况的原因,或者我错过了什么或做错了什么吗?
解决方法
iText 5.5.13.2 是 iText 产品的旧版本,不再受支持。很可能在 html 或 css 中有一些不受支持的功能。我可以猜测不支持浮动属性。可能百分比宽度有问题。您可以尝试使用 html 和 css 文件来尝试使 pdf 看起来可以接受,但最简单的方法是使用最新版本的 iText 产品,即 iText 7