C# 使用iTextSharp在PDF上添加戳记/水印/内容

C# 使用iTextSharp在PDF上添加戳记/水印/内容,c#,itextsharp,C#,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 < PDFSt

我正在使用以下代码:

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();
PdfReader PdfReader=newpdfreader(“C:\\file.pdf”);
FileStream Stream=新FileStream(“C:\\new.pdf”,FileMode.Create,FileAccess.Write);
PdfStamper PdfStamper=新的PdfStamper(PDFReader,流);
对于(int-iCount=0;iCount
但是
PDFStamper.Close()抛出错误。另外,我不确定是否调用
PDFReader.Close()
PDFStamper.Close()之前或之后


PDF文件中未添加水印。

您的
关闭
调用顺序完全错误:

Stream.Close();
PDFReader.Close();
PDFStamper.Close();
尤其是
PDFStamper
要求
PDFReader
流在关闭时仍处于打开状态

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

因此,使用

PDFStamper.Close();
PDFReader.Close();
相反


如果要确保在出现异常时关闭
,请使用
using
语句。

谢谢,它现在工作正常。但有一个问题,我想让我的文本出现在页面内部,它没有覆盖整个页面,有时比页面小,有时比页面大。你会出现这种行为,因为你使用的是硬编码坐标(
x=300
y=400
)。你应该计算偏移量。例如,在您的案例中,您还需要检查
pagesize.getRight()
pagesize.getTop()
,以确定水印是否超出了可用空间。另请参见以下Java示例。您必须进行最小的更改才能使其正常工作iTextSharp@BrunoLowagie你好,布鲁诺·洛瓦吉,谢谢你的回复。我很荣幸能和你讲话。我将尝试设置坐标。我试图把一个水印对角线的方式作为“样本文件”在PDF文件。我相信你一定在许多文件中看到过这样的情况。我想让它精确地从页面的左下角到右上角,而不考虑页面坐标等。所以,我将尝试使用一些数学来获得。并将调查您提供的链接。谢谢。@ComputerUser您还需要检查
pagesize.getRight()
pagesize.getTop()
以确定水印是否超出了可用空间。-同时检查
pagesize.Left
pagesize.Bottom
:它们不必是
0
(即使它们经常是)!pagesize.getTop(0)与pagesize.Top相同吗?对于其他坐标,如pagesize.getLeft(0)和pagesize.Left?-对方法
GetTop(float)
允许您自动将
margin
值应用于边框,对于
0
的边距,您将获得原始边框。