2017-12-12 14 views
0

私は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を回避していません)

+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の描画には影響しません。 –

関連する問題