2015-12-26 52 views
2

我使用下面的代码内容:添加印记/水印/过PDF使用iTextSharp的

PdfReader PDFReader = new PdfReader("C:\\file.pdf"); 

FileStream Stream = new FileStream("C:\\new.pdf", FileMode.Create, FileAccess.Write); 

PdfStamper PDFStamper = new PdfStamper(PDFReader, Stream); 

for (int iCount = 0; iCount < PDFStamper.Reader.NumberOfPages; iCount++) 
{ 
    PdfContentByte PDFData = PDFStamper.GetOverContent(iCount + 1); 
    BaseFont baseFont = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.WINANSI, BaseFont.EMBEDDED); 
    PDFData.BeginText(); 
    PDFData.SetColorFill(CMYKColor.LIGHT_GRAY); 
    PDFData.SetFontAndSize(baseFont, 80); 
    PDFData.ShowTextAligned(PdfContentByte.ALIGN_CENTER, "SAMPLE DOCUMENT", 300, 400, 45); 
    PDFData.EndText(); 
} 

Stream.Close(); 
PDFReader.Close(); 
PDFStamper.Close(); 

PDFStamper.Close();抛出错误。此外,我不知道是否在PDFStamper.Close();

之前或之后拨打PDFReader.Close();而PDF文件中未添加水印。

回答

2

您的通话Close顺序是完全错误的:

Stream.Close(); 
PDFReader.Close(); 
PDFStamper.Close(); 

特别是PDFStamper既需要PDFReaderStream仍然是打开的时候是越来越关闭它。

此外,除非抛出异常,否则在PDFStamper.Close()期间Stream自动关闭。

因此,使用

PDFStamper.Close(); 
PDFReader.Close(); 

代替。

如果您想确保Stream在异常情况下关闭,请使用using声明。

+0

谢谢,它现在工作正常。但是有一个问题,我希望我的文本出现在页面内部,它不覆盖整个页面,有时它比页面更小,有时更大。 –

+1

由于使用硬编码坐标('x = 300'和'y = 400'),您会得到此行为。你应该计算偏移量。请参阅[如何将图像水印添加到PDF文件?](http://itextpdf.com/question/how-add-image-watermark-pdf-file)在你的情况下,你也想检查'pagesize .getRight()'和'pageize.getTop()'来确定你的水印是否超出可用空间。另请参阅[如何相对于页面定位文本?](http://itextpdf.com/question/how-position-text-relative-page)这些是Java示例。你将不得不作出最小的改变,使这项工作在iTextSharp –

+0

@BrunoLowagie嗨布鲁诺Lowagie,感谢您的答复。我很荣幸能够与您交谈。我会尝试设置坐标。我试图以对角方式将水印放在PDF文件中作为“示例文档”。我相信你一定在许多文件中看到过这样的情况。我想把它从页面的左下角到右上角开始,而不管页面坐标等。所以,我会尝试使用一些数学来获得。并会查看你给出的链接。谢谢。 –