java 如何从pdf中提取viewport并根据viewport修改注解的边框?

hsvhsicv  于 2024-01-05  发布在  Java
关注(0)|答案(1)|浏览(181)

我已经实现了使用pdfbox将链接注解添加到任何pdf的功能。它适用于大多数pdf,但对于某些pdf,它不会将标记放置在正确的坐标处。当我在一些pdf编辑器中打开该pdf时,它会警告我该pdf包含一个无标题的视口,这可能会影响该pdf的测量。所以,我觉得viewport是最有可能导致这个问题。有没有一种方法,我可以修改坐标的标记根据viewport,使它被放置在正确的位置在pdf中。这里是一个link到pdf包含viewport。
根据Tilman的建议,我从viewport的measure字典中提取了C条目。并尝试修改矩形的坐标,但它们没有添加到正确的位置。下面是我尝试的代码。此外,viewport对注解没有影响,但当我尝试将某些内容绘制到pdf中时,它会导致问题。

  1. COSArray vps = (COSArray)page.getCOSObject().getDictionaryObject(COSName.getPDFName("VP"));
  2. if (vps != null)
  3. {
  4. for (int v = 0; v < vps.size(); ++v)
  5. {
  6. COSDictionary vp = (COSDictionary)vps.getObject(v);
  7. PDViewportDictionary viewportDict = new PDViewportDictionary(vp);
  8. PDRectangle vpRect = viewportDict.getBBox();
  9. PDMeasureDictionary measureDict = viewportDict.getMeasure();
  10. PDRectlinearMeasureDictionary rectilinearDict = new PDRectlinearMeasureDictionary(measureDict.getCOSObject());
  11. bool pointLieInVP = UtilityClass.RectangleContainsPoint(new PointF(leftX, bottomY), vpRect);
  12. if (pointLieInVP)
  13. {
  14. COSArray xArray = (COSArray)measureDict.getCOSObject().getDictionaryObject(COSName.getPDFName("X"));
  15. float xScale = 1;
  16. if (xArray!=null)
  17. {
  18. xScale = ((COSFloat)(((COSDictionary)xArray.getObject(0)).getDictionaryObject(COSName.getPDFName("C")))).floatValue();
  19. }
  20. leftX /= xScale;
  21. rightX /= xScale;
  22. COSBase yObj = measureDict.getCOSObject().getDictionaryObject(COSName.getPDFName("Y"));
  23. if (yObj != null)
  24. {
  25. COSArray yArray = (COSArray)yObj;
  26. float yScale = ((COSFloat)(((COSDictionary)yArray.getObject(0)).getDictionaryObject(COSName.getPDFName("C")))).floatValue();
  27. bottomY /= yScale;
  28. topY /= yScale;
  29. }
  30. else
  31. {
  32. bottomY /= xScale;
  33. topY /= xScale;
  34. }
  35. }
  36. }
  37. }

字符串
这里是link到pdf的标记是在没有调整视口的情况下添加的。5个红色的标记添加在页面的右下角。但是它们应该被放置在pdf中的链接注解上,这些注解被放置在正确的位置。这里是link的pdf,使用上面的代码修改坐标后,标记被放置在其中。标记根本不会出现。

mutmk8jj

mutmk8jj1#

这段代码(不会避免ClassCastview)将向您显示每个页面中的视口:

  1. try (PDDocument doc = PDDocument.load(new File("S115-STRUCTURALHIGH ROOF FRAMING(WEST)ENLARGED PLANS.pdf")))
  2. {
  3. for (int p = 0; p < doc.getNumberOfPages(); ++p)
  4. {
  5. PDPage page = doc.getPage(p);
  6. COSArray vps = (COSArray) page.getCOSObject().getDictionaryObject(COSName.getPDFName("VP"));
  7. if (vps != null)
  8. {
  9. for (int v = 0; v < vps.size(); ++v)
  10. {
  11. COSDictionary vp = (COSDictionary) vps.getObject(v);
  12. PDRectangle rect = new PDRectangle((COSArray) vp.getDictionaryObject(COSName.BBOX));
  13. System.out.println("Viewport " + vp.getString(COSName.NAME) + ": " + rect);
  14. }
  15. }
  16. }
  17. }

字符串
如何调整注解取决于你.最有可能的是,这些注解应该在bbox里面。你所需要做的就是调整注解的矩形。

展开查看全部

相关问题