Переглянути джерело

pdftools(android) - 文字编辑增加外部导入字体

libai 1 рік тому
батько
коміт
c0082841bc

BIN
compdfkit-repo/compdfkit-ui/ComPDFKit-UI.aar


BIN
compdfkit-repo/compdfkit/ComPDFKit.aar


+ 5 - 0
compdfkit-tools/src/main/java/com/compdfkit/tools/common/views/pdfproperties/basic/CBasicPropertiesFragment.java

@@ -164,6 +164,11 @@ public abstract class CBasicPropertiesFragment extends Fragment implements CAnno
 
     }
 
+    @Override
+    public void onChangeAnnotExternFontType(String fontName) {
+
+    }
+
     @Override
     public void onChangeAnnotTextAlignment(CPDFFreetextAnnotation.Alignment alignment) {
 

+ 86 - 0
compdfkit-tools/src/main/java/com/compdfkit/tools/common/views/pdfproperties/font/CExternFontSpinnerAdapter.java

@@ -0,0 +1,86 @@
+/**
+ * Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.
+ * <p>
+ * THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
+ * AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
+ * UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
+ * This notice may not be removed from this file.
+ */
+
+package com.compdfkit.tools.common.views.pdfproperties.font;
+
+import android.content.Context;
+import android.graphics.Typeface;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+
+import androidx.annotation.NonNull;
+import androidx.appcompat.widget.AppCompatTextView;
+
+import com.compdfkit.core.annotation.CPDFTextAttribute;
+import com.compdfkit.tools.R;
+
+import java.util.List;
+
+
+public class CExternFontSpinnerAdapter extends BaseAdapter {
+
+    private List<CPDFTextAttribute.FontNameHelper.FontType> list;
+    List<String> externFontList = null;
+    private Context mContext;
+
+    public CExternFontSpinnerAdapter(@NonNull Context context, List<CPDFTextAttribute.FontNameHelper.FontType> fontTypes) {
+        this.list = fontTypes;
+        mContext = context;
+    }
+
+    public CExternFontSpinnerAdapter(@NonNull Context context, List<CPDFTextAttribute.FontNameHelper.FontType> fontTypes, List<String> fontList) {
+        this.list = fontTypes;
+        mContext = context;
+        externFontList = fontList;
+    }
+
+    public int getStandardFontCount() {
+        return list.size();
+    }
+
+    @Override
+    public int getCount() {
+        return list.size() + (externFontList == null ? 0 : externFontList.size());
+    }
+
+    @Override
+    public Object getItem(int position) {
+        if (position < list.size()) {
+            return list.get(position);
+        } else {
+            return externFontList.get(position - list.size());
+        }
+    }
+
+    @Override
+    public long getItemId(int position) {
+        return position;
+    }
+
+    @Override
+    public View getView(int position, View convertView, ViewGroup parent) {
+        LayoutInflater inflater = LayoutInflater.from(mContext);
+        convertView = inflater.inflate(R.layout.tools_font_list_item, null);
+        if (convertView != null){
+            AppCompatTextView textView = convertView.findViewById(R.id.tv_menu_title);
+            if (position < list.size()) {
+                CPDFTextAttribute.FontNameHelper.FontType fontType = (CPDFTextAttribute.FontNameHelper.FontType) getItem(position);
+                String fontName = CPDFTextAttribute.FontNameHelper.obtainFontName(fontType, false, false);
+                Typeface typeface = CPDFTextAttribute.FontNameHelper.getInnerTypeface(textView.getContext(), fontName);
+                textView.setText(fontName);
+                textView.setTypeface(typeface);
+            } else {
+                textView.setText(externFontList.get(position - list.size()));
+            }
+        }
+        return convertView;
+    }
+}

+ 18 - 2
compdfkit-tools/src/main/java/com/compdfkit/tools/common/views/pdfproperties/preview/CAnnotFreeTextPreviewView.java

@@ -4,7 +4,9 @@ package com.compdfkit.tools.common.views.pdfproperties.preview;
 import android.content.Context;
 import android.graphics.Typeface;
 import android.graphics.fonts.Font;
+import android.text.TextUtils;
 import android.util.AttributeSet;
+import android.util.Log;
 import android.util.TypedValue;
 import android.view.Gravity;
 import android.view.ViewGroup;
@@ -31,6 +33,8 @@ public class CAnnotFreeTextPreviewView extends CBasicAnnotPreviewView {
 
     private CPDFTextAttribute.FontNameHelper.FontType fontType = CPDFTextAttribute.FontNameHelper.FontType.Helvetica;
 
+    private String externFontPath = "";
+
     public CAnnotFreeTextPreviewView(@NonNull Context context) {
         this(context, null);
     }
@@ -73,8 +77,13 @@ public class CAnnotFreeTextPreviewView extends CBasicAnnotPreviewView {
     }
 
     private Typeface getTypeFace(){
-        String fontName = CPDFTextAttribute.FontNameHelper.obtainFontName(fontType, isBold, isItalic);
-        Typeface typeface = CPDFTextAttribute.FontNameHelper.getInnerTypeface(getContext(), fontName);
+        Typeface typeface = null;
+        if (TextUtils.isEmpty(externFontPath)) {
+            String fontName = CPDFTextAttribute.FontNameHelper.obtainFontName(fontType, isBold, isItalic);
+             typeface = CPDFTextAttribute.FontNameHelper.getInnerTypeface(getContext(), fontName);
+        } else {
+            typeface = Typeface.createFromFile(externFontPath);
+        }
         return typeface;
     }
 
@@ -122,6 +131,13 @@ public class CAnnotFreeTextPreviewView extends CBasicAnnotPreviewView {
     public void setFontType(CPDFTextAttribute.FontNameHelper.FontType fontType) {
         super.setFontType(fontType);
         this.fontType = fontType;
+        externFontPath = "";
+        textView.setTypeface(getTypeFace());
+    }
+
+    @Override
+    public void setExternFontType(String fontPath){
+        externFontPath = fontPath;
         textView.setTypeface(getTypeFace());
     }
 }

+ 2 - 0
compdfkit-tools/src/main/java/com/compdfkit/tools/common/views/pdfproperties/preview/CBasicAnnotPreviewView.java

@@ -74,4 +74,6 @@ abstract class CBasicAnnotPreviewView extends FrameLayout {
     public void setFontSize(int fontSize){}
 
     public void setFontType(CPDFTextAttribute.FontNameHelper.FontType fontType){}
+
+    public void setExternFontType(String fontName){}
 }

+ 6 - 0
compdfkit-tools/src/main/java/com/compdfkit/tools/common/views/pdfproperties/preview/CStylePreviewView.java

@@ -153,6 +153,12 @@ public class CStylePreviewView extends FrameLayout {
         }
     }
 
+    public void setExternFontType(String name) {
+        if (previewView != null) {
+            previewView.setExternFontType(name);
+        }
+    }
+
     private void updatePreview() {
         removeAllViews();
         previewView = null;

+ 26 - 1
compdfkit-tools/src/main/java/com/compdfkit/tools/common/views/pdfstyle/CAnnotStyle.java

@@ -70,7 +70,7 @@ public class CAnnotStyle {
     private int fontSize;
 
     private CPDFTextAttribute.FontNameHelper.FontType fontType = CPDFTextAttribute.FontNameHelper.FontType.Unknown;
-
+    private String externFontName = "";
     private CPDFFreetextAnnotation.Alignment alignment = CPDFFreetextAnnotation.Alignment.ALIGNMENT_UNKNOW;
 
     private String imagePath;
@@ -273,6 +273,10 @@ public class CAnnotStyle {
         return fontType;
     }
 
+    public String getExternFontName() {
+        return externFontName;
+    }
+
     public void setFontType(CPDFTextAttribute.FontNameHelper.FontType fontType) {
         boolean update = fontType != this.fontType;
         this.fontType = fontType;
@@ -280,6 +284,17 @@ public class CAnnotStyle {
         updateFontType(fontType, update);
     }
 
+    public void setExternFontName(String name) {
+        boolean update = !externFontName.equals(name);
+        externFontName = name;
+        if (TextUtils.isEmpty(externFontName)) {
+            externFontName = "";
+        } else {
+            this.fontType = CPDFTextAttribute.FontNameHelper.FontType.Unknown;
+            updateExternFontType(externFontName, update);
+        }
+    }
+
     public void setAlignment(CPDFFreetextAnnotation.Alignment alignment) {
         boolean update = alignment != this.alignment;
         this.alignment = alignment;
@@ -585,6 +600,14 @@ public class CAnnotStyle {
         }
     }
 
+    private void updateExternFontType(String fontName, boolean update) {
+        if (styleChangeListenerList != null && update) {
+            for (OnAnnotStyleChangeListener onAnnotStyleChangeListener : styleChangeListenerList) {
+                onAnnotStyleChangeListener.onChangeAnnotExternFontType(fontName);
+            }
+        }
+    }
+
     private void updateTextAlignment(CPDFFreetextAnnotation.Alignment alignment, boolean update) {
         if (styleChangeListenerList != null && update) {
             for (OnAnnotStyleChangeListener onAnnotStyleChangeListener : styleChangeListenerList) {
@@ -665,6 +688,8 @@ public class CAnnotStyle {
 
         void onChangeAnnotFontType(CPDFTextAttribute.FontNameHelper.FontType fontType);
 
+        void onChangeAnnotExternFontType(String fontName);
+
         void onChangeAnnotTextAlignment(CPDFFreetextAnnotation.Alignment alignment);
 
         void onChangeAnnotImagePath(String imagePath);

+ 5 - 0
compdfkit-tools/src/main/java/com/compdfkit/tools/common/views/pdfstyle/CBasicOnStyleChangeListener.java

@@ -99,6 +99,11 @@ public class CBasicOnStyleChangeListener  implements CAnnotStyle.OnAnnotStyleCha
 
     }
 
+    @Override
+    public void onChangeAnnotExternFontType(String fontName) {
+
+    }
+
     @Override
     public void onChangeAnnotTextAlignment(CPDFFreetextAnnotation.Alignment alignment) {
 

+ 4 - 0
compdfkit-tools/src/main/java/com/compdfkit/tools/common/views/pdfstyle/manager/CStyleManager.java

@@ -156,6 +156,10 @@ public class CStyleManager implements CAnnotStyle.OnAnnotStyleChangeListener {
         updateAnnot();
     }
 
+    @Override
+    public void onChangeAnnotExternFontType(String fontName) {
+        updateAnnot();
+    }
     @Override
     public void onChangeAnnotTextAlignment(CPDFFreetextAnnotation.Alignment alignment) {
         updateAnnot();

+ 35 - 12
compdfkit-tools/src/main/java/com/compdfkit/tools/edit/pdfproperties/CEditTextProperFragment.java

@@ -1,6 +1,9 @@
 package com.compdfkit.tools.edit.pdfproperties;
 
+import android.graphics.Typeface;
 import android.os.Bundle;
+import android.text.TextUtils;
+import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
@@ -19,11 +22,14 @@ import com.compdfkit.tools.R;
 import com.compdfkit.tools.common.views.pdfproperties.basic.CBasicPropertiesFragment;
 import com.compdfkit.tools.common.views.pdfproperties.colorlist.CColorListView;
 import com.compdfkit.tools.common.utils.view.colorpicker.widget.ColorPickerView;
+import com.compdfkit.tools.common.views.pdfproperties.font.CExternFontSpinnerAdapter;
 import com.compdfkit.tools.common.views.pdfproperties.font.CFontSpinnerAdapter;
 import com.compdfkit.tools.common.views.pdfproperties.preview.CStylePreviewView;
 import com.compdfkit.tools.common.utils.view.sliderbar.CSliderBar;
 import com.compdfkit.tools.common.views.pdfstyle.CAnnotStyle;
+import com.compdfkit.ui.utils.CPDFSysFontUtils;
 
+import java.nio.file.attribute.FileOwnerAttributeView;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -52,7 +58,7 @@ public class CEditTextProperFragment extends CBasicPropertiesFragment implements
     private CSliderBar fontSizeSliderBar;
 
     private Spinner fontSpinner;
-
+    CExternFontSpinnerAdapter fontSpinnerAdapter;
     private List<View> alignmentViews = new ArrayList<>();
 
     @Override
@@ -108,12 +114,12 @@ public class CEditTextProperFragment extends CBasicPropertiesFragment implements
             previewView.setFontBold(annotStyle.isFontBold());
             previewView.setFontItalic(annotStyle.isFontItalic());
             previewView.setFontType(annotStyle.getFontType());
-
+            previewView.setFontSize(annotStyle.getFontSize());
             List<CPDFTextAttribute.FontNameHelper.FontType> fontTypes = new ArrayList<>();
             fontTypes.add(CPDFTextAttribute.FontNameHelper.FontType.Courier);
             fontTypes.add(CPDFTextAttribute.FontNameHelper.FontType.Helvetica);
             fontTypes.add(CPDFTextAttribute.FontNameHelper.FontType.Times_Roman);
-            CFontSpinnerAdapter fontSpinnerAdapter = new CFontSpinnerAdapter(getContext(), fontTypes);
+            fontSpinnerAdapter = new CExternFontSpinnerAdapter(getContext(), fontTypes, CPDFSysFontUtils.GetSysFontName());
             fontSpinner.setAdapter(fontSpinnerAdapter);
 
             switch (annotStyle.getFontType()) {
@@ -179,8 +185,13 @@ public class CEditTextProperFragment extends CBasicPropertiesFragment implements
             public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                 if (viewModel != null) {
                     setUpdatePropertyType(CAnnotStyle.UpdatePropertyType.FontType);
-                    CPDFTextAttribute.FontNameHelper.FontType fontType = (CPDFTextAttribute.FontNameHelper.FontType) fontSpinner.getItemAtPosition(position);
-                    viewModel.getStyle().setFontType(fontType);
+                    if (position < fontSpinnerAdapter.getStandardFontCount()) {
+                        CPDFTextAttribute.FontNameHelper.FontType fontType = (CPDFTextAttribute.FontNameHelper.FontType) fontSpinner.getItemAtPosition(position);
+                        viewModel.getStyle().setFontType(fontType);
+                    } else {
+                        String fontName = (String) fontSpinner.getItemAtPosition(position);
+                        viewModel.getStyle().setExternFontName(fontName);
+                    }
                     setUpdatePropertyType(CAnnotStyle.UpdatePropertyType.All);
                 }
             }
@@ -194,13 +205,7 @@ public class CEditTextProperFragment extends CBasicPropertiesFragment implements
 
     @Override
     public void onClick(View v) {
-        if (v.getId() == R.id.tv_font_type) {
-            showFontTypeFragment(null, fontType -> {
-                if (viewModel != null) {
-                    viewModel.getStyle().setFontType(fontType);
-                }
-            });
-        } else if (v.getId() == R.id.iv_font_bold) {
+        if (v.getId() == R.id.iv_font_bold) {
             tvFontBold.setSelected(!tvFontBold.isSelected());
             if (viewModel != null) {
                 setUpdatePropertyType(CAnnotStyle.UpdatePropertyType.Bold);
@@ -288,6 +293,24 @@ public class CEditTextProperFragment extends CBasicPropertiesFragment implements
         }
     }
 
+    @Override
+    public void onChangeAnnotExternFontType(String fontName) {
+        if (previewView != null) {
+            List<String> fontList = CPDFSysFontUtils.getSysFontPathList();
+            String font = "";
+            for (String item : fontList) {
+                if (TextUtils.isEmpty(item)) {
+                    continue;
+                }
+                if (item.contains(fontName + ".")) {
+                    font = item;
+                    break;
+                }
+            }
+            previewView.setExternFontType(font);
+        }
+    }
+
     @Override
     public void onChangeAnnotFontBold(boolean bold) {
         if (previewView != null) {

+ 4 - 0
compdfkit-tools/src/main/java/com/compdfkit/tools/edit/pdfproperties/pdfstyle/CEditSelectionStyle.java

@@ -78,6 +78,8 @@ public class CEditSelectionStyle implements CStyleProvider {
                         textSelections.setFontFromNativeTrueTypeFont(CPDFEditTextArea.FontHelvtics);
                     } else if (font == CPDFTextAttribute.FontNameHelper.FontType.Times_Roman) {
                         textSelections.setFontFromNativeTrueTypeFont(CPDFEditTextArea.FontTimesRoman);
+                    } else {
+                        textSelections.setFontFromNativeTrueTypeFont(style.getExternFontName());
                     }
                 } else {
                     textSelections.setFontColor(style.getTextColor());
@@ -100,6 +102,8 @@ public class CEditSelectionStyle implements CStyleProvider {
                         textSelections.setFontFromNativeTrueTypeFont(CPDFEditTextArea.FontHelvtics);
                     } else if (font == CPDFTextAttribute.FontNameHelper.FontType.Times_Roman) {
                         textSelections.setFontFromNativeTrueTypeFont(CPDFEditTextArea.FontTimesRoman);
+                    } else {
+                        textSelections.setFontFromNativeTrueTypeFont(style.getExternFontName());
                     }
                 }
             }