2016-04-24 7 views
0

は、私は2つのインスタンスレイヤ1レイヤ2種類com.itextpdf.text.pdf.PdfLayer、あろうタイプcom.itextpdf.text.Imageレイヤ2のインスタンスを含むタイプcom.itextpdf.text.pdf.PdfTemplateのインスタンスに使用されるレイヤ1を持つがあるとcom.itextpdf.text.pdf.PdfAnnotation 3D注釈に使用されます。3D注釈とPdfLayer

問題:可視性を設定し、レイヤ2 のために確保された領域を活性化した後、私はそれ(レイヤ2)unvisibleも表示レイヤ1にすることはできませんどちらも。

エッセンシャルコード:

private Document document; 
private PdfWriter writer; 
PdfContentByte upperLayer; 

Rectangle box; 

private PdfLayer view2D; 
private PdfLayer view3D; 

public static void main(String[] args) throws DocumentException, MalformedURLException, URISyntaxException, IOException 
{ 
    LayersWithDiffDimsDemo generator = new LayersWithDiffDimsDemo(); 

    generator.setupResources(); 
    generator.report(); 
    generator.cleanupResources(); 

} 

public void setupResources() throws DocumentException, IOException 
{ 
    document = new Document(PageSize.A4); 

    FileOutputStream outputStream = new FileOutputStream("layers_with_diff_dimensions.pdf"); 
    writer = PdfWriter.getInstance(document, outputStream); 

    document.open(); 
    upperLayer = writer.getDirectContent(); 

    box = new Rectangle(26.0f, document.getPageSize().getHeight() - 455.0f, 550, document.getPageSize().getHeight() - 210.0f); 
    box.setBorder(Rectangle.BOX); 
    box.setBorderWidth(0.5f); 
    box.setBorderColor(new BaseColor(0xFF, 0x00, 0x00)); 
    document.add(box); 

    PdfLayer views = PdfLayer.createTitle("Ansichtsmodi", writer); 

    view2D = new PdfLayer("2D", writer); 
    view2D.setOn(true); 

    view3D = new PdfLayer("3D", writer); 
    view3D.setOn(false); 

    views.addChild(view3D); 
    views.addChild(view2D); 

    ArrayList<PdfLayer> radio = new ArrayList<>(); 
    radio.add(view3D); 
    radio.add(view2D); 
    writer.addOCGRadioGroup(radio); 
} 

public void report() throws URISyntaxException, MalformedURLException, IOException 
{ 
    try 
    { 
     // Output the dimension drawing 
     // teapot.jpg is a screen shot of the 3d model 
     Image imageIn2D = Image.getInstance("teapot.jpg"); 

     imageIn2D.setAbsolutePosition((document.getPageSize().getWidth() - imageIn2D.getWidth())/2, 400.0f); 
     imageIn2D.setLayer(view2D); 
     upperLayer.addImage(imageIn2D, true); 

     try { 
      // The file name that contains the 3D Model 
      FileInputStream inputStream = new FileInputStream("teapot.u3d"); 
      PdfStream stream3D = new PdfStream(inputStream, writer); 
      stream3D.put(PdfName.TYPE, new PdfName("3D")); 
      stream3D.put(PdfName.SUBTYPE, new PdfName("U3D")); 
      stream3D.flateCompress(); 
      try { 
       PdfIndirectObject streamObject = writer.addToBody(stream3D); 
       stream3D.writeLength(); 
       PdfDictionary dict3D = new PdfDictionary(); 
       dict3D.put(PdfName.TYPE, new PdfName("3DView")); 
       dict3D.put(new PdfName("XN"), new PdfString("Default")); 
       dict3D.put(new PdfName("IN"), new PdfString("Unnamed")); 
       dict3D.put(new PdfName("MS"), PdfName.M); 
       dict3D.put(new PdfName("C2W"), new PdfArray(new float[]{1, 0, 0, 0, 0, -1, 0, 1, 0, 3, -235, 28})); 
       dict3D.put(PdfName.CO, new PdfNumber(235)); 
       PdfIndirectObject dictObject = writer.addToBody(dict3D); 
       PdfAnnotation annot = new PdfAnnotation(writer, box); 
       annot.setLayer(view3D); 
       annot.put(PdfName.CONTENTS, new PdfString("3D Model")); 
       annot.put(PdfName.SUBTYPE, new PdfName("3D")); 
       annot.put(PdfName.TYPE, PdfName.ANNOT); 
       annot.put(new PdfName("3DD"), streamObject.getIndirectReference()); 
       annot.put(new PdfName("3DV"), dictObject.getIndirectReference()); 
       PdfAppearance ap = upperLayer.createAppearance(box.getWidth(), box.getHeight()); 
       annot.setAppearance(PdfAnnotation.APPEARANCE_NORMAL, ap); 
       annot.setPage(); 

       upperLayer.addAnnotation(annot, false); 

      } catch (IOException ex) { 
       Logger.getLogger(LayersWithDiffDimsDemo.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     } catch (FileNotFoundException ex) { 
      Logger.getLogger(LayersWithDiffDimsDemo.class.getName()).log(Level.SEVERE, null, ex); 
     } 

    } catch (DocumentException ex) 
    { 
     Logger.getLogger(LayersWithDiffDimsDemo.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

public void cleanupResources() 
{ 
    document.close(); 
} 

は、いずれかの示唆をありがとう!

+0

コードをご記入ください –

+0

Alexeyさん、こんにちは、あなたの貢献に感謝します。私はこの問題の背後にある基本的なコードを挿入しました。 –

答えて

1

ビューアがAcrobatまたはReaderであると仮定すると、3D注釈が有効である限り、表示されます。注釈が可視またはその他のレイヤーに関連付けられているという事実は、その注釈を変更しません。私の主張を擁護

...

http://practicalpdf.com/downloads/BrakeAssembly.pdfでファイルを開きます。

このファイルには、ページ全体を1つの3Dアノテーションが持ち、クリックするとアクティブに設定されます。ファイルが最初に開くと非アクティブになります。 3D注釈は「3DAnnot」というレイヤーにもあり、レイヤーパネルが表示された状態でReaderのファイル初期表示が開かれるように設定されています。アノテーションをレイヤーに関連付けることはPDF仕様書でサポートされていますが、プラグインなしで、またはライブラリを介してAcrobatで作成する方法はありません。

ファイルを最初に開いたとき、3D注釈はアクティブではなく、レイヤの表示を切り替えることができます。注釈ポスターの可視性は、レイヤの可視性に従います。ここでアノテーションをクリックしてアクティブにします。今すぐ 3D Annotがレイヤの可視性の影響を受けていないことに注意してください。

これは、レイヤーの表示がPDFページのコンテンツにのみ適用されるためです。 3D注釈のポスター(見た目)は、ページコンテンツであるその辞書の唯一の部分です。 3Dビューアランタイムは、単に注釈と同じ長方形に投影しています。アクティブな間は、3D注釈を保持するレイヤーの上にレイヤーを追加しても、3Dコンテンツは常にページコンテンツに表示されます。

+0

こんにちはJoel、あなたの貢献に感謝します。あなたは主張を主張してもらえますか? –

+0

私は論争よりもうまくいくことができます、私は実証することができます。 – joelgeraci

+1

上記の私の編集した回答を参照してください。 – joelgeraci