我在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文件每页的页面大小
答案 0 :(得分:1)
这不是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
,则没有裁剪框,您需要使用媒体框的值。