ItextSharp 异常:文档没有目录对象(意思是:它是一个无效的 PDF)

ItextSharp exception: The document has no catalog object (meaning: it's an invalid PDF)

Rectangle rec = new Rectangle(766, 1500);
Document document = new Document(rec);
document.SetMargins(22, 22, 22, 22);
string pdfPath = Server.MapPath("~/Export/" + strAccount + "/Exports/" + strAgentID) + "/" + strReportName + ".pdf";
PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(pdfPath, FileMode.OpenOrCreate));
document.Open();

HtmlPipelineContext htmlContext = new HtmlPipelineContext(null);

htmlContext.SetTagFactory(Tags.GetHtmlTagProcessorFactory());

var cssResolver //= new StyleAttrCSSResolver(cssFiles);
    = XMLWorkerHelper.GetInstance().GetDefaultCssResolver(true);

var pipeline =

    new CssResolverPipeline(cssResolver,

            new HtmlPipeline(htmlContext,

                new PdfWriterPipeline(document, writer)));

XMLWorker worker = new XMLWorker(pipeline, true);

XMLParser p = new XMLParser(worker);

TextReader tr = new StringReader(htmlFileData);
p.Parse(tr);
document.Close();

//********************* Add text watermark for pdf created above ************************************************************

string strPDFPath = Server.MapPath("~/Export" + "/" + strAccount + "/Exports/" + strAgentID + "/" + strReportName + ".pdf");
PdfReader pdfReader = new PdfReader(strPDFPath);
FileStream stream = new FileStream(strPDFPath, FileMode.OpenOrCreate);
PdfStamper pdfStamper = new PdfStamper(pdfReader, stream);
for (int pageIndex = 1; pageIndex <= pdfReader.NumberOfPages; pageIndex++)
{
    Rectangle pageRectangle = pdfReader.GetPageSizeWithRotation(pageIndex);
    PdfContentByte pdfData = pdfStamper.GetUnderContent(pageIndex);
    pdfData.SetFontAndSize(BaseFont.CreateFont(BaseFont.HELVETICA_BOLD, BaseFont.CP1252, BaseFont.NOT_EMBEDDED), 40);
    PdfGState graphicsState = new PdfGState();
    graphicsState.FillOpacity = 0.4F;
    pdfData.SetGState(graphicsState);
    pdfData.SetColorFill(BaseColor.BLUE);
    pdfData.BeginText();
    pdfData.ShowTextAligned(Element.ALIGN_CENTER, "FOR BETA TEST ONLY", pageRectangle.Width / 2, pageRectangle.Height / 2, 45);
    pdfData.EndText();
}
pdfStamper.Close();
stream.Close(); 

//******************************************************************************

在上面的代码中,pdf创建成功,但在我们尝试添加水印的块中出现异常。 在水印分配块中,strPDFPath 以如下形式给出准确的路径 D:\MyTestProject\Reports\Export\SIP\Exports\BEEC1308\1004MC_RevA.pdf 这是文件的确切位置。如果我打开这个 浏览器中的路径,然后我得到正确的 PDF。但是当我使用读取文件路径时 PdfReader pdfReader = new PdfReader(strPDFPath); 提高了上面提到的 exception。上面的代码哪里出错了,或者是否需要在单个块中组合水印和 PDF 创建。

您正在同时读取和写入同一个 PDF。我假设不是这个:

//Incorrect
PdfReader pdfReader = new PdfReader(strPDFPath);

您想这样做:

//Correct
PdfReader pdfReader = new PdfReader(pdfPath);