在页面中嵌入PDF字节流的问题

4
我正在服务器上生成内存中的PDF,并希望将结果作为字节流发送,以便在网页上显示为PDF。但是似乎我没有做好一切准备,因为主流浏览器都无法正确显示PDF。我尝试了嵌入式(embed)、对象(object)和iframe标签,但无法使其正常工作。
以下是从IE页面复制的嵌入式版本:

<embed width="100%" height="100%" src="data:application/pdf,%PDF-1.4 %ÓôÌá 1 0 obj << /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)) >> endobj 2 0 obj << /Type/Catalog /Pages 3 0 R >> endobj 3 0 obj << /Type/Pages /Count 1 /Kids[4 0 R] >> endobj 4 0 obj << /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 >> /Font << /F0 8 0 R >> >> /Group << /CS/DeviceRGB /S/Transparency /I false /K false >> >> endobj 5 0 obj << /Length 98 /Filter/FlateDecode >> stream x+ä2T0�B]eni¤ d(Tqr9pé»(¤sé»ÅÓ¸L,ôÌÍML ôÌ,BR4> endobj 7 0 obj << /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 >> endobj 8 0 obj << /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

这个文档只包含"Hello, World!",并且使用C#中的File.ReadAllBytes(...)函数直接从一个实际的PDF文件中读取。

1个回答

12

您缺少了一步。嵌入的PDF需要进行编码。

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

然后,我将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。

embedded PDF

我建议尝试类似的过程将您的PDF编码为base64,并像上面一样嵌入。

这个可以工作!谢谢!实际上,字节流已经是base64编码的了,但我以为我需要将它(用atob)转换回ASCII码。这在Chrome和Firefox中完全正常,但由于某种原因IE拒绝显示它。我得开始查看IE选项了。 - Bob
还尝试了使用object标签,在IE上效果类似 :-| <object width="100%" type="application/pdf" height="100%" data="data:application/pdf;base64,...>示例PDF</object> - dwarring
我将其作为新查询输入。 - Bob
我放弃了。现在我将PDF文件作为真实文件放入可访问的位置,只需打开一个指向它的新标签页即可。 - Bob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接