1

type の2 つのインスタンスlayer1とlayer2 があるとします。layer1は typeのインスタンスを含むtype のインスタンスに使用され、 layer2はtypeの3D 注釈に使用されます。com.itextpdf.text.pdf.PdfLayercom.itextpdf.text.pdf.PdfTemplatecom.itextpdf.text.Imagecom.itextpdf.text.pdf.PdfAnnotation

問題: 可視性を設定し、 layer2 用に予約された領域をアクティブにした後、それ ( layer2 ) を非表示にすることも、 layer1を表示することもできません。

エッセンシャル コード:

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();
}

提案していただきありがとうございます!

4

1 に答える 1

1

ビューアが Acrobat または Reader であると仮定すると、3D 注釈がアクティブである限り表示されます。注釈がレイヤーに関連付けられているという事実は、可視であろうとなかろうと、それを変えません。

私の主張を擁護する...

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

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

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

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

于 2016-04-26T20:28:57.533 に答える