如何获取pdf文件的每个页面的尺寸

时间:2014-09-17 05:21:44

标签: java pdf itext

我在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文件每页的页面大小

1 个答案:

答案 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,则没有裁剪框,​​您需要使用媒体框的值。