在Itext 5.5中使用Acrofields包装阿拉伯文本

在Itext 5.5中使用Acrofields包装阿拉伯文本,itext,arabic,pdfstamper,acrofields,Itext,Arabic,Pdfstamper,Acrofields,我已经制作了一个带有多行文本框的pdf模板,并且必须使用PDFStamper在Acrofields中设置一些阿拉伯语数据。 第一行的文字运行方向正确,但在文字换行时会发生变化 请导游 package test; import java.io.FileOutputStream; import java.io.IOException; import com.itextpdf.text.DocumentException; import com.itextpdf.text.FontF

我已经制作了一个带有多行文本框的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);
    }
}

我看你没有把文件弄平。如果您希望文档保持交互式,则应指示iText不要生成任何外观。可以这样做:

form.setGenerateAppearances(false);
通过这样做,您可以告诉PDF查看器创建外观。如果问题仍然存在,则问题存在于PDF查看器中,而不是iText级别

如果您打算将表单展平,我担心您在当前版本的iText中遇到了限制。你需要使用一个变通方法。请看一看这个例子。在本例中,我们得到每个字段的位置:

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);
}
这还不能解决您的问题,因为
showTextAligned()
方法不包装文本。您需要使用
setRunDirection()
addElement()
setSimpleColumn()
go()
方法,而不是使用
showTextAligned()
方法:

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);
ColumnText column = new ColumnText(writer.getDirectContent());
column.setSimpleColumn(rect);
column.setRunDirection(PdfWriter.RUN_DIRECTION_RTL);
column.addElement(new Paragraph("اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب", unicode));
column.go();

现在,您的文本将被正确包装,而不会断开连字。

以下代码适合我

我在test.css中使用了p{font family:“arial”}

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;

import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.Font.FontFamily;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.AcroFields;
import com.itextpdf.text.pdf.ColumnText;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfImportedPage;
import com.itextpdf.text.pdf.PdfPageEventHelper;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.tool.xml.ElementList;
import com.itextpdf.tool.xml.XMLWorker;
import com.itextpdf.tool.xml.XMLWorkerHelper;
import com.itextpdf.tool.xml.css.CssFile;
import com.itextpdf.tool.xml.html.Tags;
import com.itextpdf.tool.xml.parser.XMLParser;
import com.itextpdf.tool.xml.pipeline.css.CSSResolver;
import com.itextpdf.tool.xml.pipeline.css.CssResolverPipeline;
import com.itextpdf.tool.xml.pipeline.end.ElementHandlerPipeline;
import com.itextpdf.tool.xml.pipeline.html.HtmlPipeline;
import com.itextpdf.tool.xml.pipeline.html.HtmlPipelineContext;

public class FillFlattenMerge3 {

    public static final String SRC = "C:/templatestnew.pdf";
    public static final String DEST = "C:/NewFile.pdf";

    public static final Font FONT = new Font(FontFamily.HELVETICA, 10);

    protected Map<String, Rectangle> positions;

    public static void main(String[] args) throws IOException,
            DocumentException {
        File file = new File(DEST);
        file.getParentFile().mkdirs();
        new FillFlattenMerge3().manipulatePdf(SRC, DEST);
    }

    public class Background extends PdfPageEventHelper {

        PdfImportedPage background;

        public Background(PdfImportedPage background) {
            this.background = background;
        }

        @Override
        public void onEndPage(PdfWriter writer, Document document) {
            PdfContentByte cb = writer.getDirectContentUnder();
            cb.addTemplate(background, 0, 0);
        }

    }

    public void manipulatePdf(String src, String dest)
            throws DocumentException, IOException {
        PdfReader reader = new PdfReader(src);
        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);
        }

        Document document = new Document();
        PdfWriter writer = PdfWriter.getInstance(document,
                new FileOutputStream(dest));
        writer.setPageEvent(new Background(writer.getImportedPage(reader, 1)));
        document.open();

        PdfContentByte cb = writer.getDirectContent();

        process(cb, "TextBox", "<p> اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب اب </p>", writer, document);

        document.close();

        reader.close();
    }

    protected void process(PdfContentByte cb, String name, String value,
            PdfWriter writer, Document document) throws DocumentException,
            IOException {
        Rectangle rect = positions.get(name);

        // mycode starts
        XMLWorkerHelper helper = XMLWorkerHelper.getInstance();
        // CSS
        CSSResolver cssResolver = helper.getDefaultCssResolver(true);
        CssFile cssFile = helper.getCSS(new FileInputStream(
                "D:\\Itext_Test\\Test\\src\\test.css"));
        cssResolver.addCss(cssFile);

        // HTML
        HtmlPipelineContext htmlContext = new HtmlPipelineContext(null);
        htmlContext.setTagFactory(Tags.getHtmlTagProcessorFactory());
        htmlContext.autoBookmark(false);

        // Pipelines
        ElementList elements = new ElementList();
        ElementHandlerPipeline end = new ElementHandlerPipeline(elements, null);
        HtmlPipeline html = new HtmlPipeline(htmlContext, end);
        CssResolverPipeline css = new CssResolverPipeline(cssResolver, html);

        // XML Worker
        XMLWorker worker = new XMLWorker(css, true);
        XMLParser parser = new XMLParser(worker);

        // mycode ends

        ColumnText column = new ColumnText(writer.getDirectContent());
        column.setSimpleColumn(rect);
         column.setRunDirection(PdfWriter.RUN_DIRECTION_LTR);

        ByteArrayInputStream is = new ByteArrayInputStream(
                value.getBytes("UTF-8"));

        parser.parse(is);
        int status = ColumnText.START_COLUMN;
        for (Element e : elements) {

            if (ColumnText.isAllowedElement(e)) {
                column.addElement(e);
                status = column.go();
            }
        }

    }
}
import java.io.ByteArrayInputStream;
导入java.io.File;
导入java.io.FileInputStream;
导入java.io.FileOutputStream;
导入java.io.IOException;
导入java.util.HashMap;
导入java.util.Map;
导入java.util.StringTokenizer;
导入com.itextpdf.text.Document;
导入com.itextpdf.text.DocumentException;
导入com.itextpdf.text.Element;
导入com.itextpdf.text.Font;
导入com.itextpdf.text.Font.FontFamily;
导入com.itextpdf.text.Rectangle;
导入com.itextpdf.text.pdf.AcroFields;
导入com.itextpdf.text.pdf.ColumnText;
导入com.itextpdf.text.pdf.PdfContentByte;
导入com.itextpdf.text.pdf.pdf导入页面;
导入com.itextpdf.text.pdf.PdfPageEventHelper;
导入com.itextpdf.text.pdf.PdfReader;
导入com.itextpdf.text.pdf.PdfWriter;
导入com.itextpdf.tool.xml.ElementList;
导入com.itextpdf.tool.xml.XMLWorker;
导入com.itextpdf.tool.xml.XMLWorkerHelper;
导入com.itextpdf.tool.xml.css.CssFile;
导入com.itextpdf.tool.xml.html.Tags;
导入com.itextpdf.tool.xml.parser.XMLParser;
导入com.itextpdf.tool.xml.pipeline.css.CSSResolver;
导入com.itextpdf.tool.xml.pipeline.css.CssResolverPipeline;
导入com.itextpdf.tool.xml.pipeline.end.ElementHandlerPipeline;
导入com.itextpdf.tool.xml.pipeline.html.HtmlPipeline;
导入com.itextpdf.tool.xml.pipeline.html.HtmlPipelineContext;
公共类3{
公共静态最终字符串SRC=“C:/templatestnew.pdf”;
公共静态最终字符串DEST=“C:/NewFile.pdf”;
公共静态最终字体字体=新字体(FontFamily.HELVETICA,10);
受保护的地图位置;
公共静态void main(字符串[]args)引发IOException,
文档例外{
文件文件=新文件(DEST);
文件.getParentFile().mkdirs();
新fillflattmerge3().manipulatePdf(SRC,DEST);
}
公共类后台扩展PdfPageEventHelper{
PDF导入页面背景;
公共背景(PDF导入页面背景){
this.background=背景;
}
@凌驾
公共作废onEndPage(PDF编写器、文档){
PdfContentByte cb=writer.getDirectContentUnder();
cb.addTemplate(背景,0,0);
}
}
公共空操作EPDF(字符串src、字符串dest)
抛出DocumentException,IOException{
PdfReader读取器=新PdfReader(src);
AcroFields form=reader.getAcroFields();
positions=newhashmap();
矩形;
Map fields=form.getFields();
for(字符串名称:fields.keySet()){
矩形=form.getFieldPositions(name).get(0).position;
位置。放置(名称,矩形);
}
文档=新文档();
PdfWriter writer=PdfWriter.getInstance(文档,
新文件输出流(dest));
writer.setPageEvent(新背景(writer.getImportedPage(reader,1));
document.open();
PdfContentByte cb=writer.getDirectContent();
过程(cb,“文本框”,"本1575555157555551575551575555157555157555551575551575551575555157555157555555555555555157555555555555555555551575555555555555上上上上上上上上的的上上上的157515751575515755555555551575555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555从1576 6上的1576上的1576 6上的维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维بببببببببببببببببببببببببباب

”,作者,文件); document.close(); reader.close(); } 受保护的无效进程(PdfContentByte cb、字符串名称、字符串值、, PDFWWriter编写器,文档)引发DocumentException, IOException{ 矩形rect=positions.get(name); //mycode启动 XMLWorkerHelper=XMLWorkerHelper.getInstance(); //CSS CSSResolver CSSResolver=helper.getDefaultCssResolver(true); CssFile CssFile=helper.getCSS(新文件输入流( “D:\\Itext\u Test\\Test\\src\\Test.css”); cssResolver.addCss(cssFile); //HTML HtmlPipelineContext htmlContext=新的HtmlPipelineContext(null); setTagFactory(Tags.getHtmlTagProcessorFactory()); htmlContext.autoBookmark(false); //管道 ElementList elements=新的ElementList(); ElementHandlerPipeline end=新ElementHandlerPipeline(元素,null); HtmlPipeline html=新的HtmlPipeline(htmlContext,end); CssResolverPipeline css=新的CssResolverPipeline(cssResolver,html); //XML工作者 XMLWorker=newxmlworker(css,true); XML解析器