2013-03-11 3 views
0

Я использую этот код, чтобы получить размер шрифта AcroField PDF.Размер шрифта acroFields pdf приближается 0 с помощью iText

Но размер шрифта для AcroField с именем «фамилия первого имени» составляет 0 (хотя его фактический шрифт равен 32,3).

Размер шрифта других полей подходит точно. Обязательно помогите мне получить точный размер шрифта.

Мой код ...

final AcroFields.Item item = acroFields.getFieldItem(fieldName); 

ArrayList list =null; 
if(item!=null) 
    list = item.merged; 
    if (list != null) 
    { 
    for (final Iterator it1 = list.iterator(); it1.hasNext();) 
    { 
     final PdfDictionary itemDict = (PdfDictionary) it1.next(); 
     final PdfObject da = itemDict.get(PdfName.DA); 
     System.out.println(da.toString()); //font size is printing out to be 0; 
    } 
} 

Новый Кодекс

 import java.util.ArrayList; 
     import java.util.Iterator; 
     import java.util.Map; 
     import java.util.Set; 
     import com.lowagie.text.pdf.AcroFields; 
     import com.lowagie.text.pdf.PRStream; 
     import com.lowagie.text.pdf.PdfDictionary; 
     import com.lowagie.text.pdf.PdfEncodings; 
     import com.lowagie.text.pdf.PdfName; 
     import com.lowagie.text.pdf.PdfReader; 
     import com.lowagie.text.pdf.PdfStamper; 
     import com.lowagie.text.pdf.PdfStream; 

    public class MyTest {  

     public static void main(String[] args) { 

    String pdfName = "Crunch-Business_card_NRW_edits.pdf";  

    PdfStamper stamper = null; 
    FileOutputStream fout = null; 
    try{ 
     PdfReader reader = new PdfReader(pdfName); 
     fout = new FileOutputStream("output.pdf"); 
     stamper = new PdfStamper(reader, fout); 

     AcroFields acroFields = stamper.getAcroFields(); 
     Map fieldMap = acroFields.getFields(); 
     Set keys = fieldMap.keySet(); 

     for (Iterator it = keys.iterator(); it.hasNext();) 
     { 
      String fieldName = (String) it.next(); 
      acroFields.setField(fieldName,acroFields.getField(fieldName)); 

      final AcroFields.Item item = acroFields.getFieldItem(fieldName); 
      final ArrayList list = item.merged; 
      if (list != null) { 
       for (final Iterator it1 = list.iterator(); it1.hasNext();) { 
        final PdfDictionary itemDict = (PdfDictionary) it1.next(); 

        PdfDictionary appearanceDict = itemDict.getAsDict(PdfName.AP); 
        PdfStream normalAppearance = appearanceDict.getAsStream(PdfName.N); 

        System.out.println("normalAppearance======"+normalAppearance);// normalAppearance is coming null. 
        byte[] streamBytes = PdfReader.getStreamBytes((PRStream) normalAppearance); 
        System.out.println(PdfEncodings.convertToString(streamBytes, null)); 
       } 
      } 

     }      
     stamper.setFreeTextFlattening(false); 
     stamper.setFormFlattening(false); 
     stamper.close(); 
    } 
    catch(Exception e){ 
     e.printStackTrace(); 
    } 

} 

}

Ссылка для PDF является http://www.mediafire.com/view/?tpjql3ipn3xqpbo.

Спасибо заранее.

+0

Для вашей связи требуется логин. – mkl

+0

Я обновил свою предыдущую ссылку. Ссылка http://www.mediafire.com/view/?tpjql3ipn3xqpbo – Dexter

ответ

0

По сути:

0 означает 'Авто-размер': Вы должны рассчитать размер, который подходит.

Подробно:

Давайте посмотрим на определение поля в документе:

52 0 obj 
<< 
    /Ff 41943042 
    /F 4 
    /Type/Annot 
    /RV(<?xml version="1.0"?> 
     <body xfa:APIVersion="Acroform:2.7.0.0" xfa:spec="2.1" 
       xmlns="http://www.w3.org/1999/xhtml" 
       xmlns:xfa="http://www.xfa.org/schema/xfa-data/1.0/"> 
      <p dir="ltr" 
       style="margin-top:0pt;margin-bottom:0pt;text-valign:middle; 
         font-family:'Alternate Gothic LT';font-size:30pt; 
         color:#ffffff">first name last name</p> 
     </body>) 
    /Subtype/Widget 
    /DV(first name last name) 
    /T(name) 
    /V(first name last name) 
    /DS(font: 'Alternate Gothic LT',sans-serif 12.0pt; text-align:left; color:#FFFFFF) 
    /AP<</N 7 0 R>> 
    /P 21 0 R 
    /MK<<>> 
    /FT/Tx 
    /Rect[36.8297 87.7383 250.89 129.353] 
    /DA(/AlternateGothicLT-No3 0 Tf 1 1 1 rg) 
>> 
endobj 

И при содержании потока внешнего вида в 7 0:

q Q /Tx 
BMC 
q 
0 0 214.06 41.61 re W n 
q 
BT 
1 0 0 1 2 7.14 Tm 
/AlternateGothicLT-No3 32.31 Tf 
1 1 1 rg 
(first name last name)Tj 
0 g 
ET 
Q 
Q 
EMC 

Так так же, как вы читаете через iText, строка DA (по умолчанию) устанавливает шрифт в размере 0.

Согласно спецификации PDF ISO 32000-1, страница 435, это означает:

Появление строка по умолчанию (DA) содержит любые графические состояния или текст государственных операторов, необходимых для установления графика параметров состояния, таких как размер текста и цвет, для отображения переменного текста поля. В этой строке должны присутствовать только те операторы, которые разрешены в текстовых объектах (см. Рис. 9). Как минимум, строка должна содержать оператор Tf (текстовый шрифт), а также его два операнда, шрифт и размер. Указанное значение шрифта должно совпадать с именем ресурса в записи Font словаря ресурсов по умолчанию (ссылка на запись DR для интерактивной формы словаря, см. Таблицу 218). Нулевое значение для размера означает, что шрифт должен быть авторазмер: его размер вычисляется как функция высоты прямоугольника аннотации.

Поэтому размер должен быть рассчитан для заполнения доступного пространства, но не более.

В потоке появления вы видите, что последний создатель внешнего вида считал 32.31 pt, чтобы выполнить задание.

EDIT

Вы можете извлечь байты нормального потока внешнего вида, как это:

PdfDictionary appearanceDict = itemDict.getAsDict(PdfName.AP); 
PdfStream normalAppearance = appearanceDict.getAsStream(PdfName.N); 
byte[] streamBytes = PdfReader.getStreamBytes((PRStream) normalAppearance); 
System.out.println(PdfEncodings.convertToString(streamBytes, null)); 
+0

Спасибо за ваш ответ ... Но можете ли вы уточнить, как я могу получить точный размер? – Dexter

+0

Цитирование из спецификации указывает, что вы должны взять высоту аннотации поля формы и вставить свой шрифт в нее. Поля, которые вы уже используете, предоставляют вам информацию о размере, в вашем случае 87,7383 до 129,353, разница более 41,6. Теперь вам нужно немного вычесть, чтобы письмо не сталкивалось с границей. В первом появлении фигуры использовали 32.31. Вы можете получить этот номер из потока внешнего вида. – mkl

+0

Большое спасибо за ваш немедленный ответ. Я новичок в itext.I попытался получить определение поля документа. Я не могу получить «содержимое потока появления в 7 0». Однако я получил «определение поля в документе:» этим кодом. \t Просьба помочь мне получить внешний вид. – Dexter

0

Я попробовал решение, предоставляемое @mkl и получили ожидаемый результат. Это решение, как пояснил @mkl.

PdfDictionary appearanceDict = itemDict.getAsDict(PdfName.AP); 
PdfStream normalAppearance = appearanceDict.getAsStream(PdfName.N); 
byte[] streamBytes = PdfReader.getStreamBytes((PRStream) normalAppearance); 
System.out.println(PdfEncodings.convertToString(streamBytes, null)); 
Смежные вопросы