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,所以这根本行不通。

我想这足以继续 :-)