2014-06-17 8 views
1

Я создал шаблон в формате pdf с многострочным текстовым полем и должен установить некоторые арабские данные в Acrofields с помощью PDFStamper. Строка направления текста верна для первой строки, но она изменяется, когда происходит перенос текста.Обложка арабского текста с использованием Acrofields в Itext 5.5

Просим руководствоваться.

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); 
    } 
} 

ответ

1

Я вижу, что вы не сглаживаете документ. Если вы намерены, чтобы документ оставался интерактивным, вы должны проинструктировать iText о том, чтобы не создавать каких-либо явлений. Это можно сделать следующим образом:

form.setGenerateAppearances(false); 

Таким образом, вы указываете программе просмотра PDF, чтобы создать видимость. Если проблема не устранена, проблема находится в средстве просмотра PDF, а не на уровне iText.

Если вы намерены сгладить форму, я боюсь, что вы столкнулись с ограничением в текущей версии 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(); 

Теперь ваш текст будет обернут должным образом, не нарушая лигатуры.

+0

Hi Bruno, Я пробовал решение, данное вами, но он не работает нормально для многострочного текста. Обертка не происходит, и текст обрезается до размера текстового поля. Кроме того, когда я делаю форму неинтерактивной, арабские данные в текстовом поле исчезают, пока он отлично работает для данных на английском языке. Обратите внимание. – aanchal

0

Следующий код работает для меня.

Я использовал p {font-family: "arial";} в test.css.

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(); 
      } 
     } 

    } 
} 
+0

Вы пробовали мой код, но вы не говорите мне, какой из двух обходных решений вы пробовали. Также: вы замаскировали вопрос как ответ. Я уверен, что он будет удален по причине «Не ответ». –

+0

Я отредактировал свой ответ. Меня устраивает. – sheena

+0

Спасибо. Он работает для меня, но контент не настраивается в соответствии с размером текстового поля. – aanchal

0

У меня была такая же проблема. вы должны воссоздать свой шаблон.pdf от adobe acrobat pro и установить шрифт вашего текстового поля на один из известных шрифтов в вашем os, таком как arial.

удачи.