java - 如何获取pdf文件每页的尺寸

标签 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文件各页的页面大小

最佳答案

这不是 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/

相关文章:

java - 应用程序查找重复匹配项应遵循什么标准

amazon-web-services - 仅使用 replaceAll ("\r", "_".replaceAll ("\n", "_"传递 Veracode CWE 117(日志的不正确输出中和)

java - 在 Android Studio 的 iText PDF 文档中添加图像

c# - 如何在 ASP.NET 和 C# 中使用 iTextSharp 合并 PDF 中具有相同值的行?

Java反射调用不起作用

java - JAXB 2 : unmarshalling xml without xml declaration

javascript - 无法使用 XMLHttpRequest 读取大 pdf 文件

java - 使用 jax-rs 使用 jquery 下载 pdf

android - 无法在 Android 设备上查看 PDF(带有嵌入式 swf)

android - DroidText 发生了什么事?