2017-12-12 8 views
0

필자는 pdfbox를 사용하여 pdf에 링크 주석을 추가하는 기능을 구현했습니다. 대부분의 pdfs에서는 잘 작동하지만 일부 pdfs에서는 정확한 좌표에 마크 업을 배치하지 않습니다. 그리고 일부 pdf 편집기에서 해당 pdf를 열면 pdf에 pdf에 대한 측정에 영향을 줄 수있는 제목없는 뷰포트가 있다는 경고가 나옵니다. 그래서 뷰포트가 문제의 원인 일 가능성이 높습니다. 뷰포트에 따라 마크 업 좌표를 수정하여 pdf의 올바른 위치에 배치 할 수있는 방법이 있습니까? 뷰포트가 포함 된 pdf에 link이 있습니다.PDF에서 뷰포트를 추출하고 뷰포트에 따라 주석의 경계 사각형을 수정하려면 어떻게합니까?

Tilman의 제안에 따르면 뷰포트의 치수 사전에서 C 항목을 추출했습니다. 직사각형의 좌표를 수정하려고 시도했지만 올바른 위치에 추가되지 않습니다. 아래 코드는 제가 시도한 코드입니다. 또한 뷰포트는 주석에 영향을 미치지 않지만 pdf에 무언가를 그릴 때 문제가 발생합니다. 여기

COSArray vps = (COSArray)page.getCOSObject().getDictionaryObject(COSName.getPDFName("VP")); 
if (vps != null) 
{ 
    for (int v = 0; v < vps.size(); ++v) 
    { 

     COSDictionary vp = (COSDictionary)vps.getObject(v); 
     PDViewportDictionary viewportDict = new PDViewportDictionary(vp); 
     PDRectangle vpRect = viewportDict.getBBox(); 
     PDMeasureDictionary measureDict = viewportDict.getMeasure(); 
     PDRectlinearMeasureDictionary rectilinearDict = new PDRectlinearMeasureDictionary(measureDict.getCOSObject()); 
     bool pointLieInVP = UtilityClass.RectangleContainsPoint(new PointF(leftX, bottomY), vpRect); 
     if (pointLieInVP) 
     { 
      COSArray xArray = (COSArray)measureDict.getCOSObject().getDictionaryObject(COSName.getPDFName("X")); 
      float xScale = 1; 
      if (xArray!=null) 
      { 
       xScale = ((COSFloat)(((COSDictionary)xArray.getObject(0)).getDictionaryObject(COSName.getPDFName("C")))).floatValue(); 
      } 
      leftX /= xScale; 
      rightX /= xScale; 
      COSBase yObj = measureDict.getCOSObject().getDictionaryObject(COSName.getPDFName("Y")); 
      if (yObj != null) 
      { 
       COSArray yArray = (COSArray)yObj; 
       float yScale = ((COSFloat)(((COSDictionary)yArray.getObject(0)).getDictionaryObject(COSName.getPDFName("C")))).floatValue(); 
       bottomY /= yScale; 
       topY /= yScale; 
      } 
      else 
      { 
       bottomY /= xScale; 
       topY /= xScale; 
      } 
     } 
    } 
} 

는 PDF 인상의 link는 뷰포트 조정하지 않고 추가 될 것이다. 페이지의 오른쪽 하단에 5 개의 빨간색 마크 업이 추가됩니다. 그러나 그들은 올바른 위치에 배치 된 pdf의 링크 주석 위에 놓여 있어야합니다. pdf에 대한 link은 위의 코드를 사용하여 좌표를 수정 한 후 마크 업을 배치 한 것입니다. 마크 업은 전혀 나타나지 않습니다. (ClassCastExceptions과를 방지하지 않습니다)

+0

@TilmanHausherr 뷰포트가있는 파일에 대한 링크를 추가했습니다. –

답변

1

이 코드는 각 페이지에 당신에게 뷰포트가 표시됩니다 : 주석을 조정하는 방법

try (PDDocument doc = PDDocument.load(new File("S115-STRUCTURALHIGH ROOF FRAMING(WEST)ENLARGED PLANS.pdf"))) 
{ 
    for (int p = 0; p < doc.getNumberOfPages(); ++p) 
    { 
     PDPage page = doc.getPage(p); 
     COSArray vps = (COSArray) page.getCOSObject().getDictionaryObject(COSName.getPDFName("VP")); 
     if (vps != null) 
     { 
      for (int v = 0; v < vps.size(); ++v) 
      { 
       COSDictionary vp = (COSDictionary) vps.getObject(v); 
       PDRectangle rect = new PDRectangle((COSArray) vp.getDictionaryObject(COSName.BBOX)); 
       System.out.println("Viewport " + vp.getString(COSName.NAME) + ": " + rect); 
      } 
     } 
    } 
} 

당신에게 달려있다 ... 대부분이는 BBOX 내부에 있어야한다. 특수 효과의 직사각형을 조정하면됩니다.

+0

뷰포트의 치수 사전에 따라 좌표를 수정하려고했지만 작동하지 않습니다. 내가 사용했던 코드를 추가했습니다. 질문에 제발 좀보세요. –

+0

코드가 주석 사각형을 수정하지 않습니다. 대신 뷰포트를 사용하여 작업하고 있습니다. –

+0

leftX, bottomy, topy, rightx는 마크 업 사각형의 좌표입니다. 또한 뷰포트는 주석에 아무런 영향을 미치지 않으며 pdf의 모든 그림에만 영향을 미칩니다. –

관련 문제