pdfHTML 目前不支持命名页面。您的 HTML 代码也存在不一致:您希望以下块位于横向页面上
<div class="page-landscapes">
<p>This should be a landscape page</p>
</div>
在上一个(纵向)块之后,您对纵向页面进行分页。
通过 pdfHTML 实现的奇偶横向/纵向页面
如果您的目标是交替使用横向和纵向页面,您可以使用如下方法:
<html>
<head>
<title>UnitTest</title>
<style type="text/css">* {
box-sizing: border-box;
}
body {
font-family: Arial, sans-serif;
}
@page:left {
size: A4 landscape;
}
@page:right {
size: A4 portrait;
}
.page-portrait {
page-break-after: always;
}
.page-landscapes {
page-break-after: always;
}
</style>
</head>
<body>
<div class="page-portrait">
<p>This should be a portrait page</p>
</div>
<div class="page-landscapes">
<p>This should be a landscape page</p>
</div>
<div class="page-portrait">
<p>This should be a portrait page</p>
</div>
<div class="page-landscapes">
<p>This should be a landscape page</p>
</div>
</body>
</html>
自定义元素处理,中间转换为元素
您可以利用HtmlConverter.convertToElements 获取中间元素列表并一一处理,根据需要更改默认页面大小。请注意,只有在进入新页面的元素是 HTML 中的顶级元素时,它才会起作用。
我的回答将基于以下 HTML:
<html>
<head>
<title>UnitTest</title>
<style type="text/css">* {
box-sizing: border-box;
}
body {
font-family: Arial, sans-serif;
}
.page-portrait {
page-break-after: always;
page: page-portrait;
}
.page-landscapes {
page-break-after: always;
page: page-landscape;
}
</style>
</head>
<body>
<div class="page-landscapes">
<p>This should be a portrait page</p>
</div>
<div class="page-portrait">
<p>This should be a landscape page</p>
</div>
<div class="page-landscapes">
<p>This should be a portrait page</p>
</div>
<div>
<p>This should be a landscape page</p>
</div>
</body>
</html>
首先,让我们定义一个自定义标签工作者工厂,它将自定义标签工作者分配给<div>元素,这些元素可以包含我们负责分页的特殊类,以及<div>的标签工作者元素本身将负责将我们的特殊类传播到生成的layout 级别元素:
private static class CustomDivTagWorker extends DivTagWorker {
public CustomDivTagWorker(IElementNode element, ProcessorContext context) {
super(element, context);
}
@Override
public void processEnd(IElementNode element, ProcessorContext context) {
super.processEnd(element, context);
IPropertyContainer result = getElementResult();
if (result != null) {
if ("page-portrait".equals(element.getAttribute("class"))) {
result.setProperty(PAGE_BREAK_AFTER_RPOPERTY, "portrait");
} else if ("page-landscapes".equals(element.getAttribute("class"))) {
result.setProperty(PAGE_BREAK_AFTER_RPOPERTY, "landscape");
}
}
}
}
private static class CustomTagWorkerFactory extends DefaultTagWorkerFactory {
@Override
public ITagWorker getCustomTagWorker(IElementNode tag, ProcessorContext context) {
if ("div".equals(tag.name())) {
return new CustomDivTagWorker(tag, context);
}
return super.getCustomTagWorker(tag, context);
}
}
现在主代码将 HTML 转换为元素,将根元素一一添加到结果 Document(来自布局模块),然后通过相应地更改页面大小来处理特殊类的存在。完整代码:
PdfDocument pdfDocument = new PdfDocument(new PdfWriter("path/to/out.pdf"));
ConverterProperties properties = new ConverterProperties();
properties.setTagWorkerFactory(new CustomTagWorkerFactory());
List<IElement> elements = HtmlConverter.convertToElements(new FileInputStream(sourceHTML), properties);
Document document = new Document(pdfDocument);
for (IElement element : elements) {
if (element instanceof IBlockElement) {
document.add((IBlockElement) element);
} else if (element instanceof AreaBreak) {
document.add((AreaBreak) element);
} else {
throw new RuntimeException();
}
if (element.hasProperty(PAGE_BREAK_AFTER_RPOPERTY)) {
String prop = element.getProperty(PAGE_BREAK_AFTER_RPOPERTY);
if ("portrait".equals(prop)) {
document.getPdfDocument().setDefaultPageSize(PageSize.A4);
} else {
document.getPdfDocument().setDefaultPageSize(PageSize.A4.rotate());
}
}
}
pdfDocument.close();