当前位置: 首页 > 面试题库 >

如何在有可用空间(例如密度扫描仪)的pdf上插入图像或盖章

艾奕
2023-03-14
问题内容

我有一个pdf文件,在其中向所有页面添加邮票。

但是,问题是,图章被添加到每页的左上角。如果页面在该部分中有文本,则图章会出现在文本上。

我的问题是,是否有什么方法可以读取每一页,并且如果该部分中没有文本,请添加图章,否则将搜索最接近的可用空间,就像密度扫描仪那样?

我正在使用IText和Java 1.7。

自由空间推子类别和距离计算功能与接受的答案相同。

以下是我正在使用的编辑代码:

    // The resulting PDF file
    String RESULT = "K:\\DCIN_TER\\DCIN_EPU2\\CIRCUIT FROM BRANCH\\RAINBOW ORDERS\\" + jtfSONo.getText().trim() + "\\PADR Release\\Final PADR Release 1.pdf";

    // Create a reader
    PdfReader reader = new PdfReader("K:\\DCIN_TER\\DCIN_EPU2\\CIRCUIT FROM BRANCH\\RAINBOW ORDERS\\" + jtfSONo.getText().trim() + "\\PADR Release\\Final PADR Release.pdf");

    // Create a stamper
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(RESULT));

    // Loop over the pages and add a footer to each page
    int n = reader.getNumberOfPages();

    for(int i = 1; i <= n; i++)
    {
          Collection<Rectangle2D> rectangles = find(reader, 300, 100, n, stamper); // minimum width & height of a rectangle

          Iterator itr = rectangles.iterator();

          while(itr.hasNext())
          {
                 System.out.println(itr.next());
          }

          if(!(rectangles.isEmpty()) && (rectangles.size() != 0))
          {
                 Rectangle2D best = null;

                 double bestDist = Double.MAX_VALUE;

                 Point2D.Double point = new Point2D.Double(200, 400);

                 float x = 0, y = 0;

                 for(Rectangle2D rectangle: rectangles)
                 {
                       double distance = distance(rectangle, point);

                       if(distance < bestDist)
                       {
                              best = rectangle;

                              bestDist = distance;

                              x = (float) best.getX();

                              y = (float) best.getY();

                              int left = (int) best.getMinX();

                              int right = (int) best.getMaxX();

                              int top = (int) best.getMaxY();

                              int bottom = (int) best.getMinY();

                              System.out.println("x : " + x);
                              System.out.println("y : " + y);
                              System.out.println("left : " + left);
                              System.out.println("right : " + right);
                              System.out.println("top : " + top);
                              System.out.println("bottom : " + bottom);

                       }
                }

                getFooterTable(i, n).writeSelectedRows(0, -1, x, y, stamper.getOverContent(i)); // 0, -1 indicates 1st row, 1st column upto last row and last column
        }

        else
             getFooterTable(i, n).writeSelectedRows(0, -1, 94, 140, stamper.getOverContent(i)); // bottom left corner
   }

   // Close the stamper
   stamper.close();

   // Close the reader
   reader.close();

   public Collection<Rectangle2D> find(PdfReader reader, float minWidth, float minHeight, int page, PdfStamper stamper) throws IOException
   {
         Rectangle cropBox = reader.getCropBox(page);

         Rectangle2D crop = new Rectangle2D.Float(cropBox.getLeft(), cropBox.getBottom(), cropBox.getWidth(), cropBox.getHeight());

         FreeSpaceFinder finder = new FreeSpaceFinder(crop, minWidth, minHeight);

         PdfReaderContentParser parser = new PdfReaderContentParser(reader);

         parser.processContent(page, finder);

         System.out.println("finder.freeSpaces : " + finder.freeSpaces);

         return finder.freeSpaces;
    }

    // Create a table with page X of Y, @param x the page number, @param y the total number of pages, @return a table that can be used as footer
   public static PdfPTable getFooterTable(int x, int y)
   {
         java.util.Date date = new java.util.Date();

         SimpleDateFormat sdf = new SimpleDateFormat("dd MMM yyyy");

         String month = sdf.format(date);
         System.out.println("Month : " + month);

         PdfPTable table = new PdfPTable(1);

         table.setTotalWidth(120);
         table.setLockedWidth(true);

         table.getDefaultCell().setFixedHeight(20);
         table.getDefaultCell().setBorder(Rectangle.TOP);
         table.getDefaultCell().setBorder(Rectangle.LEFT);
         table.getDefaultCell().setBorder(Rectangle.RIGHT);
         table.getDefaultCell().setBorderColorTop(BaseColor.BLUE);
         table.getDefaultCell().setBorderColorLeft(BaseColor.BLUE);
         table.getDefaultCell().setBorderColorRight(BaseColor.BLUE);
         table.getDefaultCell().setBorderWidthTop(1f);
         table.getDefaultCell().setBorderWidthLeft(1f);
         table.getDefaultCell().setBorderWidthRight(1f);

         table.getDefaultCell().setHorizontalAlignment(Element.ALIGN_CENTER);

         Font font1 = new Font(FontFamily.HELVETICA, 10, Font.BOLD, BaseColor.BLUE);

         table.addCell(new Phrase("CONTROLLED COPY", font1));

         table.getDefaultCell().setFixedHeight(20);
         table.getDefaultCell().setBorder(Rectangle.LEFT);
         table.getDefaultCell().setBorder(Rectangle.RIGHT);
         table.getDefaultCell().setBorderColorLeft(BaseColor.BLUE);
         table.getDefaultCell().setBorderColorRight(BaseColor.BLUE);
         table.getDefaultCell().setBorderWidthLeft(1f);
         table.getDefaultCell().setBorderWidthRight(1f);

         table.getDefaultCell().setHorizontalAlignment(Element.ALIGN_CENTER);

         Font font = new Font(FontFamily.HELVETICA, 10, Font.BOLD, BaseColor.RED);

         table.addCell(new Phrase(month, font));

         table.getDefaultCell().setFixedHeight(20);
         table.getDefaultCell().setBorder(Rectangle.LEFT);
         table.getDefaultCell().setBorder(Rectangle.RIGHT);
         table.getDefaultCell().setBorder(Rectangle.BOTTOM);
         table.getDefaultCell().setBorderColorLeft(BaseColor.BLUE);
         table.getDefaultCell().setBorderColorRight(BaseColor.BLUE);
         table.getDefaultCell().setBorderColorBottom(BaseColor.BLUE);
         table.getDefaultCell().setBorderWidthLeft(1f);
         table.getDefaultCell().setBorderWidthRight(1f);
         table.getDefaultCell().setBorderWidthBottom(1f);

         table.getDefaultCell().setHorizontalAlignment(Element.ALIGN_CENTER);

         table.addCell(new Phrase("BLR DESIGN DEPT.", font1));

         return table;
   }

问题答案:

我的其他答案集中于原始问题,即如何在页面上以给定的最小尺寸找到可用空间。

由于已经编写了该答案,因此OP提供了尝试利用该原始答案的代码。

这个答案处理该代码。

该代码有很多缺点。

  1. 页面上可用空间的选择取决于文档中的页面数。

原因是在页面循环开始时找到的:

    for(int i = 1; i <= n; i++)
{
    Collection<Rectangle2D> rectangles = find(reader, 300, 100, n, stamper);
    ...

OP肯定意味着i,不n存在。该代码始终会在最后一个文档页面上寻找可用空间。

  1. 矩形比应该的低。

其原因可以在矩形坐标的检索和使用中找到:

        x = (float) best.getX();
    y = (float) best.getY();
    ...
getFooterTable(i, n).writeSelectedRows(0, -1, x, y, stamper.getOverContent(i));

Rectangle2D方法getXgetY返回的坐标 左矩形的角落;
PdfPTable方法writeSelectedRows,在另一方面,要求 左矩形角落。因此,getMaxY应使用代替getY



 类似资料:
  • 我是java新手,我的任务是使用扫描器读取数组,并在另一种方法中读取int。 我正在做的是计算一只兔子到达河对岸所需的最小跳跃次数。数组中的int表示从河的一边开始的石头的距离,另一个int表示石头的数量。兔子能跳的最远距离是50。 对于输入和输出: 输入n:7(输入,河中的石头数)32 46 70 85 96 123 145(输入,石头与起点之间的距离,最后一个数字是河的宽度,即目的地(河对岸)

  • 我开发了一个字符排序器,我想每次字符串排序后提示用户输入一个新的字符串。我遇到的问题是扫描仪一直在扫描用户的第一个输入。如果我使用scanner.next(),它不会计算输入末尾的空白,这不是解决方案。 这是while循环的开始。一旦代码完成,它将再次从“inputtext”开始。

  • 我想读取一个文本文件,并将每一行放入一个字符串(字符串数组)。然而,这需要扫描文件两次,一次是为了找出有多少行,另一次是为了创建一个这样大小的字符串数组。但它抛出了一个错误,重置方法似乎不起作用。 这是相关的代码片段。

  • 在分离标记之前,我试图检查扫描仪是否有多个标记。我目前正在尝试使用扫描仪。hasNext()(我的扫描仪的名字是sc)。如果用户输入“string int”,那么我不想打印“enter age”或“enter grade” 目前,无论输入是什么,我的程序都会跳过if语句。如果我把它拿走!然后,即使输入是一行,这些行也会打印出来。他们似乎也打印后,下一个是我发现奇怪的。我将非常感谢您的帮助!

  • 我正在为课堂做作业。由于某种原因,程序完全跳过了用户应该键入变量的部分。我想不出任何理由为什么它会以这种方式运行,因为我的其余代码位于部分之后(它要求诸如和类型之类的东西)工作正常且有序。

  • 问题内容: 今天早些时候,我问如何在不陷入无限循环的情况下重试/捕获输入不匹配异常 但是这是两个过程,首先,游戏会要求用户提供网格的大小,然后在启动后,游戏会要求用户设置标志或跨过一个单元格(如果我的游戏在其他单元格之上,会打印出周围的地雷数量),但是我收到一些奇怪的错误代码: 错误: 在我的打印语句之间打印异常消息的奇怪的事情(网格是一条语句,指令也是一条) 进行搜索时,我发现无法在同一位置使用