Установите разные части поля формы, чтобы иметь разные шрифты, используя iTextSharp - PullRequest
6 голосов
/ 10 декабря 2010

Я не уверен, что это возможно, но я подумал, что стоит спросить. Я выяснил, как установить шрифт поля формы с помощью методов pdfstamper и acrofields, но мне бы очень хотелось иметь возможность устанавливать шрифт разных частей текста в одном поле. Вот как я сейчас устанавливаю шрифт полей формы:

            // Use iTextSharp PDF Reader, to get the fields and send to the 
            //Stamper to set the fields in the document
            PdfReader pdfReader = new PdfReader(fileName);

            // Initialize Stamper (ms is a MemoryStream object)
            PdfStamper pdfStamper = new PdfStamper(pdfReader, ms);

            // Get Reference to PDF Document Fields
            AcroFields pdfFormFields = pdfStamper.AcroFields;

            //create a bold font
            iTextSharp.text.Font bold = FontFactory.GetFont(FontFactory.COURIER, 8f, iTextSharp.text.Font.BOLD);

            //set the field to bold
            pdfFormFields.SetFieldProperty(nameOfField, "textfont", bold.BaseFont, null);

            //set the text of the form field
            pdfFormFields.SetField(nameOfField, "This:  Will Be Displayed In The Field");

           // Set the flattening flag to false, so the document can continue to be edited
            pdfStamper.FormFlattening = true;

            // close the pdf stamper
            pdfStamper.Close();

То, что я хотел бы сделать в том случае, когда я установил текст выше, это установить «This:» жирным шрифтом и оставить «Будет отображаться в поле» не жирным шрифтом. Я не уверен, что это на самом деле возможно, но я подумал, что стоит спросить, потому что это действительно помогло бы над тем, над чем я сейчас работаю.

Заранее спасибо!

Ответы [ 2 ]

8 голосов
/ 10 декабря 2010

Да, вроде.Поля PDF могут иметь расширенное текстовое значение (начиная с acrobat 6 / pdf1.5) вместе с обычным значением.

В обычном значении используется шрифт, определенный в появлениях по умолчанию ... один шрифт.

Формат расширенного значения (который iText не поддерживает напрямую, по крайней мере, пока), описан в главе 12.7.3.4 PDF Reference .<b>, <i>, <p>, и довольно много текстовых атрибутов css2.Требуется a с различными атрибутами.

Чтобы включить расширенные значения, необходимо установить бит 26 флагов полей (PdfName.FF) для текстового поля.PdfFormField не имеет setRichValue, но это словари, поэтому вы можете просто:

myPdfFormField.put(PdfName.RV, new PdfString( richTextValue ) );

Если вы пытаетесь добавить форматированный текст в существующее поле, которое его еще не поддерживает:

AcroFields fields = stamper.getAcroFields();

AcroFields.Item fldItem = fields.getFieldItem(fldName);
PdfDictionary mergedDict = item.getMerged(0);
int flagVal = mergedDict.getAsNumber(PdfName.FF).intValue();
flagVal |= (1 << 26);

int writeFlags = AcroFields.Item.WRITE_MERGED | AcroFields.Item.WRITE_VALUE;
fldItem.writeToAll(PdfName.FF, new PdfNumber(flagVal), writeFlags);
fldItem.writeToAll(PdfName.RV, new PdfString(richTextValue), writeFlags);

На самом деле я добавляю поддержку расширенного текста в iText (не резкое), когда набираю это сообщение.Ура для авторов на SO.В последнее время Пауло хорошо синхронизировал iTextSharp, так что это не должно быть проблемой.В следующем выпуске магистрали должна быть эта функция ... чтобы вы могли писать:

myPdfFormField.setFieldFlags( PdfFormField.FF_RICHTEXT );
myPdfFormField.setRichValue( richTextValue );

или

// note that this will fail unless the rich flag is set
acroFields.setFieldRichValue( richTextValue );

ПРИМЕЧАНИЕ. Генерация внешнего вида iText не была обновлена,только ценностная сторона вещей.Это заняло бы значительно больше работы.Поэтому вам нужно acroFields.setGenerateAppearances(false) или иметь JS, который сбрасывает значение поля при открытии формы, чтобы заставить Acrobat / Reader создать внешний вид для вас.

0 голосов
/ 09 августа 2013

Мне потребовалось некоторое время, чтобы понять, что richtextfield не работает так, как это предполагалось и с акрополями, и в большинстве случаев pdf не редактировался с разными шрифтами во время выполнения.

Я работалспособ установки различных шрифтов в акрополях и передачи значений и редактирования во время выполнения с itextsharp, и я подумал, что это будет полезно для других.

  1. Создать PDF с текстовым полем в PDF1.pdf (Iнадеюсь, вы знаете, как создать поле в pdf) Например, txtComments Перейдите в раздел свойств и установите для свойства значение richtext, Mulitiline

  2. Форматируйте текстовое содержимое в слове или pdf, добавив шрифтыи цвета.Если это сделано в слове, скопируйте и вставьте содержимое в поле pdf - txtcomments.

    Примечание. Если вы хотите добавить динамический контент.Установите параметр «{0}» в поле txtComment в pdf.используя метод строкового формата, вы можете установить для него значения. Это показано в приведенном ниже коде.

            e.g., "Set different parts of a form field to have different fonts using {0}"
    
  3. Добавьте следующий код в событие кнопки (это не является конкретным) по ссылкев itextsharp.dll 5.4.2


Response.ContentType = "application/pdf";
Response.AddHeader("Content-disposition","attachment; filename=your.pdf");
PdfReader reader = new PdfReader(@"C:\test\pdf1.pdf");
PdfStamper stamp = new PdfStamper(reader, Response.OutputStream);
AcroFields field = pdfStamp.AcroFields;
string comments = field .GetFieldRichValue("txtcomments");
string Name = "Test1";
string value = string.Format(comments,Name);
field.SetField("txtComment", value );
field.GenerateAppearances = false;//Pdf knows what to do;
stamp.FormFlattening = false;//available for edit at run time
stamp.FreeTextFlattening = true;
stamp.Close();
reader.Close()

Надеюсь, это поможет.

...