我已经被困了几天,我无法让这个工作。我试图在vb.net和MVC中使用itextsharp来格式化带粗体或下划线的字段,然后在生成的PDF中查看这些更改。我没有收到错误,但我没有改变字段。 PDF加载正常,但字段的格式永远不会改变。
我正在尝试将文本转换为pdf段落,然后循环遍历其块并应用格式。然后我想使用" SetField"用结果字符串填充字段。 类似的东西:
stamper.AcroFields.SetField(fieldName, formattedString)
我是新手,所以我不确定在哪里进一步排查问题。我还尝试创建一个新字体并添加它,文档保持不变。
我无法上传PDF文件以供检查,但如果有什么我应该检查PDF文件可能会导致这个问题,请告诉我。该文件采用XFA格式。
我有下面的伪代码:
调用GenerateDocument函数的代码:
Dim pdf As Byte()
pdf = GenerateDocument()
Return File(pdf, "application/pdf")
GenerateDocument函数(简化):
Public Function GenerateDocument() As Byte()
Using inStream As New MemoryStream(TemplateBinary) 'the actual pdf binary
Using outStream As New MemoryStream
Dim pdfReader As New text.pdf.PdfReader(inStream)
Dim stamper As New PdfStamper(pdfReader, outStream)
Dim form As AcroFields = stamper.AcroFields
Dim fieldKeys = form.Fields.Keys
stamper.AddViewerPreference(PdfName.HIDETOOLBAR, New PdfBoolean(True))
stamper.AddViewerPreference(PdfName.FITWINDOW, New PdfBoolean(True))
stamper.FormFlattening = False
Dim pdfSegment As Paragraph = CreateSimpleHtmlParagraph("sample text")
Dim pdfString As New StringBuilder
If pdfSegment.Count > 0 Then
For counter As Integer = 0 To pdfSegment.Count - 1
Dim para As Paragraph
If pdfSegment(counter).GetType().Name().ToUpper().Contains("PARAGRAPH") Then
para = pdfSegment(counter)
For Each ch As Chunk In para
ch.SetUnderline(0.5F, -1.5F) 'just make everything underline for now
Next
pdfString.Append(para.Content)
End If
If counter < (pdfSegment.Count - 1) Then
pdfString.AppendLine()
End If
Next
form.SetField(xNode.Name, pdfString.ToString())
End If
stamper.Close()
pdfReader.Close()
Return outStream.ToArray()
End Using
End Using
End Function
从上面的代码中调用PDF段落的代码
Private Function CreateSimpleHtmlParagraph(text As String) As Paragraph
Dim pdfTextSection As New Paragraph()
Using sr As StringReader = New StringReader(text)
Dim elements As List(Of IElement) = iTextSharp.text.html.simpleparser.HTMLWorker.ParseToList(sr, Nothing)
For Each e As IElement In elements
pdfTextSection.Add(e)
Next
End Using
Return pdfTextSection
结束职能
答案 0 :(得分:0)
2下列出的代码非常奇怪。您创建一个Paragraph
对象,其中包含一些纯文本,字体,主要信息,缩进信息等等。然后您向Paragraph
询问纯文本而不用字体信息。基本逻辑告诉您,一般StringBuilder
类不知道特定于iTextSharp的概念,例如Chunk
,Font
和下划线。
您还假设普通文本字段能够包含富文本。普通文本字段通常定义为包含一种单一字体的文本。例如:&#34; Helvetica&#34;对于常规文本。或者&#34; Helvetica Bold&#34;用于粗体文字。 &#34;黑体&#34;和&#34; Helvetica Bold&#34;是两个不同的字体(相同的系列)。重要的是不要将概念 font 与概念字体系列混淆。
&#34;下划线&#34;不是字体的质量。普通文本字段不能定义为&#34;值需要加下划线&#34;。
这意味着您需要一个解决方案来实现您的需求。我的书中描述了这种解决方法,更具体地说,我解释了MovieAds示例(如果您需要C#版本,请查看here)。
在此示例中,由于普通文本字段的限制,我不使用setField()
方法。相反,我得到了字段的位置,我使用ColumnText
对象添加了富文本:
AcroFields.FieldPosition f = form.GetFieldPositions(fieldname)[0];
ColumnText ct = new ColumnText(canvas);
ct.SetSimpleColumn(
f.position.Left, f.position.GetBottom(2),
f.position.GetRight(2), f.position.Top
);
ct.AddElement(para);
ct.Go();