2013-05-02 106 views
4

我正在使用此方法将文本添加到已创建的pdf文档。 ITextSharp insert text to an existing pdf 基本上它使用PdfContentByte,然后将内容模板添加到页面。ITextSharp添加文本。一些文本没有显示

我发现在文件的某些区域中,文本不显示。 看来我正在添加的文本显示在已经在页面上的内容后面?我把PDF文件压缩成只是图像,但我仍然对扁平文件有同样的问题。

有没有人有任何问题添加文本被隐藏使用Itextsharp?

我使用DirectContentUnder也试图在这个环节无济于事建议.. iTextSharp hides text when write

这里是我使用的代码......有了这个,我试图在顶部基本覆盖方格纸PDF。在这个例子中,每个页面的左上角有一个框没有被填充。在这个地方的原始pdf中有一个图像。在第4页和第5页上,有些框没有填充,但它们似乎不是图像。

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(); 


// the pdf content 
PdfContentByte cb = writer.DirectContent; 


for (int i = 0; i < reader.NumberOfPages; i++) 
{ 
    document.NewPage(); 
    // select the font properties 
    BaseFont bf = BaseFont.CreateFont(BaseFont.HELVETICA_BOLD, BaseFont.CP1252, BaseFont.NOT_EMBEDDED); 

    cb.SetFontAndSize(bf, 4); 
    cb.SetColorStroke(BaseColor.GREEN); 
    cb.SetLineWidth(1f); 
    for (int j = 10; j < 600; j += 10) 
    { 
     WriteToDoc(ref cb, j.ToString(), j, 10);//Write the line number 
     WriteToDoc(ref cb, j.ToString(), j, 780);//Write the line number 
     if (j % 20 == 0) 
     { 
      cb.MoveTo(j, 20); 
      cb.LineTo(j, 760); 
      cb.Stroke(); 
     } 
    } 
    for (int j = 10; j < 800; j += 10) 
    { 

     WriteToDoc(ref cb, j.ToString(), 5, j);//Write the line number 
     WriteToDoc(ref cb, j.ToString(), 590, j);//Write the line number 
     if (j % 20 == 0) 
     { 
      cb.MoveTo(15, j); 
      cb.LineTo(575, j); 
      cb.Stroke(); 
     } 
    } 




// create the new page and add it to the pdf 
PdfImportedPage page = writer.GetImportedPage(reader, i + 1); 
cb.AddTemplate(page, 0, 0); 

} 

// close the streams and voilá the file should be changed :) 
document.Close(); 
fs.Close(); 
writer.Close(); 
reader.Close(); 

感谢您提供的任何帮助......我真的很感激它! -Greg

回答

4

首先:如果您试图基本上覆盖图纸上的PDF的顶部,为什么你先画出方格纸并加盖原页面上呢?您本质上是下方的方格纸,而不是上覆盖它。

根据页面内容的不同,您的方格纸可能很容易被覆盖。例如。如果页面内容中有填充矩形,则在结果的每个页面的左上角有一个框未填充。

因此,只需首先添加旧的页面内容,然后添加重叠更改。

这就是说,对于对现有PDF应用更改的任务,使用PdfWriterGetImportedPage并不理想。这实际上是PdfStamper类的一项任务,它用于在现有PDF上添加其他内容。

E.g.看看sample StampText,关键代码是:

PdfReader reader = new PdfReader(resource); 
using (var ms = new MemoryStream()) 
{ 
    using (PdfStamper stamper = new PdfStamper(reader, ms)) 
    { 
    PdfContentByte canvas = stamper.GetOverContent(1); 
    ColumnText.ShowTextAligned(canvas, Element.ALIGN_LEFT, new Phrase("Hello people!"), 36, 540, 0); 
    } 
    return ms.ToArray(); 
} 
+0

感谢您的帮助!我不太明白我使用的代码,并没有意识到我在新内容的顶部覆盖了页面内容。我只是移动了代码,将页面内容覆盖在我的所有绘图之上,现在它工作正常。将来我还会检查一下PdfStamper。 – smithygreg 2013-05-02 14:56:33

+0

@smithygreg你可以请发表新的代码或更改代码 – 2015-01-02 08:49:35