我在 pdf 文件每页的中心添加水印时遇到问题。
到目前为止我已经尝试过:
PdfStamper inputPdfStamper = null;
try {
PdfReader inputPdfReader = new PdfReader(new FileInputStream(input));
inputPdfStamper = new PdfStamper(inputPdfReader, new FileOutputStream(input));
Font font = new Font(fontFamily, fontSize, fontStyle, color);
for (int pageNumber = 1 ;pageNumber <=inputPdfStamper.getReader().getNumberOfPages() ; pageNumber++){
if(isWatermarkAbove){
ColumnText.showTextAligned(inputPdfStamper.getOverContent(pageNumber), Element.ALIGN_CENTER, new Phrase(watermark, font), inputPdfReader.getPageSize(pageNumber).getRight()/2, inputPdfReader.getPageSize(pageNumber).getTop()/2, 45);
// Updated Code
// ColumnText.showTextAligned(inputPdfStamper.getUnderContent(pageNumber), Element.ALIGN_CENTER, new Phrase(watermark, font), inputPdfReader.getCropBox(pageNumber).getLeft()/2, inputPdfReader.getCropBox(pageNumber).getBottom()/2, 45);
}else{
ColumnText.showTextAligned(inputPdfStamper.getUnderContent(pageNumber), Element.ALIGN_CENTER, new Phrase(watermark, font), inputPdfReader.getPageSize(pageNumber).getRight()/2, inputPdfReader.getPageSize(pageNumber).getTop()/2, 45);
}
}
inputPdfStamper.close();
} catch (Exception e){
throw new RuntimeException(e);
}finally {
if (inputPdfStamper!=null) {
try {
inputPdfStamper.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
问题:
上面的代码适用于所有页面具有相同尺寸(高度和宽度)的 pdf 文件。 但是当我提供不同尺寸的pdf页面时,水印放置在不同的位置而不是在中心。
我所知道的:
ColumnText.showTextAligned(inputPdfStamper.getUnderContent(pageNumber), Element.ALIGN_CENTER, new Phrase(watermark, font), inputPdfReader.getPageSize(pageNumber).getRight()/2, inputPdfReader.getPageSize(pageNumber).getTop()/2, 45)
在调试和评估上述代码后,我为不同尺寸的 pdf 的所有页面获得相同的页面大小值。
inputPdfReader.getPageSize(pageNumber).getRight()
为 pdf 的所有页面提供相同的页面大小值。
并且 inputPdfReader.getPageSize(pageNumber).getTop()
为不同尺寸(高度和宽度)的所有页面提供相同的值
问题:
如何获取不同尺寸的pdf文件各页的页面大小
最佳答案
这不是 iText 问题。这是一道数学题。
如果有一个代表矩形左下角的坐标(x1,y1)和代表矩形右上角的坐标(x2,y2),你可以计算出矩形的中间坐标像这样的矩形:
((x1 + x2) / 2, (y1 + y2) / 2)
如果你不理解这个公式,请考虑一下:
矩形的宽度为 (x2 - x1)。
宽度的一半等于 (x2 - x1)/2。
需要得到中间的坐标是x1 + (x2 - x1)/2
或者:x1 - x2/2 - x1/2
或者 x1/2 + x2/2
或 (x1 + x2)/2
在您的代码示例中,您尝试过:
inputPdfReader.getCropBox(pageNumber).getLeft()/2
inputPdfReader.getPageSize(pageNumber).getRight()/2
这对应于:
x1 / 2
x2 / 2
这没有任何意义!这就是您所需要的:
Rectangle crop = inpitPdfReader.getCropBox(pageNumber);
float x = (crop.getLeft() + crop.getRight()) / 2;
float y = (crop.getBottom() + crop.getTop()) / 2;
您的问题不符合 iText 相关问题的条件。这是初等数学。
显然:如果crop
等于null
,则没有裁剪框,您需要使用媒体框的值。
关于java - 如何获取pdf文件每页的尺寸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25882842/