iText7 不接受@page 规则中的特殊 html 字符
iText7 doesn't accept special html characters inside @page rule
我正在按照 iText7 教程将一些 HTML 转换为带页脚的 PDF。似乎 CssRuleSetParser 由于 á:
之后的分号而中断
<html>
<head>
<style>
@page {
@bottom-right {
content: "Página " counter(page) " de " counter(pages);
}
}
</style>
</head>
<body>
<p>Minha terra tem palmeiras<br/>Onde canta o sabiá<br/>As aves que aqui gorjeiam<br/>Não gorjeiam como lá</p>
</body>
</html>
正文中的特殊字符完美运行。
Java代码没有什么特别之处:
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import com.itextpdf.html2pdf.ConverterProperties;
import com.itextpdf.html2pdf.HtmlConverter;
import com.itextpdf.styledxmlparser.css.media.MediaDeviceDescription;
import com.itextpdf.styledxmlparser.jsoup.nodes.Document;
@RestController
@RequestMapping("/html2pdf")
public class Html2PdfController {
@PostMapping(produces = MediaType.APPLICATION_PDF_VALUE)
public @ResponseBody byte[] convert(@RequestBody String html) throws IOException {
try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
var converterProperties = new ConverterProperties();
var mediaDeviceDescription = new MediaDeviceDescription(com.itextpdf.styledxmlparser.css.media.MediaType.PRINT);
converterProperties.setMediaDeviceDescription(mediaDeviceDescription);
HtmlConverter.convertToPdf(html, baos, converterProperties);
return baos.toByteArray();
}
}
}
最好的方法是什么?我应该尝试“清除”CSS 中的特殊字符吗? :-(
编辑:
[forward|back]也不接受斜杠。他们只是被忽略了:
@bottom-right {
content: counter(page) " / " counter(pages);
}
打印(例如)
1 8
您可以用 UTF-8 编码您的 HTML(不要忘记使用 <meta>
标签告诉 browsers/iText 它)并使用您的 non-ASCII 字符直接。
根据上述建议改编的源文件示例:
<html>
<head>
<meta charset="UTF-8">
<style>
@page {
@bottom-right {
content: "Página " counter(page) " / " counter(pages);
}
}
</style>
</head>
<body>
<p>Minha terra tem palmeiras<br/>Onde canta o sabiá<br/>As aves que aqui gorjeiam<br/>Não gorjeiam como lá</p>
</body>
</html>
斜杠也可以正常工作,至少在我最新的 pdfHTML 4.0.1 中是这样。这是视觉结果:
我正在按照 iText7 教程将一些 HTML 转换为带页脚的 PDF。似乎 CssRuleSetParser 由于 á:
之后的分号而中断<html>
<head>
<style>
@page {
@bottom-right {
content: "Página " counter(page) " de " counter(pages);
}
}
</style>
</head>
<body>
<p>Minha terra tem palmeiras<br/>Onde canta o sabiá<br/>As aves que aqui gorjeiam<br/>Não gorjeiam como lá</p>
</body>
</html>
正文中的特殊字符完美运行。
Java代码没有什么特别之处:
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import com.itextpdf.html2pdf.ConverterProperties;
import com.itextpdf.html2pdf.HtmlConverter;
import com.itextpdf.styledxmlparser.css.media.MediaDeviceDescription;
import com.itextpdf.styledxmlparser.jsoup.nodes.Document;
@RestController
@RequestMapping("/html2pdf")
public class Html2PdfController {
@PostMapping(produces = MediaType.APPLICATION_PDF_VALUE)
public @ResponseBody byte[] convert(@RequestBody String html) throws IOException {
try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
var converterProperties = new ConverterProperties();
var mediaDeviceDescription = new MediaDeviceDescription(com.itextpdf.styledxmlparser.css.media.MediaType.PRINT);
converterProperties.setMediaDeviceDescription(mediaDeviceDescription);
HtmlConverter.convertToPdf(html, baos, converterProperties);
return baos.toByteArray();
}
}
}
最好的方法是什么?我应该尝试“清除”CSS 中的特殊字符吗? :-(
编辑:
[forward|back]也不接受斜杠。他们只是被忽略了:
@bottom-right {
content: counter(page) " / " counter(pages);
}
打印(例如)
1 8
您可以用 UTF-8 编码您的 HTML(不要忘记使用 <meta>
标签告诉 browsers/iText 它)并使用您的 non-ASCII 字符直接。
根据上述建议改编的源文件示例:
<html>
<head>
<meta charset="UTF-8">
<style>
@page {
@bottom-right {
content: "Página " counter(page) " / " counter(pages);
}
}
</style>
</head>
<body>
<p>Minha terra tem palmeiras<br/>Onde canta o sabiá<br/>As aves que aqui gorjeiam<br/>Não gorjeiam como lá</p>
</body>
</html>
斜杠也可以正常工作,至少在我最新的 pdfHTML 4.0.1 中是这样。这是视觉结果: