私はpdfboxを使用して任意のpdfにリンク注釈を追加する機能を実装しました。これはpdfsのほとんどではうまくいきますが、pdfsでは正しい座標にマークアップを付けていないものがあります。そして、私はそのpdfをいくつかのpdfエディタで開いたとき、pdfにはそのpdfの測定に影響する無題のビューポートが含まれていることを警告しました。だから、私はビューポートがおそらく問題を引き起こしていると感じています。ビューポートに応じてマークアップの座標を変更できるので、pdfの正しい場所に配置できます。ここには、ビューポートを含むpdfへのlinkがあります。PDFからビューポートを抽出し、ビューポートに従って注釈の境界矩形を変更するにはどうすればよいですか?
ティルマンの提案によれば、私はビューポートのメジャー辞書から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ビューポートを含むファイルへのリンクを追加しました。 –