Java 如何获取pdf文件每页的尺寸
在pdf文件的每页中央添加水印时,我遇到了一个问题 到目前为止我所尝试的:Java 如何获取pdf文件每页的尺寸,java,pdf,itext,Java,Pdf,Itext,在pdf文件的每页中央添加水印时,我遇到了一个问题 到目前为止我所尝试的: PdfStamper inputPdfStamper = null; try { PdfReader inputPdfReader = new PdfReader(new FileInputStream(input)); inputPdfStamper = new PdfStamper(inputP
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);
}
}
}
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()为不同维度(高度和宽度)的所有页面提供相同的值
问题:
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);
}
}
}
ColumnText.showTextAligned(inputPdfStamper.getUnderContent(pageNumber), Element.ALIGN_CENTER, new Phrase(watermark, font), inputPdfReader.getPageSize(pageNumber).getRight()/2, inputPdfReader.getPageSize(pageNumber).getTop()/2, 45)
如何获取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
,则没有裁剪框,您需要使用媒体框的值。您只提到inputPdfReader.getPageSize(pageNumber).getRight()
和inputPdfReader.getPageSize(pageNumber).getTop()
——您是否也选中了…getLeft()
和…getBorrom()
?您的代码隐式假定左下角的坐标值为(0,0),但这仅适用于大多数PDF,而不是所有的。@mkl感谢您的响应,问题是inputPdfReader.getPageSize(pageNumber)。getRight()为所有页面提供相同的大小,即使页面大小不同,getPageSize()
为您提供与/MediaBox
对应的矩形
对象,但某些页面词典也有/CropBox
条目。您是否检查了getCropBox()
方法?裁剪框定义页面的可见区域。裁剪框应始终小于媒体框。对于不同宽度的页面,getRight()
完全相同是完全正常的。getLeft()
值不同,或者您忽略了存在裁剪框的事实。@BrunoLowagie是的,我尝试调用getCropBox(),但水印被添加到某些页面的中心,我发现getPageSize()也有相同的响应。。。。是的,你说的是正确的裁剪框比mediabox小(我在调试代码时发现的),但这两个案例的最终结果是一样的谢谢你的答案。我在调试代码时遇到了这个问题,对于pdf裁剪的第一页,getRight()为我提供842.0和agian,对于其余的页面,我收到相同的值,即使这些页面的大小不同。842是A4纸的纵向高度。如果getRight()
返回842,则页面将旋转90度。你也应该要求页面进行旋转。