在页面中嵌入 PDF 字节流时出现问题

问题描述 投票:0回答:2

我正在服务器上生成内存中的 PDF,并希望将结果作为字节流发送,以便在网页上显示为 PDF。我似乎没有把所有的事情都安排好,因为没有一个主要的浏览器能够正确显示 PDF。我尝试过嵌入、对象和 iframe 标签,但无法使其工作。

这是从 IE 页面复制的嵌入版本:

<
嵌入宽度=“100%”高度=“100%” src =“数据:应用程序/ pdf,%PDF-1.4 %ÓôÌá 1 0 对象 << /CreationDate(D:20151030142159-07'00') /Title(Created with PDFsharp) /Creator(PDFsharp 1.32.3057-g (www.pdfsharp.net)) /Producer(PDFsharp 1.32.3057-g (www.pdfsharp.net)) >> 结束对象 2 0 对象 << /Type/Catalog /Pages 3 0 R >> 结束对象 3 0 对象 << /Type/Pages /Count 1 /Kids[4 0 R] >> 结束对象 4 0 对象 << /Type/Page /MediaBox[0 0 612 792] /Parent 3 0 R /Contents 5 0 R /Resources << /ProcSet [/PDF/Text/ImageB/ImageC/ImageI] /ExtGState << /GS0 6 0 R >> /字体 << /F0 8 0 R >> >> /团体 << /CS/DeviceRGB /S/Transparency /I false /K false >> >> 结束对象 5 0 对象 << /Length 98 /Filter/FlateDecode >> 溪流 x+ä2T0�B] eni¤ d (Tq r9pé» (¤ sé» ÅÓ¸L,ôÌÍM L ôÌ, BR 4> 结束对象 7 0 对象 << /Type/FontDescriptor /Ascent 891 /CapHeight 662 /Descent -216 /Flags 32 /FontBBox[-547 -307 1401 1032] /ItalicAngle -16.333 /StemV 0 /XHeight 439 /FontName/TimesNewRoman,BoldItalic >> 结束对象 8 0 对象 << /Type/Font /Subtype/TrueType /BaseFont/TimesNewRoman,BoldItalic /Encoding/WinAnsiEncoding /FontDescriptor 7 0 R /FirstChar 0 /LastChar 255 /Widths[777 777 777 777 777 777 777 777 777 777 777 777 777 777 777 777 777 777 777 777 777 777 777 777 777 777 777 777 777 777 777 777 250 389 555 500 500 833 777 277 333 333 500 569 250 333 250 277 500 500 500 500 500 500 500 500 500 500 333 333 569 569 569 500 832 666 666 666 722 666 666 722 777 389 500 666 610 889 722 722 610 722 666 556 610 722 666 889 666 610 610 333 277 333 569 500 333 500 500 443 500 443 333 500 556 277 277 500 277 777 556 500 500 500 389 389 277 556 443 666 500 443 389 348 220 348 569 777 500 777 333 500 500 1000 500 500 333 1000 556 333 943 777 610 777 777 333 333 500 500 350 500 1000 333 1000 389 333 722 777 389 610 250 389 500 500 500 500 220 500 333 747 266 500 605 333 747 500 399 548 299 299 333 576 500 250 333 299 299 500 750 750 750 500 666 666 666 666 666 666 943 666 666 666 666 666 389 389 389 389 722 722 722 722 722 722 722 569 722 722 722 722 722 610 610 500 500 500 500 500 500 500 722 443 443 443 443 443 277 277 277 277 500 556 500 500 500 500 500 548 500 556 556 556 556 443 500 443] >> 结束对象 外部参照 0 9 0000000000 65535 f 0000000015 00000 n 0000000210 00000 n 0000000258 00000 n 0000000313 00000 n 0000000568 00000 n 0000000736 00000n 0000000779 00000 n 0000000981 00000 n 预告片 << /ID[<24C49FD36FB7C74593CB248B32E8A112><24C49FD36FB7C74593CB248B32E8A112>] /信息 1 0 R /根 2 0 R /尺寸 9 >> 启动外部参照 2178 %%EOF “类型=“应用程序/pdf” />

本文档仅包含“Hello, World!”并使用 C# 中的 File.ReadAllBytes(...) 直接从实际的 PDF 文件中获取。

html pdf stream
2个回答
12
投票

你错过了一步。嵌入的PDF需要编码。

以下内容来自类似的小型 PDF。我通过将 PDF 上传到网站http://www.motobit.com/util/base64-decoder-encoder.asp.

将其编码为 Base 64

然后我将 base64 结果粘贴到我的嵌入元素中,如下所示:

<embed width="100%" height="100%" src="data:application/pdf;base64,JVBERi0xLjMKJaWx6woxIDAgb2JqCjw8IC9UeXBlIC9DYXRhbG9nIC9QYWdlcyAyIDAgUiA+Pgpl
bmRvYmoKMiAwIG9iago8PCAvVHlwZSAvUGFnZXMgL0NvdW50IDEgL0tpZHMgWyAzIDAgUiBdIC9S
ZXNvdXJjZXMgPDwgL1BhdHRlcm4gPDwgL1B0MSA1IDAgUiA+PiAvUHJvY3NldCBbIC9QREYgL1Rl
eHQgXSA+PiA+PgplbmRvYmoKMyAwIG9iago8PCAvVHlwZSAvUGFnZSAvQ29udGVudHMgNCAwIFIg
L01lZGlhQm94IFsgMCAwIDIzMCAyMTAgXSAvUGFyZW50IDIgMCBSID4+CmVuZG9iago0IDAgb2Jq
Cjw8IC9MZW5ndGggNjE5ID4+CnN0cmVhbQoKcQowIEcKMSAxIDAgcmcKMjUgMTc1IDE3NSAtMTUw
IHJlCmYKL1BhdHRlcm4gY3MKL1B0MSBzY24KOTkuOTIgNDkuOTIgbQo5OS45MiA3Ny41MiA3Ny41
MiA5OS45MiA0OS45MiA5OS45MiBjCjIyLjMyIDk5LjkyIC0wLjA4IDc3LjUyIC0wLjA4IDQ5Ljky
IGMKLTAuMDggMjIuMzIgMjIuMzIgLTAuMDggNDkuOTIgLTAuMDggYwo3Ny41MiAtMC4wOCA5OS45
MiAyMi4zMiA5OS45MiA0OS45MiBjCkIKMjI0Ljk2IDQ5LjkyIG0KMjI0Ljk2IDc3LjUyIDIwMi41
NiA5OS45MiAxNzQuOTYgOTkuOTIgYwoxNDcuMzYgOTkuOTIgMTI0Ljk2IDc3LjUyIDEyNC45NiA0
OS45MiBjCjEyNC45NiAyMi4zMiAxNDcuMzYgLTAuMDggMTc0Ljk2IC0wLjA4IGMKMjAyLjU2IC0w
LjA4IDIyNC45NiAyMi4zMiAyMjQuOTYgNDkuOTIgYwpCCjg3LjU2IDIwMS43IG0KNjMuNjYgMTg3
LjkgNTUuNDYgMTU3LjMyIDY5LjI2IDEzMy40IGMKODMuMDYgMTA5LjUgMTEzLjY2IDEwMS4zIDEz
Ny41NiAxMTUuMSBjCjE2MS40NiAxMjguOSAxNjkuNjYgMTU5LjUgMTU1Ljg2IDE4My40IGMKMTQy
LjA2IDIwNy4zIDExMS40NiAyMTUuNSA4Ny41NiAyMDEuNyBjCkIKNTAgNTAgbQoxNzUgNTAgbAox
MTIuNSAxNTguMjUzIGwKYgpRCmVuZHN0cmVhbQplbmRvYmoKNSAwIG9iago8PCAvVHlwZSAvUGF0
dGVybiAvQkJveCBbIDAgMCAxMDAgMTAwIF0gL01hdHJpeCBbIDAuNCAwIDAgMC40IDAgMCBdIC9Q
YWludFR5cGUgMSAvUGF0dGVyblR5cGUgMSAvUmVzb3VyY2VzIDw8IC9Gb250IDw8IC9GMSA2IDAg
UiA+PiA+PiAvVGlsaW5nVHlwZSAyIC9YU3RlcCAxMDAgL1lTdGVwIDEwMCAvTGVuZ3RoIDE4MyA+
PgpzdHJlYW0KCnEKQlQKL0YxIDEgVGYKNjQgMCAwIDY0IDcuMTc3MSAyLjQ0MTQgVG0KMCBUYwow
IFR3CjEgMCAwIHJnCihcMjUzKSBUagowLjc0NzggLTAuMDA3IFRECjAgMSAwIHJnCihcMjUyKSBU
agotMC43MzIzIDAuNzgxMyBURAowIDAgMSByZwooXDI1MSkgVGoKMC42OTEzIDAuMDA3IFRECjAg
MCAwIHJnCihcMjUwKSBUagpFVApRCmVuZHN0cmVhbQplbmRvYmoKNiAwIG9iago8PCAvVHlwZSAv
Rm9udCAvU3VidHlwZSAvVHlwZTEgL0Jhc2VGb250IC9aYXBmRGluZ2JhdHMgPj4KZW5kb2JqCnhy
ZWYKMCA3CjAwMDAwMDAwMDAgNjU1MzUgZiAKMDAwMDAwMDAxNCAwMDAwMCBuIAowMDAwMDAwMDYz
IDAwMDAwIG4gCjAwMDAwMDAxODkgMDAwMDAgbiAKMDAwMDAwMDI3OCAwMDAwMCBuIAowMDAwMDAw
OTQ4IDAwMDAwIG4gCjAwMDAwMDEzNTAgMDAwMDAgbiAKdHJhaWxlcgo8PCAvUm9vdCAxIDAgUiAv
U2l6ZSA3ID4+CnN0YXJ0eHJlZgoxNDIzCiUlRU9G"/>

如果将以上内容另存为 html,然后用浏览器打开它,您应该会看到以下一页 PDF。

我建议尝试类似的过程,将 PDF 编码为 Base 64 并按上述方式嵌入。


0
投票

我意识到问题是关于使用 base64 编码嵌入 PDF,但问题是寻找一种使用字节流将内存中 PDF 发送到浏览器的方法。我为此苦苦挣扎了一段时间(在 C# 中)并提出了以下代码解决方案:

    [HttpGet("download/{id}/raw")]
    public ActionResult GetDownloadAttachmentRaw(long id)
    {
        var rules = BusinessRules.Rules.ExtractFrom(HttpContext);
        var attachment = rules.GetAttachment(id) ?? throw new Exception("Attachment not found");
        var fileBytes = System.IO.File.ReadAllBytes(GetFileName(attachment));
        var mimeType = attachment.MimeType ?? "application/octet-stream";
        return new FileContentResult(fileBytes, mimeType);
    }

当用户请求有效的 PDF 附件时,将从文件系统读取文件(读入内存),然后将 FileContentResult 返回给用户。这看起来很明显,但我首先使用 FileStreamResult(代码未显示)并且 HTML 正在下载文件而不显示它。

再次,我知道这不是问题的直接答案,但我认为这可能对其他人寻找 C# 解决方案来流式传输内存中 PDF 有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.