1

複数行のテキスト ボックスを含む PDF テンプレートを作成し、PDFStamper を使用して Acrofields にアラビア語のデータを設定する必要があります。テキストの実行方向は最初の行では正しいですが、テキストの折り返しが発生すると変更されます。

ガイドしてください。

package test;

import java.io.FileOutputStream;
import java.io.IOException;    
import com.itextpdf.text.DocumentException;    
import com.itextpdf.text.FontFactory;
import com.itextpdf.text.pdf.AcroFields;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;

public class TextFields{

    public static final String RESULT1 = "D:/template.pdf";
    public static final String RESULT2 = "D:/pdf/result.pdf";
    protected int tf;

    public TextFields(int tf) {
        this.tf = tf;
    }

    public void manipulatePdf(String src, String dest) throws IOException, DocumentException {
        PdfReader reader = new PdfReader(src);
        FontFactory.registerDirectories();
        BaseFont unicode = null;
        unicode = BaseFont.createFont("D:/arialuni.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
        PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
        AcroFields form = stamper.getAcroFields();
          stamper.getAcroFields().addSubstitutionFont(unicode);
        form.setField("TextBox","اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب");
        stamper.close();
        reader.close();
    }

    public static void main(String[] args) throws DocumentException, IOException {
        TextFields example = new TextFields(0);
        example.manipulatePdf(RESULT1, RESULT2);
    }
}
4

3 に答える 3

1

ドキュメントをフラット化していないようです。ドキュメントがインタラクティブなままであることを意図している場合は、外観を生成しないように iText に指示する必要があります。これは次のように行うことができます。

form.setGenerateAppearances(false);

そうすることで、PDF ビューアに外観を作成するように指示します。問題が解決しない場合、問題は iText レベルではなく、PDF ビューアにあります。

フォームをフラット化するつもりなら、現在のバージョンの iText で制限に遭遇したのではないでしょうか。回避策を使用する必要があります。FillFlattenMerge3の例を見てください。この例では、各フィールドの位置を取得します。

AcroFields form = reader.getAcroFields();
positions = new HashMap<String, Rectangle>();
Rectangle rectangle;
Map<String, AcroFields.Item> fields = form.getFields();
for (String name : fields.keySet()) {
    rectangle = form.getFieldPositions(name).get(0).position;
    positions.put(name, rectangle);
}

これらの位置を使用して、メソッドColumnTextを使用する代わりにオブジェクトを使用して適切な場所にフィールドの内容を描画します。setField()

Rectangle rect = positions.get(name);
Phrase p = new Phrase(value, FONT);
ColumnText.showTextAligned(cb, Element.ALIGN_LEFT,
        p, rect.getLeft() + 2, rect.getBottom() + 2, 0);

showTextAligned()メソッドはテキストをラップしないため、これではまだ問題は解決しません。メソッドを使用する代わりに、、、およびメソッドを使用showTextAligned()する必要があります。setRunDirection()addElement()setSimpleColumn()go()

ColumnText column = new ColumnText(writer.getDirectContent());
column.setSimpleColumn(rect);
column.setRunDirection(PdfWriter.RUN_DIRECTION_RTL);
column.addElement(new Paragraph("اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب", unicode));
column.go();

これで、合字を壊すことなく、テキストが適切に折り返されます。

于 2014-06-18T10:51:57.323 に答える