2016-11-08 10 views
1

나는 윈도우 응용 프로그램 8.1 (윈도우 전화가 아님)에서 pdf 파일을 생성하려고하는데, pdf를 생성하기위한 무료 패키지를 찾지 못하여 포스트 스크립트를 사용하여 시도했다. 있다면 알려주세요. 여기 PDF 생성 Windows 응용 프로그램에서 8.1

내가 포스트 스크립트를 사용하여 시도 샘플 코드,

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 파일을 생성하지만, 어도비 리더와 같은 파일을 여는하면서주고있다이다 빈 출력 ..

또 다른 해결책 나는 PDFDocument를 사용하여 시도했지만 그 역시 동일한 문제가 발생합니다.

제발 도와주세요. 응답을 기다리고 있습니다.

감사의 말

+0

으로 진행하는 [Rotativa] (https://github.com/webgio/Rotativa)가 도움이 될 수도에보고 한 것으로 충분히 의심! –

+0

Itextsharp는 PDF 조작을위한 좋은 라이브러리입니다 – lyz

+0

코드가 포스트 스크립트, PDF를 생성하지 않습니다. 중요한 차이점이 있습니다! PostScirpt (Windows 자체가 인쇄 시스템에서 할 수있는 PostScirpt)를 생성 할 수 있다면 Ghostscript는 그로부터 PDF 파일을 생성 할 수 있습니다. PDF 파일을 잘못 작성한 이유는 어디에도 적어 두지 않았기 때문입니다. 대중에게 어딘가에 게시하고 아마도 내가 그에게 잘못된 점을 말할 수 있습니다. – KenS

답변

1

확인 여기에는 많은 문제가 있습니다. 사소한 점은 파일이 시작되기 전에 파일에 3 바이트의 가비지 바이너리가 있다는 것입니다. 아마도 이것은 UTF BOM 또는 뭔가입니다. PDF 독자는 그것을 건너 뛰기로되어 있지만 올바른 가치는 있습니다. 은 0xEF 0xbb 경계에서 0xBF는 0x25로 0 × 50 내가보기 바이너리 편집기로 파일을 시작 열기 ....

것은 두 번째로 외부 참조가 잘못되었습니다 당신은 1에서 상호 참조 조항 것을 시작

xref 
1 7 
0000000020 65536 n 
0000000079 00000 n 
0000000149 00000 n 
0000000382 00000 n 
0000000489 00000 n 
0000000595 00000 n 
0000000703 00000 n 

, 당신은 해야지 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 

그 항목 0 무료 항목의 연결리스트의 머리이기 때문에 무료 표시되어, 0에서 7까지 번호가 매겨진 8 개 항목을이다 : 외부 참조 처럼 보일 것이다.

각 항목 길이를 맞춰 주신 것을 축하드립니다. 많은 사람들이 넘어지는 것이 잘못되었습니다.

당연한 결과이다 트레일러 사전의/크기 항목 8하지 7되어야한다는 (오브젝트 7)는 63 바이트의 길이를 갖는 것으로 선언된다

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

콘텐츠 스트림 사실 반면 그것의 115 바이트.

컨텐츠 스트림이 포함되어 '는 외부가 그 문제를 해결 제거

(testlist demo1)' Tj 

. (지금은) 당신이 XObject에 사용하려고했습니다

마지막 :

/Img1 Do 

을하지만 당신은 페이지의 자료 사전에 XObject에 'IMG1'를 선언하지 않은, 사실 당신이 정의되지 않은 파일 내의 어느 곳에서나 XObject를 사용하므로 간단히 작동하지 않습니다.

나는 그 :-)

+0

당신의 노력에 감사드립니다 ... 나는 당신이 제안한대로 교정을했지만 첫 번째 포인트를 얻지 못했습니다 .. 다른 문제를 해결 한 후에도 설명 할 수 없기 때문에 설명하거나 해결 방법을 알려주십시오. 어도비 리더에서 엽니 다. –

+0

첫 번째 점은 헤더 또는 외부 참조 테이블 앞에있는 바이트를 의미합니까? 다른 문제도있을 수 있습니다. 그것들은 지금까지 내가 발견 한 것들입니다. ... – KenS

+0

나는 헤더 앞에 ... 바이트를 의미합니다 ... xref 나는 그것을 고쳤습니다 ... –