Итак, моим решением было изменить класс PdfPageFormCopier из iText. Основная проблема заключается в функции ниже.
public virtual void Copy(PdfPage fromPage, PdfPage toPage) {
if (documentFrom != fromPage.GetDocument()) {
documentFrom = fromPage.GetDocument();
formFrom = PdfAcroForm.GetAcroForm(documentFrom, false);
}
if (documentTo != toPage.GetDocument()) {
documentTo = toPage.GetDocument();
formTo = PdfAcroForm.GetAcroForm(documentTo, true);
}
if (formFrom == null) {
return;
}
//duplicate AcroForm dictionary
IList<PdfName> excludedKeys = new List<PdfName>();
excludedKeys.Add(PdfName.Fields);
excludedKeys.Add(PdfName.DR);
PdfDictionary dict = formFrom.GetPdfObject().CopyTo(documentTo, excludedKeys, false);
formTo.GetPdfObject().MergeDifferent(dict);
IDictionary<String, PdfFormField> fieldsFrom = formFrom.GetFormFields();
if (fieldsFrom.Count <= 0) {
return;
}
IDictionary<String, PdfFormField> fieldsTo = formTo.GetFormFields();
IList<PdfAnnotation> annots = toPage.GetAnnotations();
foreach (PdfAnnotation annot in annots) {
if (!annot.GetSubtype().Equals(PdfName.Widget)) {
continue;
}
CopyField(toPage, fieldsFrom, fieldsTo, annot);
}
}
Конкретно здесь строка.
excludedKeys.Add(PdfName.DR);
Если вы пройдете код в функции CopyField (), в конечном итоге вы закончите PdfFormField класс. Вы можете увидеть конструктор ниже.
public PdfFormField(PdfDictionary pdfObject)
: base(pdfObject) {
EnsureObjectIsAddedToDocument(pdfObject);
SetForbidRelease();
RetrieveStyles();
}
Функция RetrieveStyles () попытается установить шрифт для поля на основе внешнего вида по умолчанию. Однако это не сработает. Из-за функции ниже.
private PdfFont ResolveFontName(String fontName) {
PdfDictionary defaultResources = (PdfDictionary)GetAcroFormObject(PdfName.DR, PdfObject.DICTIONARY);
PdfDictionary defaultFontDic = defaultResources != null ? defaultResources.GetAsDictionary(PdfName.Font) :
null;
if (fontName != null && defaultFontDic != null) {
PdfDictionary daFontDict = defaultFontDic.GetAsDictionary(new PdfName(fontName));
if (daFontDict != null) {
return GetDocument().GetFont(daFontDict);
}
}
return null;
}
Вы видите, что он пытается увидеть, существует ли шрифт в ресурсах по умолчанию, которые были явно исключены в классе PdfPageFormCopier. Он никогда не найдет шрифт.
Итак, я решил создать собственный класс, реализующий интерфейс IPdfPageExtraCopier. Я скопировал код из класса PdfPageFormCopier и удалил одну строку, исключая ресурсы по умолчанию. Затем я использую свой собственный класс копировального устройства в своем коде. Не самое красивое решение, но оно работает.