ITextSharp PdfCopy 使用示例
Posted
技术标签:
【中文标题】ITextSharp PdfCopy 使用示例【英文标题】:ITextSharp PdfCopy use examples 【发布时间】:2011-05-15 15:08:25 【问题描述】:我正在尝试使用 ItextSharp 中的 PdfSmartCopy,但在 c# 中找不到任何相关示例。
我的想法是我有一个包含表单字段的 pdf,并且这些字段将 700kb 添加到 pdf 文档的大小。没有表单域的原始文档为 100kb。 欢迎任何其他建议,尤其是不断减小 pdf 大小。
(我用adobe acrobat优化了生成的PDF,将其缩小到44kb。所以一定是哪里出了问题。) 有什么办法可以减小 PDF 的大小?
编辑:FormFlatenning 没有帮助。 pdf 模板文件只包含文本、行和表格,没有图像。
这是我的代码 sn-p
PdfReader reader = new PdfReader(GetTemplateBytes());
pst = new PdfStamper(reader, Response.OutputStream);
var acroFields = pst.AcroFields;
pst.FormFlattening = true;
pst.FreeTextFlattening = true;
SetFieldsInternal(acroFields);
pst.Close();
【问题讨论】:
您的问题标题提到了 PdfSmartCopy,但您的来源没有。 我要源代码,不提供。 【参考方案1】:这是一个 2008 VB.Net 示例,使用 ITextSharp PDFCopy 将多个 PDF 文件复制到 1 个多页 PDF 文件中。这将复制除基础链接之外的所有内容。它似乎完美地复制了所有注释,至少我找不到它没有复制的任何注释。
注意:您的项目中必须引用 ITextSharp。
输入参数:
fileArray – pdf 文件的数组。
outPutPDF – 输出多页 PDF 文档的完整路径和名称。
Private Sub BuildMultiPagePDF(ByVal fileArray As String(), ByVal outPutPDF As String)
Try
Dim reader As iTextSharp.text.pdf.PdfReader = Nothing
Dim pageCount As Integer = 0
Dim currentPage As Integer = 0
Dim pdfDoc As iTextSharp.text.Document = Nothing
Dim writer As iTextSharp.text.pdf.PdfCopy = Nothing
Dim page As iTextSharp.text.pdf.PdfImportedPage = Nothing
Dim currentPDF As Integer = 0
If fileArray.Length > 0 Then
reader = New iTextSharp.text.pdf.PdfReader(fileArray(currentPDF))
pdfDoc = New iTextSharp.text.Document(reader.GetPageSizeWithRotation(1))
writer = New iTextSharp.text.pdf.PdfCopy(pdfDoc, _
New IO.FileStream(outPutPDF, _
IO.FileMode.OpenOrCreate, _
IO.FileAccess.Write))
pageCount = reader.NumberOfPages
While currentPDF < fileArray.Length
pdfDoc.Open()
While currentPage < pageCount
currentPage += 1
pdfDoc.SetPageSize(reader.GetPageSizeWithRotation(currentPage))
pdfDoc.NewPage()
page = writer.GetImportedPage(reader, currentPage)
writer.AddPage(page)
End While
currentPDF += 1
If currentPDF < fileArray.Length Then
reader = New iTextSharp.text.pdf.PdfReader(fileArray(currentPDF))
pageCount = reader.NumberOfPages
currentPage = 0
End If
End While
pdfDoc.Close()
Else
MessageBox.Show("The input file array is empty. Processing terminated.", _
"INVALID FILE LIST", _
MessageBoxButtons.OK, MessageBoxIcon.Error)
End If
Catch ex As Exception
MessageBox.Show(ex.message)
End Try
End Sub
【讨论】:
其实我想使用 iTextSharp 从 PDF 文件中提取数据,该文件包含表格格式的数据,我需要提取数据请给我一个例子【参考方案2】:在调用pst.close()
之前调用reader.removeUnusedObjects()
...无需展平。
要进一步缩小内容,您可以pst.setFullCompression()
。 YMMV。
编辑:就示例而言,我建议获取 iText in Action,第 2 版。里面有很多各种各样的例子,包括 PdfCopy 和 PdfSmartCopy。书中所有代码示例均为available on line。
如果你买这本书,我不赚钱,但通过许多在线互动认识作者,并把他当作朋友。
【讨论】:
感谢您的回答,我设法通过使用 OpenOffice 而不是 Adobe Acrobat 创建模板来制作更小的 pdf 文件。 80kb 与 800kb。【参考方案3】:using iTextSharp.text;
using iTextSharp.text.pdf;
public void pdfcopyfile()
string pdfTemplatePath = @"D:\1.pdf";
string outputPdfPath = @"D:\44.pdf";
iTextSharp.text.pdf.PdfReader reader = null;
int pageCount = 0;
int currentPage = 0;
Document pdfDoc = null;
PdfCopy writer = null;
PdfImportedPage page = null;
reader = new PdfReader(pdfTemplatePath);
pdfDoc = new Document(reader.GetPageSizeWithRotation(1));
writer = new PdfCopy(pdfDoc, new System.IO.FileStream(outputPdfPath, System.IO.FileMode.Create));
pageCount = reader.NumberOfPages;
pdfDoc.Open();
while (currentPage < pageCount)
currentPage += 1;
pdfDoc.SetPageSize(reader.GetPageSizeWithRotation(currentPage));
pdfDoc.NewPage();
page = writer.GetImportedPage(reader, currentPage);
writer.AddPage(page);
reader = new PdfReader(pdfTemplatePath);
pageCount = reader.NumberOfPages;
currentPage = 0;
pdfDoc.Close();
【讨论】:
以上是关于ITextSharp PdfCopy 使用示例的主要内容,如果未能解决你的问题,请参考以下文章