Java 如何获取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

在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);
                        }
                    }
                }
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度。你也应该要求页面进行旋转。