I am trying to use PdfSmartCopy from ItextSharp but I cannot find any relevant examples in c#.
The ideea is that I have a pdf containing form fields and the fields add 700kb to the size of the pdf document. The original document without form fields was 100kb.
Any other sugestions are welcome, especially o reduce the pdf size consistently.
(I optimised the generated PDF with adobe acrobat, and it reduced it to 44kb. So there must be a glitch somewhere.)
Is there any way to reduce the PDF size?
Edit: FormFlatenning doesn’t help. The pdf template file contains only text, lines and tables, no images.
here’s my code snippet
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();
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
Here is a 2008 VB.Net example of using ITextSharp PDFCopy to copy multiple PDF files into 1 multi-page PDF file. This will copy everything except underlying links. It appears to copy all annotations perfectly, at least I could not find any it did not copy.
Note: You must have ITextSharp referenced in your project.
Input Parameters:
fileArray – an array of pdf files.
outPutPDF – full path and name to output multipage PDF document.
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
Method 2
Call reader.removeUnusedObjects() before calling pst.close()… no need for flattening.
To shrink things a little more you can pst.setFullCompression(). YMMV.
EDIT: As far as examples goes, I recommend getting iText in Action, 2nd edition. Lots of examples of all sorts of things in there, including PdfCopy & PdfSmartCopy. All the code samples from the book are available on line.
I don’t make any money if you buy the book, but know the author from numerous online interactions, and consider him a friend.
Method 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();
}
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0