0

このコードを使用して、PDFのAcroFieldのフォントサイズを取得しています。

ただし、「名と名前」という名前の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です。

前もって感謝します。

4

2 に答える 2

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仕様ISO3200-1、435ページによると、これは次のことを意味します。

デフォルトの外観文字列(DA)には、フィールドの可変テキストを表示するために、テキストサイズや色などのグラフィックス状態パラメーターを確立するために必要なグラフィックス状態またはテキスト状態演算子が含まれています。この文字列には、テキストオブジェクト内で許可されている演算子のみが含まれます(図9を参照)。少なくとも、文字列には、フォントとサイズの2つのオペランドとともに、Tf(テキストフォント)演算子が含まれている必要があります。指定されたフォント値は、デフォルトのリソースディクショナリのフォントエントリのリソース名と一致する必要があります(インタラクティブフォームディクショナリのDRエントリから参照されます。表218を参照)。サイズのゼロ値は、フォントが自動サイズ設定されることを意味します。そのサイズは、注釈長方形の高さの関数として計算されます。

したがって、使用可能なスペースを埋めるためにサイズを計算する必要がありますが、それ以上は計算しないでください。

アピアランスストリームでは、アピアランスの最後の作成者が32.31ptで仕事をしていることがわかります。

編集

次のように、通常の外観ストリームのバイトを抽出できます。

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));
于 2013-03-11T16:46:28.763 に答える
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));
于 2013-03-23T10:42:44.790 に答える