필자는 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과를 방지하지 않습니다)
@TilmanHausherr 뷰포트가있는 파일에 대한 링크를 추가했습니다. –