如何解决Java iText移动水印位置
我有以下代码将图像缩放到A4大小:
void scale(PdfDocument pdfDocument,Rectangle pageSize,Rectangle pageBodySize) {
int n = pdfDocument.getNumberOfPages();
for (int i = 1; i <= n; i++) {
PdfPage page = pdfDocument.getPage(i);
MarginFinder marginFinder = new MarginFinder();
PdfCanvasProcessor pdfCanvasProcessor = new PdfCanvasProcessor(marginFinder);
pdfCanvasProcessor.processPageContent(page);
Rectangle boundingBox = marginFinder.getBoundingBox();
if (boundingBox == null || boundingBox.getWidth() == 0 || boundingBox.getHeight() == 0) {
LOG.warn("Cannot scale page %d contents with bounding box %s\n",i,boundingBox);
continue;
} else {
// Scale and move content into A4 with margin
double scale = 0,xDiff = 0,yDiff = 0;
double xScale = pageBodySize.getWidth() / boundingBox.getWidth();
double yScale = pageBodySize.getHeight() / boundingBox.getHeight();
if (xScale < yScale) {
yDiff = boundingBox.getHeight() * (yScale / xScale - 1) / 2;
scale = xScale;
} else {
xDiff = boundingBox.getWidth() * (xScale / yScale - 1) / 2;
scale = yScale;
}
AffineTransform transform = AffineTransform.getTranslateInstance(pageBodySize.getLeft() + xDiff,pageBodySize.getBottom() + yDiff);
transform.scale(scale,scale);
transform.translate(-boundingBox.getLeft(),-boundingBox.getBottom());
new PdfCanvas(page.newContentStreamBefore(),page.getResources(),pdfDocument)
.concatMatrix(transform);
}
page.setMediaBox(pageSize);
page.setCropBox(pageSize);
}
}
此方法在这里调用:
ByteArrayOutputStream mergedPdfStream = new ByteArrayOutputStream();
PdfDocument mergedPdf = new PdfDocument(new PdfWriter(mergedPdfStream));
for (PdfDocument doc : pdfDocuments) {
int n = doc.getNumberOfPages();
for (int i = 1; i <= n; i++) {
PdfPage page = doc.getPage(i).copyTo(mergedPdf);
mergedPdf.addPage(page);
}
}
Rectangle pageSize = PageSize.A4;
Rectangle pageBodySize = pageSize.clone().applyMargins(6,6,false);
scale(mergedPdf,pageSize,pageBodySize);
mergedPdf.close();
这工作正常,但是我所有的页面都有水印,并且缩放后的该水印几乎被放置在页面的中心,因此在缩放比例后,我需要在每个页面的底部设置页面的水印。 Pdf到A4。
我该如何实现?
编辑:我以这种方式添加水印:
private byte[] addWatermark(final byte[] content,final String watermarkText,final Integer[] RgbColor,final Integer position) {
final ByteArrayOutputStream pdfByteArrayOutputStream = new ByteArrayOutputStream();
byte[] newPdfContent = new byte[0];
Document document = null;
try {
document = createPdf(content,pdfByteArrayOutputStream);
final Paragraph watermark = createWaterMark(watermarkText,RgbColor);
addWatermarkToDocumentPages(document,watermark,position);
} catch (final IOException e) {
LOG.error("Error while adding watermark to Shipping Label,",e);
} finally {
if (Objects.nonNull(document)) {
document.close();
newPdfContent = pdfByteArrayOutputStream.toByteArray();
}
}
return newPdfContent;
}
编辑2:
addWatermarkToDocumentPages执行以下操作:
private void addWatermarkToDocumentPages(final Document document,final Paragraph watermark,final Integer position) {
final PdfDocument pdfDocument = document.getPdfDocument();
final int pages = pdfDocument.getNumberOfPages();
// transparency
final PdfExtGState gs1 = new PdfExtGState();
gs1.setFillOpacity(0.9f);
for (int i = 1; i <= pages; i++) {
final PdfCanvas canvas = new PdfCanvas(pdfDocument.getPage(i));
final PdfPage pdfPage = pdfDocument.getPage(i);
final Rectangle pageSize = pdfPage.getPageSizeWithRotation();
pdfPage.setIgnorePageRotationForContent(true);
pageSize.increaseHeight(WATERMARK_MARGIN_SIZE);
pageSize.moveDown(WATERMARK_MARGIN_SIZE);
pdfPage.setMediaBox(pageSize);
final float x = (pageSize.getLeft() + pageSize.getRight()) / 2;
canvas.saveState();
canvas.setExtGState(gs1);
document.showTextAligned(watermark,x,position,TextAlignment.CENTER,VerticalAlignment.MIDDLE,0);
canvas.restoreState();
}
}
编辑3:
这是我的createPdf方法
private Document createPdf(final byte[] content,final ByteArrayOutputStream outputStream) throws IOException {
try {
final PdfDocument pdfDocument = new PdfDocument(new PdfReader(new ByteArrayInputStream(content)),new PdfWriter(outputStream));
return new Document(pdfDocument);
} catch (final IOException e) {
throw new IOException("Error while creating the PDF Document,e);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。