Windows 应用 8.1 中的 PDF 生成
PDF Generation In Windows app 8.1
我正在尝试在 windows app 8.1(不是 windows phone)c# 中生成 pdf 文件,我尝试使用后记,因为我没有找到任何生成pdf的免费包。如果有请告诉我。
这是我尝试使用 postscript 的示例代码,
var file = await ApplicationData.Current.LocalFolder.CreateFileAsync("MyFirstPdf.pdf", Windows.Storage.CreationCollisionOption.ReplaceExisting);
using (var stream = await System.IO.WindowsRuntimeStorageExtensions.OpenStreamForWriteAsync(file))
{
using (var writer = new System.IO.StreamWriter(stream, System.Text.Encoding.UTF8))
{
List<long> xrefs = new List<long>();
writer.WriteLine("%PDF-1.7");
writer.Write("%");
writer.Flush();
byte[] bytes = { 0, 0, 0, 0 };
stream.Write(bytes, 0, 4);
stream.Flush();
writer.WriteLine("");
writer.Flush();
stream.Flush();
xrefs.Add(stream.Position);
writer.WriteLine("1 0 obj");
writer.WriteLine("<<");
writer.WriteLine(" /Type /Catalog");
writer.WriteLine(" /Pages 2 0 R");
writer.WriteLine(">>");
writer.WriteLine("endobj");
writer.Flush();
stream.Flush();
xrefs.Add(stream.Position);
writer.WriteLine("2 0 obj");
writer.WriteLine("<<");
writer.WriteLine(" /Type /Pages");
writer.WriteLine(" /Kids [3 0 R]");
writer.WriteLine(" /Count 1");
writer.WriteLine(">>");
writer.WriteLine("endobj");
writer.Flush();
stream.Flush();
xrefs.Add(stream.Position);
writer.WriteLine("3 0 obj");
writer.WriteLine("<<");
writer.WriteLine(" /Type /Page");
writer.WriteLine(" /Parent 2 0 R");
writer.WriteLine(" /MediaBox [0 0 612 792]");
// Default userspace units: 72/inch, origin at bottom left
writer.WriteLine(" /Resources");
writer.WriteLine(" <<");
writer.WriteLine(" /ProcSet [/PDF/Text]");
// This PDF uses only the Text ability
writer.WriteLine(" /Font");
writer.WriteLine(" <<");
writer.WriteLine(" /F0 4 0 R");
// I will define three fonts, #4, #5 and #6
writer.WriteLine(" /F1 5 0 R");
writer.WriteLine(" /F2 6 0 R");
writer.WriteLine(" >>");
writer.WriteLine(" >>");
writer.WriteLine(" /Contents 7 0 R");
writer.WriteLine(">>");
writer.WriteLine("endobj");
writer.Flush();
stream.Flush();
xrefs.Add(stream.Position);
writer.WriteLine("4 0 obj");
writer.WriteLine("<<");
writer.WriteLine(" /Type /Font");
writer.WriteLine(" /Subtype /Type1");
writer.WriteLine(" /Encoding /WinAnsiEncoding");
writer.WriteLine(" /BaseFont /Times-Roman");
writer.WriteLine(">>");
writer.Flush();
stream.Flush();
xrefs.Add(stream.Position);
writer.WriteLine("5 0 obj");
writer.WriteLine("<<");
writer.WriteLine(" /Type /Font");
writer.WriteLine(" /Subtype /Type1");
writer.WriteLine(" /Encoding /WinAnsiEncoding");
writer.WriteLine(" /BaseFont /Times-Bold");
writer.WriteLine(">>");
writer.Flush();
stream.Flush();
xrefs.Add(stream.Position);
writer.WriteLine("6 0 obj");
writer.WriteLine("<<");
writer.WriteLine(" /Type /Font");
writer.WriteLine(" /Subtype /Type1");
writer.WriteLine(" /Encoding /WinAnsiEncoding");
writer.WriteLine(" /BaseFont /Times-Italic");
writer.WriteLine(">>");
writer.Flush();
stream.Flush();
xrefs.Add(stream.Position);
System.Text.StringBuilder sb = new System.Text.StringBuilder();
//Lables
sb.AppendLine("BT");
sb.AppendLine("/F0 15 Tf");
sb.AppendLine("20 TL");
sb.AppendLine("30.0 760.0 Td");
sb.AppendLine("(testlist demo1)' Tj");
sb.AppendLine("ET");
writer.WriteLine("7 0 obj");
writer.WriteLine("<<");
writer.WriteLine(" /Length " + sb.Length);
writer.WriteLine(">>");
writer.WriteLine("stream");
writer.Write(sb.ToString());
writer.WriteLine(" q"); //added
writer.WriteLine(" 156 0 0 272 100 200 cm");
writer.WriteLine(" /Img1 Do");
writer.WriteLine(" Q");
writer.WriteLine("endstream");
writer.WriteLine("endobj");
writer.Flush();
stream.Flush();
dynamic xref_pos = stream.Position;
writer.WriteLine("xref");
writer.WriteLine("1 " + xrefs.Count);
long xref = 0;
foreach (long xref_loopVariable in xrefs)
{
xref = xref_loopVariable;
writer.WriteLine("{0:0000000000} {1:00000} n", xref, 0);
}
// PDF-TRAILER. Every PDF ends with this trailer.
writer.WriteLine("trailer");
writer.WriteLine("<<");
writer.WriteLine(" /Size " + xrefs.Count);
writer.WriteLine(" /Root 1 0 R");
writer.WriteLine(">>");
writer.WriteLine("startxref");
writer.WriteLine(xref_pos);
writer.WriteLine("%%EOF");
}
是的,它工作正常并生成在 Microsoft Edge 中正常工作的 pdf,但是当用 adobe 打开同一个文件时 reader 它给出空白输出..
我尝试使用 PDFDocument 的另一个解决方案,但我也遇到了同样的问题。
请帮帮我。等待响应。
提前致谢
OK 这里有很多问题。一个小问题是您的文件在文件开始之前有 3 个字节的垃圾二进制文件。可能这是 UTF BOM 或其他东西。 PDF 阅读器应该跳过它,但它值得做对。用二进制编辑器打开文件,我看到它开始于 0xEF 0xBB 0xBF 0x25 0x50....
其次,外部参照不正确:
xref
1 7
0000000020 65536 n
0000000079 00000 n
0000000149 00000 n
0000000382 00000 n
0000000489 00000 n
0000000595 00000 n
0000000703 00000 n
您从 1 开始那个交叉引用小节,您应该从 0 开始它,并且 0 应该是自由对象链表的头部。请参阅第 93 页之后的 PDF 参考页。外部参照 应该 看起来像:
xref
0 8
0000000000 00000 f
0000000020 00000 n
0000000079 00000 n
0000000149 00000 n
0000000382 00000 n
0000000489 00000 n
0000000595 00000 n
0000000703 00000 n
所以这是 8 个条目,编号从 0 到 7,条目 0 是空闲条目链表的头部,因此被标记为空闲。
恭喜你把每个词条的长度弄对了,这个错误很多人都犯过。
推论是预告片字典中的 /Size 条目应该是 8,而不是 7:
trailer
<<
/Size 8
/Root 1 0 R
>>
内容流(对象 7)被声明为具有 63 字节的长度,而实际上它的长度为 115 字节。
内容流包含:
(testlist demo1)' Tj
删除无关的 ' 即可解决该问题。
您终于(暂时)尝试使用 XObject:
/Img1 Do
但是您还没有在页面的 Resources 字典中声明 XObject 'Img1',事实上您还没有在文件的任何地方定义 XObject,所以这根本行不通。
我想这足以继续 :-)
我正在尝试在 windows app 8.1(不是 windows phone)c# 中生成 pdf 文件,我尝试使用后记,因为我没有找到任何生成pdf的免费包。如果有请告诉我。
这是我尝试使用 postscript 的示例代码,
var file = await ApplicationData.Current.LocalFolder.CreateFileAsync("MyFirstPdf.pdf", Windows.Storage.CreationCollisionOption.ReplaceExisting);
using (var stream = await System.IO.WindowsRuntimeStorageExtensions.OpenStreamForWriteAsync(file))
{
using (var writer = new System.IO.StreamWriter(stream, System.Text.Encoding.UTF8))
{
List<long> xrefs = new List<long>();
writer.WriteLine("%PDF-1.7");
writer.Write("%");
writer.Flush();
byte[] bytes = { 0, 0, 0, 0 };
stream.Write(bytes, 0, 4);
stream.Flush();
writer.WriteLine("");
writer.Flush();
stream.Flush();
xrefs.Add(stream.Position);
writer.WriteLine("1 0 obj");
writer.WriteLine("<<");
writer.WriteLine(" /Type /Catalog");
writer.WriteLine(" /Pages 2 0 R");
writer.WriteLine(">>");
writer.WriteLine("endobj");
writer.Flush();
stream.Flush();
xrefs.Add(stream.Position);
writer.WriteLine("2 0 obj");
writer.WriteLine("<<");
writer.WriteLine(" /Type /Pages");
writer.WriteLine(" /Kids [3 0 R]");
writer.WriteLine(" /Count 1");
writer.WriteLine(">>");
writer.WriteLine("endobj");
writer.Flush();
stream.Flush();
xrefs.Add(stream.Position);
writer.WriteLine("3 0 obj");
writer.WriteLine("<<");
writer.WriteLine(" /Type /Page");
writer.WriteLine(" /Parent 2 0 R");
writer.WriteLine(" /MediaBox [0 0 612 792]");
// Default userspace units: 72/inch, origin at bottom left
writer.WriteLine(" /Resources");
writer.WriteLine(" <<");
writer.WriteLine(" /ProcSet [/PDF/Text]");
// This PDF uses only the Text ability
writer.WriteLine(" /Font");
writer.WriteLine(" <<");
writer.WriteLine(" /F0 4 0 R");
// I will define three fonts, #4, #5 and #6
writer.WriteLine(" /F1 5 0 R");
writer.WriteLine(" /F2 6 0 R");
writer.WriteLine(" >>");
writer.WriteLine(" >>");
writer.WriteLine(" /Contents 7 0 R");
writer.WriteLine(">>");
writer.WriteLine("endobj");
writer.Flush();
stream.Flush();
xrefs.Add(stream.Position);
writer.WriteLine("4 0 obj");
writer.WriteLine("<<");
writer.WriteLine(" /Type /Font");
writer.WriteLine(" /Subtype /Type1");
writer.WriteLine(" /Encoding /WinAnsiEncoding");
writer.WriteLine(" /BaseFont /Times-Roman");
writer.WriteLine(">>");
writer.Flush();
stream.Flush();
xrefs.Add(stream.Position);
writer.WriteLine("5 0 obj");
writer.WriteLine("<<");
writer.WriteLine(" /Type /Font");
writer.WriteLine(" /Subtype /Type1");
writer.WriteLine(" /Encoding /WinAnsiEncoding");
writer.WriteLine(" /BaseFont /Times-Bold");
writer.WriteLine(">>");
writer.Flush();
stream.Flush();
xrefs.Add(stream.Position);
writer.WriteLine("6 0 obj");
writer.WriteLine("<<");
writer.WriteLine(" /Type /Font");
writer.WriteLine(" /Subtype /Type1");
writer.WriteLine(" /Encoding /WinAnsiEncoding");
writer.WriteLine(" /BaseFont /Times-Italic");
writer.WriteLine(">>");
writer.Flush();
stream.Flush();
xrefs.Add(stream.Position);
System.Text.StringBuilder sb = new System.Text.StringBuilder();
//Lables
sb.AppendLine("BT");
sb.AppendLine("/F0 15 Tf");
sb.AppendLine("20 TL");
sb.AppendLine("30.0 760.0 Td");
sb.AppendLine("(testlist demo1)' Tj");
sb.AppendLine("ET");
writer.WriteLine("7 0 obj");
writer.WriteLine("<<");
writer.WriteLine(" /Length " + sb.Length);
writer.WriteLine(">>");
writer.WriteLine("stream");
writer.Write(sb.ToString());
writer.WriteLine(" q"); //added
writer.WriteLine(" 156 0 0 272 100 200 cm");
writer.WriteLine(" /Img1 Do");
writer.WriteLine(" Q");
writer.WriteLine("endstream");
writer.WriteLine("endobj");
writer.Flush();
stream.Flush();
dynamic xref_pos = stream.Position;
writer.WriteLine("xref");
writer.WriteLine("1 " + xrefs.Count);
long xref = 0;
foreach (long xref_loopVariable in xrefs)
{
xref = xref_loopVariable;
writer.WriteLine("{0:0000000000} {1:00000} n", xref, 0);
}
// PDF-TRAILER. Every PDF ends with this trailer.
writer.WriteLine("trailer");
writer.WriteLine("<<");
writer.WriteLine(" /Size " + xrefs.Count);
writer.WriteLine(" /Root 1 0 R");
writer.WriteLine(">>");
writer.WriteLine("startxref");
writer.WriteLine(xref_pos);
writer.WriteLine("%%EOF");
}
是的,它工作正常并生成在 Microsoft Edge 中正常工作的 pdf,但是当用 adobe 打开同一个文件时 reader 它给出空白输出..
我尝试使用 PDFDocument 的另一个解决方案,但我也遇到了同样的问题。
请帮帮我。等待响应。
提前致谢
OK 这里有很多问题。一个小问题是您的文件在文件开始之前有 3 个字节的垃圾二进制文件。可能这是 UTF BOM 或其他东西。 PDF 阅读器应该跳过它,但它值得做对。用二进制编辑器打开文件,我看到它开始于 0xEF 0xBB 0xBF 0x25 0x50....
其次,外部参照不正确:
xref
1 7
0000000020 65536 n
0000000079 00000 n
0000000149 00000 n
0000000382 00000 n
0000000489 00000 n
0000000595 00000 n
0000000703 00000 n
您从 1 开始那个交叉引用小节,您应该从 0 开始它,并且 0 应该是自由对象链表的头部。请参阅第 93 页之后的 PDF 参考页。外部参照 应该 看起来像:
xref
0 8
0000000000 00000 f
0000000020 00000 n
0000000079 00000 n
0000000149 00000 n
0000000382 00000 n
0000000489 00000 n
0000000595 00000 n
0000000703 00000 n
所以这是 8 个条目,编号从 0 到 7,条目 0 是空闲条目链表的头部,因此被标记为空闲。
恭喜你把每个词条的长度弄对了,这个错误很多人都犯过。
推论是预告片字典中的 /Size 条目应该是 8,而不是 7:
trailer
<<
/Size 8
/Root 1 0 R
>>
内容流(对象 7)被声明为具有 63 字节的长度,而实际上它的长度为 115 字节。
内容流包含:
(testlist demo1)' Tj
删除无关的 ' 即可解决该问题。
您终于(暂时)尝试使用 XObject:
/Img1 Do
但是您还没有在页面的 Resources 字典中声明 XObject 'Img1',事实上您还没有在文件的任何地方定义 XObject,所以这根本行不通。
我想这足以继续 :-)