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