/*
    Antenna House PDF Tool API V8.0
    Java Interface sample program

    概要：テキストエレメント情報取得の例

    Copyright 2025- Antenna House, Inc. 
　*/　/* ーーーー */

package Sample;

import java.time.LocalDateTime;

import jp.co.antenna.ptl.*;

public class EditElement {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        if (args.length < 2)
        {
            System.out.println("usage: java EditElement in-pdf-file out-pdf-file");
            return;
        }

        try (PtlParamInput inputFile = new PtlParamInput(args[0]);
    		PtlParamOutput output = new PtlParamOutput(args[1]);
             PtlPDFDocument doc = new PtlPDFDocument())
        {
            // PDFファイルをロードします。
            doc.load(inputFile);

            try (PtlPages pages = doc.getPages()) // ページコンテナの取得
            {
                // ページコンテナが空かどうか
                if (pages.isEmpty())
                {
                    System.out.println("ページコンテナが空");
                    return;
                }
                
                int pageCount = pages.getCount();
                if (pageCount >= 1)
                {
                	try (PtlPage page = pages.get(0))     //1ページ目
                    {
                        //「ごん狐」の箇所にスタンプを置く例
                        addStamp(page);
                    }
                }
                
                if (pageCount >= 2)
                {
                    //「兵十」に注釈を置く例
                	try (PtlPage page = pages.get(1))     //2ページ目
                    {
                        addAnnot(page);
                    }
                }
                
                if (pageCount >= 3)
                {
                    //文字列を元にしおりを作成する例
                    int pg = 2;
                    try (PtlPage page = pages.get(pg);     //3ページ目
                     PtlOutline outlineRoot = doc.getRootOutline();)
                    {
                        addOutline(page, outlineRoot, pg);
                    }
                }
            }
            doc.save(output);
        }
        catch (PtlException pex) {
             System.out.println("PtlException : ErrorCode = " + pex.getErrorCode() + "\n  " + pex.getErrorMessage());
        }
        catch (Exception ex) {
            System.out.println(ex.getMessage());
            ex.printStackTrace();
        }
        catch (Error ex) {
            System.out.println(ex.getMessage());
            ex.printStackTrace();
        }
        finally {
            System.out.println("-- 完了 --");
        }
    }


  public static void addStamp(PtlPage page) throws PtlException, Exception, Error
  {
      //「ごん狐」の箇所にスタンプを置く例
      try (PtlContent content = page.getContent();
      	PtlEditElements elements = content.getEditElements();)
      {
          int elemCnt = elements.getCount();
          for (int i = 0; i < elemCnt; i++)
          {
              PtlEditElement element = elements.get(i);
              // テキストエレメント
              if (element.getType() == PtlEditElement.ELEMENT_TYPE.TYPE_TEXT)
              {
                  PtlEditText textObj = (PtlEditText)element;
                  PtlEditTextItems items = textObj.getTextItems();
                  int itemCnt = items.getCount();
                  for (int j = 0; j < itemCnt; j++)
                  {
                      PtlEditTextItem item = items.get(j);

                      PtlFontInfo fontInfo = item.getFontInfo();
                      // "ごん狐"の位置にスタンプを追加する
                      if (item.getText().equals("ごん狐"))
                      {
                          try (PtlAnnots annots = page.getAnnots();
                          	PtlAnnotStamp stampAnnot1 = new PtlAnnotStamp();)
                          {
                              // テキストの位置を取得
                              PtlRect recB = item.getBBox();
                              stampAnnot1.setRect(recB);
                              stampAnnot1.setIconType(PtlAnnotStamp.ICON_TYPE.ICON_APPROVED);
                              stampAnnot1.setAnnotFlags(PtlAnnot.FLAG_PRINT);
                              annots.append(stampAnnot1);
                          }
                      }
                  }
              }
          }
      }
  }
    
  public static void addAnnot(PtlPage page) throws PtlException, Exception, Error
  {
      //「兵十」に注釈を置く例
      try (PtlContent content = page.getContent();
      PtlEditElements elements = content.getEditElements();)
      {
          int elemCnt = elements.getCount();
          for (int i = 0; i < elemCnt; i++)
          {
              PtlEditElement element = elements.get(i);

              // テキストエレメント
              if (element.getType() == PtlEditElement.ELEMENT_TYPE.TYPE_TEXT)
              {
                  PtlEditText textObj = (PtlEditText)element;
                  PtlEditTextItems items = textObj.getTextItems();
                  int itemCnt = items.getCount();
                  for (int j = 0; j < itemCnt; j++)
                  {
                      PtlEditTextItem item = items.get(j);

                      //注釈を追加する例
                      if (item.getText().equals("兵十"))
                      {
                          //注釈コンテナの取得
                          try (PtlAnnots annots = page.getAnnots();)
                          {
                              //PDFのテキスト注釈
                        	  try (PtlAnnotText annottext = new PtlAnnotText();)
                              {
                                  //アイコンタイプ設定 ICON_COMMENT = 1, /* コメント */
                                  annottext.setIconType(PtlAnnotText.ICON_TYPE.ICON_COMMENT);

                                  //矩形座標にテキストの位置を設定
                                  annottext.setRect(item.getBBox());

                                  // テキストの位置を取得
                                  PtlRect recB = item.getBBox();
                                  String str = "Rect (" + recB.getLeft() + ", " + recB.getBottom() + ", " + recB.getRight() + ", " + recB.getTop() + ")" + "\n";

                                  PtlQuadPoint qpoint = item.getQuadPoint();
                                  str += "QuadPoint : TopLeft (" + qpoint.getTopLeft().getX() + ", " + qpoint.getTopLeft().getY() + ")" + "\n";
                                  str += "QuadPoint : TopRight (" + qpoint.getTopRight().getX() + ", " + qpoint.getTopRight().getY() + ")" + "\n";
                                  str += "QuadPoint : BottomLeft (" + qpoint.getBottomLeft().getX() + ", " + qpoint.getBottomLeft().getY() + ")" + "\n";
                                  str += "QuadPoint : BottomRight (" + qpoint.getBottomRight().getX() + ", " + qpoint.getBottomRight().getY() + ")" + "\n";
                                  // フォント情報を取得
                                  PtlFontInfo fontInfo = item.getFontInfo();
                                  str += "FontName : " + fontInfo.getFontName() + "\n";
                                  if (fontInfo.isEmbedded())
                                  { // 文字の埋め込みを取得
                                      str += "isEmbedded : true" + "\n";
                                  }
                                  else
                                  {
                                      str += "isEmbedded :false" + "\n";
                                  }
                                  // ペイントフラグ
                                  str += "ペイントフラグ：" + "\n";
                                  switch(item.getPaintFlags())
                                  {
                                  case (int)PtlEditTextItem.PAINT_FILL:
                                      //塗りつぶしの色
                                      PtlColor clr1 = item.getFillColor();
                                      str += " PAINT_FILL" + writeColor(clr1) + "\n";
                                  
                                	  break;
                                  case (int)PtlEditTextItem.PAINT_STROKE:
                                      //輪郭色
                                      PtlColor clr2 = item.getStrokeColor();
                                      str += " PAINT_STROKE" + writeColor(clr2) + "\n";
                                      
                                	  break;
                                  }

                                  //内容をを設定
                                  annottext.setTextContents(str);
                                  //日時の設定
                                  //DateTime dt = DateTime.Now;
                                  LocalDateTime dt = LocalDateTime.now();
                                  try (PtlDate date = new PtlDate(dt.getYear(), dt.getMonthValue(), dt.getDayOfMonth(), dt.getHour(), dt.getMinute(), dt.getSecond());)
                                  {
                                      annottext.setDate(date);
                                  }
                                  //注釈フラグを設定
                                  annottext.setAnnotFlags(PtlAnnotText.FLAG_NOROTATE);
                                  //色を設定
                                  if (item.getFillColor().getType() == PtlColor.COLOR_TYPE.TYPE_DEVICE_RGB)
                                  {
                                      try (PtlColorDeviceRGB color = (PtlColorDeviceRGB)item.getFillColor();)
                                      {
                                          annottext.setColor(color);
                                      }
                                  }

                                  //境界線スタイルを設定
                                  annottext.setBorderStyle(PtlAnnotText.BORDER_STYLE.BORDER_SOLID);
                                  //境界線幅を設定
                                  annottext.setBorderWidth(PtlAnnotText.BORDER_LINE_WIDTH.BORDER_WIDTH_THIN);

                                  //------
                                  //ポップアップウィンドウのタイトル文字列設定
                                  annottext.setMarkUpTitle(item.getText());

                                  //サブジェクトの短い説明設定
                                  annottext.setMarkUpSubj(Integer.toString(item.getPaintFlags()));
                                  //注釈生成日時の設定
                                  try (PtlDate dateMarkup = new PtlDate(dt.getYear(), dt.getMonthValue(), dt.getDayOfMonth(), dt.getHour(), dt.getMinute(), dt.getSecond());)
                                  {
                                      annottext.setMarkUpDate(dateMarkup);
                                  }

                                  //不透明度を設定
                                  annottext.setMarkUpCA(0.6f);
                                  //注釈の追加
                                  annots.append(annottext);
                              }
                          }
                      }
                  }
              }
          }
      }
  }
    
  public static void addOutline(PtlPage page, PtlOutline outlineRoot, int pg) throws PtlException, Exception, Error
  {
      //赤と青の文字列を元にしおりを作成する例
      try (PtlContent content = page.getContent();
    	PtlEditElements elements = content.getEditElements();)
      {
          int elemCnt = elements.getCount();
          for (int i = 0; i < elemCnt; i++)
          {
              PtlEditElement element = elements.get(i);

              // テキストエレメント
              if (element.getType() == PtlEditElement.ELEMENT_TYPE.TYPE_TEXT)
              {
                  PtlEditText textObj = (PtlEditText)element;
                  PtlEditTextItems items = textObj.getTextItems();
                  int itemCnt = items.getCount();
                  for (int j = 0; j < itemCnt; j++)
                  {
                      PtlEditTextItem item = items.get(j);
                      if (item.getFillColor().getType() == PtlColor.COLOR_TYPE.TYPE_DEVICE_RGB)
                      {
                          try (PtlOutline outline = new PtlOutline();
                          	PtlColorDeviceRGB color = (PtlColorDeviceRGB)item.getFillColor();)
                          {
                              // テキストの塗りつぶし色が青か赤のとき
                              if ((color.getR() == 0.0f && color.getG() == 0.0f && color.getB() == 1.0f)
                                  || (color.getR() == 1.0f && color.getG() == 0.0f && color.getB() == 0.0f))
                              {
                                  // アウトラインタイトルの色にテキストの塗りつぶし色を設定
                                  outline.setColor(color);

                                  // テキストエレメントの内容をアウトラインに設定
                                  outline.setTitle(item.getText());
                                  // PtlActionGoTo : GoToアクション<現在のドキュメント内の宛先へ移動>
                                  try (PtlActionGoTo actiongoto = new PtlActionGoTo();
                                  // PtlDestXYZ 宛先にテキストエレメントの位置を設定
                                	PtlDestXYZ destxyz = new PtlDestXYZ();)
                                  {
                                      destxyz.setPageNumber(pg);      //ページ指定
                                      PtlRect recB = item.getBBox();  // テキストの位置
                                      destxyz.setBottom(recB.getBottom());
                                      destxyz.setTop(recB.getTop());
                                      destxyz.setLeft(recB.getLeft());
                                      destxyz.setRight(recB.getRight());
                                      // 宛先の設定
                                      actiongoto.setDest(destxyz);
                                      // アクションの設定
                                      outline.setAction(actiongoto);
                                  }
                                  // アウトラインフラグを設定
                                  outline.setFlags(PtlOutline.FLAG_NORMAL);
                                  // PDF表示時の子アウトラインをオープンするかどうかの設定
                                  outline.setOpen(true);

                                  // 子アウトラインの追加
                                  outlineRoot.appendLastChild(outline);
                              }
                          }
                      }
                  }
              }
          }
      }
  }
  
  public static String writeColor(PtlColor clr) throws PtlException, Exception, Error
  {
      // 色の文字列を取得
      String str = "";
      switch (clr.getType())
      {
          case TYPE_DEVICE_RGB:
              str += " : DEVICE_RGB  : ";
              PtlColorDeviceRGB rgbColor = (PtlColorDeviceRGB)clr;
              str += "(" + rgbColor.getR() + ", " + rgbColor.getG() + ", " + rgbColor.getB() + ")";
              break;
          case TYPE_DEVICE_CMYK:
              str += " : DEVICE_CMYK";
              PtlColorDeviceCMYK cmykColor = (PtlColorDeviceCMYK)clr;
              str += "(" + cmykColor.getC() + ", " + cmykColor.getM() + ", " + cmykColor.getY() + ", " + cmykColor.getK() + ")";
              break;

          case TYPE_DEVICE_GRAY:
              str += " : DEVICE_GRAY";
              PtlColorDeviceGray gryColor = (PtlColorDeviceGray)clr;
              str += "(" + gryColor.getGray() + ")";
              break;
          case TYPE_NONE:
              str += " : COLOR_TYPE.TYPE_NONE";
              break;
          case TYPE_UNKNOWN:
              str += " : COLOR_TYPE.TYPE_UNKNOWN";
              break;
      }
      return str;
  }
}    
