在用uwp生成pdf的时候,发展此类类库有限,有的也需要钱,我最后实现pdf的底层方法生成pdf,代码如下

 private async void GeneratePdf()
{ var file = await ApplicationData.Current.LocalFolder.CreateFileAsync("uwpCSharp.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.2");
writer.Write("%");
writer.Flush();
byte[] bytes = { , , , };
stream.Write(bytes, , );
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"); // #2: 页面列表 - 我们只有一页文字
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"); // #3: 页面 - 这里放文字、资源等
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]");
// 默认的用户空间: 72/inch
writer.WriteLine(" /Resources");
writer.WriteLine(" <<");
writer.WriteLine(" /ProcSet [/PDF/Text]");
// 这个pdf只有文本
writer.WriteLine(" /Font");
writer.WriteLine(" <<");
writer.WriteLine(" /F0 4 0 R");
// 定义的三种字体, #4, #5 和 #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"); // #4, #5, #6: 三钟字体,我们使用pdf默认字体
//使用WinAnsi字符编码,定义如下
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(">>"); // #7:内容页面。这是用postscript编写的,
// 有兴趣的朋友可以查看PDF 1.2参考手册第8章
writer.Flush();
stream.Flush();
xrefs.Add(stream.Position);
System.Text.StringBuilder sb = new System.Text.StringBuilder();
sb.AppendLine("BT");
// BT =开始文本对象
sb.AppendLine("/F0 30 Tf");
// Tf = 使用文字 "F0" 定义文字大小为 "30"
sb.AppendLine("30 TL");
// TL = 设置高度为 "30"
sb.AppendLine("140.0 780.0 Td");
// Td = 文本坐标的位置 "140.0", "780.0"
sb.AppendLine("1.0 0.0 0.6 rg");
// rg = 字体前景颜色设置
sb.AppendLine("(Microsoft Corporation India) '");
sb.AppendLine("ET"); //画线
//顶部的线
sb.AppendLine("BT");
sb.AppendLine("10 TL");
sb.AppendLine("50.0 730.0 Td");
sb.AppendLine("0.0 0.0 0.0 rg");
sb.AppendLine("(__________________________________)'");
sb.AppendLine("ET"); //左边
sb.AppendLine("BT");
sb.AppendLine("10 TL");
sb.AppendLine("47.0 703.0 Td");
sb.AppendLine("0.0 0.0 0.0 rg");
for (int i = ; i <= ; i++)
{
sb.AppendLine("(|)'");
}
sb.AppendLine("ET"); //中间的线
sb.AppendLine("BT");
sb.AppendLine("10 TL");
sb.AppendLine("240.0 703.0 Td");
sb.AppendLine("0.0 0.0 0.0 rg");
for (int i = ; i <= ; i++)
{
sb.AppendLine("(|)'");
}
sb.AppendLine("ET"); //画右边的线
sb.AppendLine("BT");
sb.AppendLine("10 TL");
sb.AppendLine("557.0 703.0 Td");
sb.AppendLine("0.0 0.0 0.0 rg");
for (int i = ; i <= ; i++)
{
sb.AppendLine("(|)'");
}
sb.AppendLine("ET"); //底部的线
sb.AppendLine("BT");
sb.AppendLine("10 TL");
sb.AppendLine("50.0 102.0 Td");
sb.AppendLine("0.0 0.0 0.0 rg");
sb.AppendLine("(__________________________________)'");
sb.AppendLine("ET"); //文字
sb.AppendLine("BT");
sb.AppendLine("/F0 15 Tf");
sb.AppendLine("20 TL");
sb.AppendLine("70.0 670.0 Td");
sb.AppendLine("0.0 0.2 1.0 rg");
sb.AppendLine("(Parameter1)'");
sb.AppendLine("ET");
//
sb.AppendLine("BT");
sb.AppendLine("/F0 15 Tf");
sb.AppendLine("20 TL");
sb.AppendLine("0.0 0.0 0.0 rg");
sb.AppendLine("260.0 670.0 Td");
sb.AppendLine("(test1) '");
sb.AppendLine("ET");
//
sb.AppendLine("BT");
sb.AppendLine("/F0 15 Tf");
sb.AppendLine("20 TL");
sb.AppendLine("0.0 0.2 1.0 rg");
sb.AppendLine("70.0 645.0 Td");
sb.AppendLine("(Parameter2)'");
sb.AppendLine("ET");
//
sb.AppendLine("BT");
sb.AppendLine("/F0 15 Tf");
sb.AppendLine("20 TL");
sb.AppendLine("0.0 0.0 0.0 rg");
sb.AppendLine("260.0 645.0 Td");
sb.AppendLine("(test2) '");
sb.AppendLine("ET");
//
sb.AppendLine("BT");
sb.AppendLine("/F0 15 Tf");
sb.AppendLine("20 TL");
sb.AppendLine("0.0 0.2 1.0 rg");
sb.AppendLine("70.0 615.0 Td");
sb.AppendLine("(Parameter3)'");
sb.AppendLine("ET");
//
sb.AppendLine("BT");
sb.AppendLine("/F0 15 Tf");
sb.AppendLine("20 TL");
sb.AppendLine("260.0 615.0 Td");
sb.AppendLine("0.0 0.0 0.0 rg");
sb.AppendLine("(test3) '");
//
//
sb.AppendLine("BT");
sb.AppendLine("/F0 15 Tf");
sb.AppendLine("20 TL");
sb.AppendLine("0.0 0.2 1.0 rg");
sb.AppendLine("70.0 575.0 Td");
sb.AppendLine("(Parameter4)'");
sb.AppendLine("ET");
//
sb.AppendLine("BT");
sb.AppendLine("/F0 15 Tf");
sb.AppendLine("20 TL");
sb.AppendLine("260.0 575.0 Td");
sb.AppendLine("0.0 0.0 0.0 rg");
sb.AppendLine("(test4) '");
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");
writer.WriteLine(" 156 0 0 272 100 200 cm"); //[1 2 3 4 5 6 cm] translate to (5,6) and scale for 1
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 = ;
foreach (long xref_loopVariable in xrefs)
{
xref = xref_loopVariable;
writer.WriteLine("{0:0000000000} {1:00000} n", xref, );
} // PDF-TRAILER. PDF以这个节点结尾.
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");
}
} await Windows.System.Launcher.LaunchFileAsync(file);
}

c#实现生成PDF的底层方法的更多相关文章

  1. [.NET开发] C#使用doggleReport生成pdf报表的方法

    本文实例讲述了C#使用doggleReport生成pdf报表的方法.分享给大家供大家参考,具体如下: 1. 安装nuget -install package DoddleReport -install ...

  2. [轉載]史上最强php生成pdf文件,html转pdf文件方法

    之前有个客户需要把一些html页面生成pdf文件,然后我就找一些用php把html页面围成pdf文件的类.方法是可谓是找了很多很多,什么html2pdf,pdflib,FPDF这些都试过了,但是都没有 ...

  3. 史上最强php生成pdf文件,html转pdf文件方法

    body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...

  4. Django中生成PDF(一)

    Django中生成PDF(一) 需求描述:     某网站与其用户达成一致的协议,每份协议中都有用户相关的独特信息,且还需要生成PDF并存档.PDF文件中需要有企业LOGO.文字描述等信息.其展现形式 ...

  5. js将 HTML 页面生成 PDF 并下载

    最近碰到个需求,需要把当前页面生成 pdf,并下载.弄了几天,自己整理整理,记录下来,我觉得应该会有人需要 :) 先来科普两个插件: html2Canvas 简介 我们可以直接在浏览器端使用html2 ...

  6. Python数据生成pdf文件

    sklearn实战-乳腺癌细胞数据挖掘 https://study.163.com/course/introduction.htm?courseId=1005269003&utm_campai ...

  7. 内卷时代下的前端技术-使用JavaScript在浏览器中生成PDF文档

    背景 在计量领域中,计量检定是一种重要形式,主要用于评定计量器具的计量性能,确定其量值是否准确一致,实现手段包括计量检验.出具检定证书和加封盖印等. 在检定证书这一环节,存在一个难点,就是无法在线预览 ...

  8. asp.net 生成PDF方法

    今天转博客园看到有人发表了一篇生成PFd的文章,准备自己也留一份准备以后用到的时候方便调用: 首先去itextsharp网站下载控件(https://sourceforge.net/projects/ ...

  9. 在asp.net 中生成PDF的方法

    近期要用asp.net 2.0生成PDF,看了下书,查了下资料,发现可以有组件帮得上忙,可以下载itextsharp(https://sourceforge.net/projects/itextsha ...

随机推荐

  1. Maven+JSP+Servlet+JDBC+Redis+Mysql实现的黑马旅游网

    项目简介 项目来源于:https://gitee.com/haoshunyu/travel 本系统是基于Maven+JSP+Servlet+JdbcTemplate+Redis+Mysql实现的旅游网 ...

  2. vue2.x学习笔记(二十三)

    接着前面的内容:https://www.cnblogs.com/yanggb/p/12639440.html. 渲染函数&JSX 基础 vue推荐在绝大多数的情况下使用模板来创建html.然而 ...

  3. Java SE —— 专栏总集篇

    前言: Java 语言,是相对于其他语言而言,门槛低,而且功能还强大的一门编程语言,本人十分看好这一门语言,但是,它也是有深度的,看过本人的<数据结构与算法>专栏的同学们有福了,因为本人在 ...

  4. requets中urlencode的问题

    前言 今天团队群里有师傅问requests怎么设置不解码,这里是语误,其实师傅想说的是,如果设置不编码. 一开始我没懂,然后师傅们解答了这个问题后,我想了会儿懂了. 在一些CTF题目中,可能会碰到这样 ...

  5. Linux 常用到的命令

    1.按照文件所有属用户和名字查询 find -user mpsp -name \*.bin 2.根据string 字符串查找内容 more +/string test.txt 3.查找文件尾部 后20 ...

  6. Jmeter--Plugins Manager安装及常用的插件介绍

    jmeter 客户端 内置的插件管理工具Plugins Manager 1.下载地址:https://jmeter-plugins.org/install/Install/ 2.将下载的文件拷贝的你的 ...

  7. Java中的二分查找

    二分查找:(折半查找) 前提:数组必须是有序的. 思想:每次都猜中间的那个元素,比较大或者小,就能减少一半的元素.思路:A:定义最小索引,最大索引. B:比较出中间索引 C:拿中间索引的值和要查找的元 ...

  8. Linux系统防火墙相关操作

    服务器重启后防火墙会自动开启,需要把防火墙关闭 以下为对防火墙进行的相关操作 查看防火墙状态 systemctl status firewalld service iptables status 暂时 ...

  9. Openstack Swift 创建用户和 container

    openstack user create --domain default  --password-prompt [用户名];openstack role add --project admin - ...

  10. 显示 QStringList 的内容

    QStringList s; s << "your" << "string" << "list"; ; ...