【求解】导出PDF,自动生成PDF索引的问题

xiao_fan85 2009-04-08 03:51:45
加精
有个问题需要请教一下,水晶报表2008 生成PDF文件,PDF的目录页中每一个目录都对应一个rpt文件,我是在程序中先把这些文件导出成流,最后将所有的流合并起来生成一个完整的pdf文件,
现在的问题就是怎么对目录页添加页索引,就是我点其中任何一个目录都直接定位到pdf相应的这一页,目录页也是一个rpt文件生成的,它的数据源是在生
成所有目录中的文件流后程序中处理得到的一个dataset
PDF目录页显示如下,显示效果是实现了,但希望再添加目录索引,例如点"1.YEAR/YEAR BY BUSINESS SOURCE ARRIVAL--------------------------------------------------------------------- 2”就直接定位到这一页

TABLE OF CONTENTS
1.YEAR/YEAR BY BUSINESS SOURCE ARRIVAL--------------------------------------------------------------------- 2
2.YEAR/YEAR BY BUSINESS SOURCE ACTIVITY-------------------------------------------------------------------- 4
3.YEAR/YEAR BY PEGASUS SOURCE ARRIVAL---------------------------------------------------------------------- 6
4.YEAR/YEAR BY PEGASUS SOURCE ACTIVITY--------------------------------------------------------------------- 7
5.YEAR/YEAR BY RATE CODE ARRIVAL--------------------------------------------------------------------------- 8
6.YEAR/YEAR BY RATE CODE ACTIVITY-------------------------------------------------------------------------- 14
7.BUSINESS SOURCE SUMMARY BY ARRIVAL DATE------------------------------------------------------------------ 19
8.BUSINESS SOURCE SUMMARY BY ACTIVITY DATE----------------------------------------------------------------- 22
9.PEGASUS SUMMARY BY ACTIVITY DATE------------------------------------------------------------------------- 23
10.PEGASUS SUMMARY BY ARRIVAL DATE------------------------------------------------------------------------- 24
11.RATE CODE SUMMARY BY ARRIVAL DATE----------------------------------------------------------------------- 25
12.RATE CODE SUMMARY BY ACTIVITY DATE---------------------------------------------------------------------- 37
13.TRAVEL AGENT SALES BY ARRIVAL DATE---------------------------------------------------------------------- 41
14.TRAVEL AGENT SALES BY ACTIVITY DATE--------------------------------------------------------------------- 42
15.RESERVATION ARRIVALS------------------------------------------------------------------------------------ 43
16.RESERVATION ACTIVITY------------------------------------------------------------------------------------ 50
17.FUTURE AVAILABILITY------------------------------------------------------------------------------------- 57
18.RESERVATION SUMMARY-------------------------------------------------------------------------------------- 60
...全文
2401 53 打赏 收藏 转发到动态 举报
写回复
用AI写文章
53 条回复
切换为时间正序
请发表友善的回复…
发表回复
allen3010 2010-07-16
  • 打赏
  • 举报
回复
好题,记录
qingji 2009-07-30
  • 打赏
  • 举报
回复
我们现在有一个问题,各位高手能否指点:
我们采用水晶报表做,里面用到了子报表.在主报表中有一个目录,显示各个子报表所在的页码,每个子报表的内容长度不定,这个问题与楼主的相似,但不同,如何方便生成这个目录?如果以计算的方式,在目录页用什么合适?
谢谢
zhuweiping2003 2009-04-13
  • 打赏
  • 举报
回复
楼主很厚道
赞一个!
xiao_fan85 2009-04-13
  • 打赏
  • 举报
回复
我已经结贴了,如果有更好的办法,欢迎与大家共享一下,谢谢啦
readfuture 2009-04-11
  • 打赏
  • 举报
回复
说话这个问题比较难解决
haifeng39 2009-04-11
  • 打赏
  • 举报
回复
up
冰岛男孩 2009-04-11
  • 打赏
  • 举报
回复
学习……
xinqinglhj 2009-04-10
  • 打赏
  • 举报
回复
iTextSharp

好东西,呵呵
阿泰 2009-04-10
  • 打赏
  • 举报
回复
非常感谢小帆的分享!
xiao_fan85 2009-04-10
  • 打赏
  • 举报
回复
iTextSharp下载地址
http://sourceforge.net/project/showfiles.php?group_id=72954

引用命名空间
using iTextSharp.text;
using iTextSharp.text.pdf;
using iTextSharp;
xiao_fan85 2009-04-10
  • 打赏
  • 举报
回复
不好意思,昨天下午公司有个培训,后来结束已经7点了,就没再想这个问题了,我写了一个demo,C#代码,用到itextsharp控件

TestTable:
1.YEAR/YEAR1 1
2.YEAR/YEAR2 2
3.YEAR/YEAR3 3
4.YEAR/YEAR4 4
5.YEAR/YEAR5 5
6.YEAR/YEAR6 6
7.BUSINESS1 7
8.BUSINESS2 8
9.PEGASUS1 9
10.PEGASUS2 10

    
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
DataTable dtable = new DataTable();
DataColumn dtCol = new DataColumn();
DataColumn lineCol = new DataColumn();
DataColumn col = new DataColumn();

dtCol.ColumnName = "ReportName";
col.ColumnName = "PageNum";
dtable.Columns.Add(dtCol);
dtable.Columns.Add(col);
ReportService.ReportService g = new ScheduleReport.ReportService.ReportService();//引用webservices
for (int i = 1; i < 50; i++)
{
if (i >= 1 && i <= 18)
{
//这个方法是读数据库的一个表,里面保存报表名称和报表ID
string reprotName = g.GetReportTypeName(i);

//你也可以用别的方式,只要能够生成一个类似TestTable的数据就好了
DataRow dr;
dr = dtable.NewRow();
dr[0] = i.ToString() + "." + reprotName.ToString();
dr[1] = i.ToString();
dtable.Rows.Add(dr);
}
}

pdfStyle(dtable);
}
}

protected void pdfStyle(DataTable dt)
{
try
{
Document document = new Document(PageSize.A3.Rotate());
PdfWriter.GetInstance(document, new FileStream(Server.MapPath("ExportFile\\Chap01012.pdf"), FileMode.Create));
document.Open();
BaseFont bfChinese = BaseFont.CreateFont("E:\\WINDOWS\\Fonts\\simsun.ttc,1", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
Font fontChinese = new Font(bfChinese, 13, Font.NORMAL, new Color(0, 0, 0));
Paragraph pTitle = new Paragraph("TABLE OF CONTENTS", FontFactory.GetFont(FontFactory.TIMES_BOLDITALIC, 28, new Color(0, 0, 0)));
pTitle.Alignment = 0;
document.Add(pTitle);
document.Add(new Paragraph(" "));
string content;
for (int i = 0; i < dt.Rows.Count; i++)
{
string s = dt.Rows[i][0].ToString() + "-----------------------------------------------------------------------------------------------------------------------------------------------------";
if (s.Length >= 150)
{
s = s.Substring(0, 150);
}
if (dt.Rows[i][1].ToString().Length == 1)
{
content = s + " " + dt.Rows[i][1].ToString();
}
else if (dt.Rows[i][1].ToString().Length == 2)
{
content = s + " " + dt.Rows[i][1].ToString();
}
else if (dt.Rows[i][1].ToString().Length == 3)
{
content = s + " " + dt.Rows[i][1].ToString();
}
else
{
content = s + " " + dt.Rows[i][1].ToString();
}


Anchor click = new Anchor(content, fontChinese);
//click.Reference = "http://www.whiteboardlabs.com";
click.Reference = "#target"+(i+1).ToString();// +dt.Rows[i][1].ToString();
Paragraph p1 = new Paragraph();
p1.Add(click);
p1.Alignment = 1;
//cell = new PdfPCell(new Phrase(click));
//cell.AddElement();
document.Add(p1);
//}
//cell.Border = 0;
//table.AddCell(cell);

//table.AddCell(new Phrase(dt.Rows[i][j].ToString(), fontChinese));
//}
}
for (int j = 1; j <= 18; j++)
{
Paragraph p2 = new Paragraph();
p2.Add(new Chunk("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"));
document.Add(p2);

Anchor target = new Anchor("This is the Target"+j.ToString());
target.Name = "target"+j.ToString();
Paragraph p3 = new Paragraph();
p3.Add(target);
document.Add(p3);
}
document.Close();

}
catch (DocumentException de)
{
Response.Write(de.ToString());
}

}



abc163 2009-04-10
  • 打赏
  • 举报
回复
学习一下
gwemail2003 2009-04-10
  • 打赏
  • 举报
回复
itextsharp 应该可以,学习了,
mykelly6 2009-04-10
  • 打赏
  • 举报
回复
等待好的方案,pdf是挺烦的,要用程序把office文档转过去就需要安装office07和一个插件,要么就是虚拟打印。
hezechao1989 2009-04-10
  • 打赏
  • 举报
回复
路过 up
longxinglxl12070 2009-04-09
  • 打赏
  • 举报
回复
解不出来
zhangsir199 2009-04-09
  • 打赏
  • 举报
回复
我也不清楚的说,来此目的同楼上
wcsysnet 2009-04-09
  • 打赏
  • 举报
回复
来接分了
阿泰 2009-04-09
  • 打赏
  • 举报
回复

之前看到有一个工具可以实现这样的一个效果:

单个的pdf,组合成一个pdf,并生成目录。$699.



加了100分,推荐到首页看下,希望有直接能用程序的解决方法。

xiao_fan85 2009-04-09
  • 打赏
  • 举报
回复
嗯,谢谢阿泰,我继续期待答案的出现
加载更多回复(32)

4,816

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 图表区
社区管理员
  • 图表区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧