2016-11-08 107 views
1

我想在Windows应用程序8.1(不Windows电话)C#生成PDF文件,我已经尝试使用后记,因为我没有找到任何免费的软件包来生成PDF。如果有请让我知道。PDF生成在Windows应用程序8.1

这是我所使用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"); 
      } 

是的,它工作正常,并产生正常工作在微软边缘的PDF,但同时打开相同的文件使用Adobe Reader它给空白输出..

另一个解决方案我已经尝试使用PDFDocument,但在那也是我越来越同样的问题。

请帮帮我。等待回应。

提前致谢

+0

事情都看在[Rotativa(https://github.com/webgio/Rotativa),它可能会帮助! –

+0

Itextsharp是一个很好的PDF操作库 – lyz

+0

你的代码不会生成PostScript,它的PDF有很大的不同!如果您可以生成PostScirpt(Windows本身可以从打印系统执行),那么Ghostscript可以从中创建一个PDF文件。我无法真正告诉你你制作的PDF文件有什么问题,因为你没有把它放在任何地方。将它张贴在公开的地方,可能我可以告诉你它有什么问题。 – KenS

回答

1

确定这里有很多问题。一个小问题是你的文件在文件开始前有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应该是自由对象链表的头部。请参阅PDF参考页93。外部参照应该看起来像:

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是免费条目的链表的头,所以被标记为空闲。

恭喜您获得每个条目的长度是正确的,这是许多人摔倒的错。

的必然结果是在拖车字典/尺寸条目应为8,而不是7:

trailer 
<< 
    /Size 8 
    /Root 1 0 R 
>> 

(对象7)被声明为具有63个字节的长度的内容流,而实际上它的115个字节。

内容流包含:

(testlist demo1)' Tj 

去除多余的“解决这个问题。

最后(现在)你试图使用一个X对象:

/Img1 Do 

可是你有没有声明的X对象在页面的资源字典“IMG1”,而事实上你还没有定义XObject在文件中的任何地方,所以这根本不起作用。

我怀疑这是足以与:-)

+0

感谢您的努力......我按照您的建议进行了更正,但没有得到第一点。请您解释或告诉我如何解决它,因为在解决其他问题后仍然无法解决在Adobe Reader中打开。 –

+0

第一点,你的意思是头部或外部参照表之前的字节?也许还有其他问题,那些是我目前发现的那些... – KenS

+0

我的意思是头部之前的字节...外部参照我修正了它... –

相关问题