Установите разные части поля формы, чтобы иметь разные шрифты, используя iTextSharp
Я не уверен, что это возможно, но я подумал, что стоит спросить. Я выяснил, как установить шрифт поля формы с помощью методов 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 ответа
Да, вроде. Поля PDF могут иметь форматированное текстовое значение (начиная с acrobat 6/pdf1.5) вместе с обычным значением.
Обычное значение использует шрифт, определенный по умолчанию... один шрифт.
Формат расширенного значения (который iText не поддерживает напрямую, по крайней мере, пока), описан в главе 12.7.3.4 Справочника PDF. <b>, <i>, <p>
и довольно много текстовых атрибутов css2. Требуется с различными атрибутами.
Чтобы включить расширенные значения, вы должны установить бит 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 создать для вас внешний вид [s].
Мне потребовалось некоторое время, чтобы понять, что richtextfield не работает так, как предполагалось, с акрополями, и в большинстве случаев PDF не редактировался с разными шрифтами во время выполнения.
Я разработал способ установки различных шрифтов в акрополях, передачи значений и редактирования во время выполнения с помощью itextsharp, и я подумал, что это будет полезно для других.
Создайте pdf с текстовым полем в PDF1.pdf (надеюсь, вы знаете, как создать поле в pdf), например, txtComments. Перейдите в раздел свойств и установите для свойства значение richtext,Mulitiline.
Отформатируйте текстовое содержимое в word или pdf, добавив шрифты и цвета. Если это сделано в слове, скопируйте и вставьте содержимое в поле pdf - txtcomments.
Примечание. Если вы хотите добавить динамический контент. Установите параметр "{0}" в поле txtComment в pdf. используя метод строкового формата, вы можете установить для него значения. Это показано в приведенном ниже коде.
e.g., "Set different parts of a form field to have different fonts using {0}"
Добавьте следующий код в событие кнопки (это не является конкретным) по ссылке в 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()
Надеюсь это поможет.