【问题标题】:Issue while generating pdf files when working on a mobile browser在移动浏览器上工作时生成 pdf 文件时出现问题
【发布时间】:2023-04-01 08:11:02
【问题描述】:

我在移动浏览器上生成 pdf 文件时遇到以下问题。文件在某些​​移动浏览器上已损坏,而在某些移动浏览器中下载但未显示文本,它仅显示文件中的图像。同时在桌面浏览器上工作时文件生成完美,下载时文件内容完美显示。我不知道背后的真正原因,因为我是开发 Web 应用程序的新手。

我使用的代码如下:

Document pdfDoc = new Document(PageSize.A4, 10, 10, 10, 10);
PdfWriter pdfWriter = PdfWriter.GetInstance(pdfDoc,         Response.OutputStream);
pdfDoc.Open();
string imageUrl = Server.MapPath("~/logo//bcetlogo.jpg");
iTextSharp.text.Image ImageLogo =    iTextSharp.text.Image.GetInstance(imageUrl);
ImageLogo.ScaleToFit(80f, 80f);
pdfDoc.Add(ImageLogo);
Font f = FontFactory.GetFont("Arial", 15);
string title = "HelloWorld";
Paragraph text1 = new Paragraph(title, f);
pdfDoc.Add(text1);
pdfWriter.CloseStream = false;
pdfWriter.Close();
Response.Buffer = true;
Response.ContentType = "application/octet-stream";
Response.AddHeader("Content-Disposition", "attachment;filename=Example.PDF");
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Write(pdfDoc);
Response.End();

【问题讨论】:

  • 亲爱的@AbhinandanKumar,我的回答有问题吗?您是否有机会尝试提出的解决方案?对你有帮助吗?

标签: c# asp.net pdf itextsharp


【解决方案1】:

这肯定是错误的:

Response.Write(pdfDoc);

pdfDoc 对象是 Document 类型,Response.Write() 需要字节,而不是 Document 对象。您声称这在某些情况下有效的说法是不正确的。

您还需要删除这两行:

pdfWriter.CloseStream = false;
pdfWriter.Close();

用这一行替换它们:

pdfDoc.Close();

在此处阅读有关 PDF 创建过程中 5 个步骤的更多信息:Getting started。你从哪里得到你的代码?你能保证你再也不会看那个文档吗?始终使用official web site

当您执行pdfDoc.Close() 时,PDF 就完成了。所有侦听DocumentDocListener 实例均已关闭。在您的情况下,侦听 pdfDocDocListener 实例是您不知道的 PdfDocument 实例,因为它仅在内部使用。关闭这个PdfDocument 实例很重要,因为在那个close() 操作中,大量内容被刷新。您可以通过关闭 pdfWriter 而不是 pdfDoc 来跳过此步骤。

您还可以保持内容流打开。这是个坏主意。内容流应关闭。直接使用Response.OutputStream 时存在一些已知问题。最好使用MemoryStream,就像在回答这个问题时所做的那样:iTextSharp is producing a corrupt PDF with Response

如果你好好研究这个答案,你会看到:

byte[] bytes = memoryStream.ToArray();
Response.Clear();
Response.ContentType = "application/pdf";
Response.AddHeader("Content-Disposition", "attachment;filename=ControleDePonto.pdf");
Response.Buffer = true;
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.BinaryWrite(bytes);
Response.End();

如您所见,您需要BinaryWrite() 方法,而该方法需要byte[]。除了代码中的许多其他错误之外,您的主要错误是您将 Document 对象传递给了 Write() 方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-29
    • 2011-11-17
    • 2021-12-25
    • 1970-01-01
    • 2014-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多