强制使用iTextSharp在现有pdf中插入文本中的新行

时间:2014-10-07 09:31:39

标签: c# pdf text itextsharp

所以,我已经看到了一个新创建的文档的例子

Rectangle r = new Rectangle(400, 300);
Document doc = new Document(r);

try
{
    PdfWriter.GetInstance(doc, new FileStream("C:/Blocks2.pdf", FileMode.Create));
    doc.Open();

    string text = @"The result can be seen below, which shows the text
      having been written to the document but it looks a
      mess. ";
    text = text.Replace(Environment.NewLine, String.Empty).Replace("  ", String.Empty);
    Font brown = new Font(Font.FontFamily.COURIER, 9f, Font.NORMAL, new BaseColor(163, 21, 21));
    Font lightblue = new Font(Font.FontFamily.COURIER, 9f, Font.NORMAL, new BaseColor(43, 145, 175));
    Font courier = new Font(Font.FontFamily.COURIER, 9f);
    Font georgia = FontFactory.GetFont("georgia", 10f);
    georgia.Color = BaseColor.GRAY;
    Chunk beginning = new Chunk(text, georgia);
    Phrase p1 = new Phrase(beginning);
    Chunk c1 = new Chunk("You can of course force a newline using \"", georgia);
    Chunk c2 = new Chunk(@"\n", brown);
    Chunk c3 = new Chunk("\" or ", georgia);
    Chunk c4 = new Chunk("Environment", lightblue);
    Chunk c5 = new Chunk(".NewLine", courier);
    Chunk c6 = new Chunk(", or even ", georgia);
    Chunk c7 = new Chunk("Chunk", lightblue);
    Chunk c8 = new Chunk(".NEWLINE", courier);
    Chunk c9 = new Chunk(" as part of the string you give a chunk.", georgia);
    Phrase p2 = new Phrase();
    p2.Add(c1);
    p2.Add(c2);
    p2.Add(c3);
    p2.Add(c4);
    p2.Add(c5);
    p2.Add(c6);
    p2.Add(c7);
    p2.Add(c8);
    p2.Add(c9);
    Paragraph p = new Paragraph();
    p.Add(p1);
    p.Add(p2);
    p.Alignment = Element.ALIGN_JUSTIFIED;

    doc.Add(p);
}

如您所见,文档以矩形Document doc = new Document(r);启动 所以,这段代码的结果就像这样

new document

我的问题是:我如何附加文本,这将考虑现有文档中的页面大小?

是否可以在文档中添加带文本的矩形?或者可以将新创建​​的文档附加到现有文档中?

我意识到,我应该阅读iText书籍,但我已经没时间了,这是我必须弄清楚的最后一件事。对我的问题,有一个干净的简单解决方案吗?谢谢

更新

可悲的是,出于某种原因,Alexis Pigeon的解决方案并不适合我。 我已经写过

Document doc = new Document();
var writer = PdfWriter.GetInstance(doc, new FileStream("C:/Blocks2.pdf", FileMode.Open));
doc.Open();

并在最后

doc.Add(p); doc.Close()

虽然代码运行顺畅,但不会对文件进行任何更改。 有些东西告诉我,这种方法是错误的,因为我还没有遇到任何代码示例,人们会使用Document和现有的pdf文件,只创建一个新的。通常是PDFStamperPDFWriter

所以,让我重新解释一下问题:如何将文字附加到现有文档以便填充某个矩形?

1 个答案:

答案 0 :(得分:2)

所以,在环顾四周后,我发现,我正在寻找的东西叫做“连字”。不知道这个词。 要使文本适合矩形区域,您需要创建一个包含一个单元格和不可见边框的表格。我也遇到了编码方面的问题。这是代码。:

        PdfReader pdf = new PdfReader("Test1.pdf");
        File.Delete("C:/Blocks.pdf");
        PdfStamper stp = new PdfStamper(pdf, new FileStream("C:/Blocks.pdf", FileMode.OpenOrCreate));

        var canvas = stp.GetOverContent(1);

        PdfPTable table = new PdfPTable(1);
        table.SetTotalWidth(new float[] { 100 });
        Phrase phrase = new Phrase();
        phrase.Hyphenation = new HyphenationAuto("ru", "RU", 2, 2);
        var bf = BaseFont.CreateFont("c:/windows/fonts/arialbd.ttf", "Cp1251", BaseFont.EMBEDDED);
        phrase.Add(new Chunk("О БОЖЕ ТЫ МОЙ НЕУЖЕЛИ РАБОТАЕТ ЕСЛИ РАБОТАЕТ Я БЫЛ БЫ ТАК СЧАСТЛИВ", new Font(bf, 12)));

        PdfPCell cell = new PdfPCell(phrase);
        cell.Border = Rectangle.NO_BORDER;
        table.AddCell(cell);
        table.WriteSelectedRows(0, 1, 200, 200, canvas);

        stp.Close();