【发布时间】:2019-03-26 17:52:53
【问题描述】:
目前,我正在尝试使用 iText7 pdfHtml 添加出现在我的 pdf 每一页背景中的水印,但我无法找到解决方案。例如,我希望文本“机密”出现在每个页面的背景中。我试图像这样用css添加它
@page {
size: Letter;
margin: .5in .5in .5in .5in;
@left-middle {
content: "Confidential";
/* z-index: 100; */
font-size: 80pt;
font-weight: bold;
opacity: .2;
text-align: center;
text-transform: uppercase;
transform: translateX(350px) rotate(-54.7deg);
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
overflow: auto;
z-index: 0;
}
}
这几乎解决了我的问题,但是文字不透明并掩盖了它后面的文字。它也不会旋转,但这不是必要的要求。
欢迎使用 Java、CSS 或 Html 组合的解决方案。
这是我的 Java 代码示例:
FileInputStream htmlStream = null;
FileOutputStream pdfStream = null;
try {
ConverterProperties converterProperties = new ConverterProperties().setBaseUri(path);
converterProperties.setMediaDeviceDescription(new MediaDeviceDescription(MediaType.PRINT));
htmlStream = new FileInputStream(inputPath);
pdfStream = new FileOutputStream(outputPath);
HtmlConverter.convertToPdf(htmlStream, pdfStream, converterProperties);
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if (htmlStream != null) {
htmlStream.close();
}
if (pdfStream != null) {
pdfStream.close();
}
}
编辑
要重现的示例 html:
<!DOCTYPE html>
<html>
<link id="watermark_link" href="watermark.css" rel="stylesheet" type="text/css" />
</head>
<body>
<h1>My First Heading</h1>
<p>My first paragraph.</p>
</body>
</html>
编辑 2
在尝试了@BenIngle 的答案后,这里是我的 Java 代码,可以让它与 pdfHtml 一起工作:
private static void generatePDFFromHTML(String inputPath, String outputPath, String baseUrl) throws IOException {
FileInputStream htmlStream = null;
FileOutputStream pdfStream = null;
try {
ConverterProperties converterProperties = new ConverterProperties().setBaseUri(baseUrl);
converterProperties.setMediaDeviceDescription(new MediaDeviceDescription(MediaType.PRINT));
htmlStream = new FileInputStream(inputPath);
pdfStream = new FileOutputStream(outputPath);
PdfWriter writer = new PdfWriter(pdfStream);
PdfDocument pdfDocument = new PdfDocument(writer);
Watermark watermark = new Watermark("Confidential");
pdfDocument.addEventHandler(PdfDocumentEvent.END_PAGE,watermark);
HtmlConverter.convertToPdf(htmlStream, pdfDocument, converterProperties);
pdfDocument.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if (htmlStream != null) {
htmlStream.close();
}
if (pdfStream != null) {
pdfStream.close();
}
}
}
protected static class Watermark implements IEventHandler {
String watermarkText;
public Watermark(String watermarkText) {
this.watermarkText = watermarkText;
}
@Override
public void handleEvent(Event event) {
//Retrieve document and
PdfDocumentEvent docEvent = (PdfDocumentEvent) event;
PdfDocument pdf = docEvent.getDocument();
PdfPage page = docEvent.getPage();
Rectangle pageSize = page.getPageSize();
PdfCanvas pdfCanvas = new PdfCanvas(page.getLastContentStream(), page.getResources(), pdf);
Canvas canvas = new Canvas(pdfCanvas, pdf, pageSize);
PdfExtGState gstate = new PdfExtGState();
gstate.setFillOpacity(.2f);
pdfCanvas.setExtGState(gstate);
double rotationDeg = -54.7d;
double rotationRad = Math.toRadians(rotationDeg);
Paragraph watermarkParagraph = new Paragraph(watermarkText)
.setFontSize(80f)
.setTextAlignment(TextAlignment.CENTER)
.setVerticalAlignment(VerticalAlignment.MIDDLE)
.setRotationAngle(rotationRad)
.setFixedPosition(100, page.getPageSize().getHeight(), page.getPageSize().getWidth());
canvas.add(watermarkParagraph);
canvas.close();
}
}
我希望这可以帮助其他尝试开始使用 iText pdfHtml 的人!
【问题讨论】:
-
我尝试使用您的 css 创建一个 html 文件,但失败或“机密”未出现在 html 中。您能否附上您要处理的整个 html 文件?
-
我对 html2pdf 不是很熟悉,但是您可以在 html2pdf 过程完成后循环浏览页面并在每个页面中添加一段文本。这将是一个 java 解决方案。
-
@UladzimirAsipchuk 我用一些基本的 html 编辑了我的初始帖子以重现此问题。我无法提供完整的 html 文档,因为它确实包含敏感信息,但是这个 html 与我之前发布的 CSS 相结合足以重现。另外,你只是在浏览器中打开html吗?我不相信我提供的 CSS 将在大多数浏览器中工作,因此您需要通过 iText 发送它以查看结果。生成的 pdf 有一页中间有“机密”字样,但它是 100% 不透明的,并且掩盖了它后面的任何内容。
-
@BenIngle 谢谢你的建议。我将研究通过 Java 代码将水印添加到每个页面。