0

我对使用 iTextSharp 生成 pdf 非常陌生。我有以下代码将表单中的文本放置到 pdf 输出中。我正在使用 Phrase & ColumnText 将特定文本框中的文本定位到我的 pdf 输出中。我将一个变量以及文本框的文本属性绑定为短语字符串,但它将两组相同的文本放在一起(屏幕截图)。 在此处输入图像描述

string oldFile = Path.GetTempPath() + "invoice.pdf";
string newFile = Path.GetTempPath() + "NewInvoice.pdf";
PdfReader reader = new PdfReader(oldFile);
iTextSharp.text.Rectangle size = reader.GetPageSize(1);
Document doc = new Document(size);
FileStream fs = new FileStream(newFile, FileMode.Create, FileAccess.Write, FileShare.ReadWrite);
PdfWriter writer = PdfWriter.GetInstance(doc, fs);
doc.Open();
PdfContentByte cb = writer.DirectContent;
BaseFont bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, true);
cb.SetColorFill(BaseColor.BLACK);
cb.SetFontAndSize(bf, 12);
cb.BeginText();
cb.ShowTextAligned(PdfContentByte.ALIGN_LEFT, invoiceDate, 480, 603, 0);
cb.EndText();
PdfImportedPage page = writer.GetImportedPage(reader, 1);
cb.AddTemplate(page, 0, 0);

ColumnText ct = new ColumnText(cb);
Phrase phrase = new Phrase(textBox1.Text);
ct.SetSimpleColumn(phrase, 65, 375, 540, 300, 16, Element.ALIGN_LEFT);
ct.Go();
doc.Close();
fs.Close();
writer.Close();
reader.Close();
Process.Start(newFile);

如果我分配一个字符串(字符串任何内容=“这里的一些文本...”;)并将其放在短语字符串中(..new Phrase(whatever);它工作正常。

4

1 回答 1

0

首先让我说我是 iText 的原始开发者。

当我说你应该使用PdfReader/PdfStamper组合而不是Document/组合时,我希望你会相信我PdfWriter。这在我的书的第 6 章中有记录。您可能在外观上看不到任何差异,但 PDF 的内部感觉要好得多。

您在绝对位置添加文本有点奇怪。使用在需要文本的位置有一些 AcroForm 字段的模板不是更好吗?您的代码将更容易维护。

我还看到您正在使用HELVETICAas 字体,其中嵌入的参数等于 true。您肯定知道embedded参数将被忽略,因为HELVETICA它是标准类型 1 字体之一。

最后是您的问题:我认为您的代码不会两次添加该短语。我认为您一直在尝试,并且您正在在原始文件“invoice.pdf”中已经存在的短语上添加一个新短语。如果您 100% 认为情况并非如此,那么您应该共享您的 PDF,以便我(或 iText 的其他人)可以检查它。

于 2013-04-11T15:03:45.753 回答