使用itextsharp在现有表/ Image上写文本

时间:2015-04-03 12:22:24

标签: c# itextsharp

This is my pdf screenshot

存在现有的表格/图像。当我使用pdfcontentbyte写文本时,它写在这个表/图像后面。

我还想从这个表/列的右侧写下文本。

我目前用于制作上述图片的代码:

 // open the reader
 PdfReader reader = new PdfReader(oldFile);
 iTextSharp.text.Rectangle size = reader.GetPageSizeWithRotation(1);
 Document document = new Document(size);
 // open the writer
 FileStream fs = new FileStream(newFile, FileMode.Create, FileAccess.Write);
 PdfWriter writer = PdfWriter.GetInstance(document, fs);
 document.Open();
 PdfContentByte cb = writer.DirectContent;
 BaseFont bf = BaseFont.CreateFont(BaseFont.COURIER_BOLD,BaseFont.CP1252, BaseFont.EMBEDDED);
 string text = "WV0501";
 cb.BeginText();
 // put the alignment and coordinates here
 cb.ShowTextAligned(2, text, 155, 655, 0);
 cb.EndText();
 // create the new page and add it to the pdf 
  PdfImportedPage page = writer.GetImportedPage(reader, 1);
  cb.AddTemplate(page, 0, 0);

 document.Close();
 fs.Close();
 writer.Close();

1 个答案:

答案 0 :(得分:4)

您没有向我们展示您的代码,因此我们必须猜测您的错误。

内容未显示:

您的代码中可能包含以下行:

PdfContentByte canvas = pdfStamper.GetUnderContent(page);

如果是这样,你应该用这一行替换它:

PdfContentByte canvas = pdfStamper.GetOverContent(page);

向我们展示您的代码后更新:

您想要将内容添加到现有文档,但您使用的是DocumentPdfWriter的组合。你为什么做这个?请阅读我的书的第6章,了解PdfStamper

现在,您首先添加文本,然后使用现有文档中的页面覆盖它。这意味着现有页面将覆盖文本。

你可以这样切换:

 // create the new page and add it to the pdf 
 PdfImportedPage page = writer.GetImportedPage(reader, 1);
 cb.AddTemplate(page, 0, 0);
 BaseFont bf = BaseFont.CreateFont(BaseFont.COURIER_BOLD,BaseFont.CP1252, BaseFont.EMBEDDED);
 string text = "WV0501";
 cb.BeginText();
 // put the alignment and coordinates here
 cb.ShowTextAligned(2, text, 155, 655, 0);
 cb.EndText();

现在文本将覆盖页面,但这并不意味着您的代码更好。您应该使用PdfStamper代替PdfWriter

PdfReader reader = new PdfReader(oldFile);
FileStream fs = new FileStream(newFile, FileMode.Create, FileAccess.Write);
PdfStamper stamper = new PdfStamper(reader, fs);
PdfContentByte canvas = stamper.GetOverContent(1);
BaseFont bf = BaseFont.CreateFont(BaseFont.COURIER_BOLD,BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
ColumnText.ShowTextAligned(
        canvas,
        Element.ALIGN_RIGHT, 
        new Phrase("WV0501", new Font(bf, 9)), 
        155, 655, 0
    );
stamper.Close();

你不同意这更优雅吗?

重要:

在您的代码中使用:

BaseFont bf = BaseFont.CreateFont(BaseFont.COURIER_BOLD,BaseFont.CP1252, BaseFont.EMBEDDED);

但是,这没有多大意义:COURIER_BOLD是标准类型1字体之一,因此忽略embedded参数。我将其更改为NOT_EMBEDDED,因为如果您使用EMBEDDED开发人员阅读您的代码并且对PDF和iText一无所知可能会感到困惑。他们可能会问:当参数显示它应该嵌入时,为什么字体没有被嵌入?

BaseFont bf = BaseFont.CreateFont(BaseFont.COURIER_BOLD,BaseFont.CP1252, BaseFont.NOT_EMBEDDED);

从右侧写作:

您使用数字2定义对齐方式。我建议您不要在代码中使用数字,而应使用常量:ALIGN_RIGHT。这样,我们就会看到您想要正确对齐文本。

文本与您定义的坐标对齐:

x = 155
y = 655

如果您对文本的位置不满意,则应更改这些硬编码坐标。例如:增加x并减少y

您可能希望文本相对于表格单元格或图像的边框。如果是这种情况,则不应对坐标进行硬编码。 在SO上的另一个问题中讨论了检索图像的坐标。检索表的坐标可能是不可能的。这完全取决于原始PDF的性质。