Примеры использования ITextSharp PdfCopy
Я пытаюсь использовать PdfSmartCopy С ItextSharp но я не могу найти соответствующие примеры в C#.
ideea заключается в том, что у меня есть pdf, содержащий поля формы и поля add 700kb к размеру документа pdf. Исходный документ без полей формы был 100kb. Любые другие sugestions приветствуются, особенно o последовательно уменьшают размер pdf.
(я оптимизировал сгенерированный PDF с помощью adobe акробат, и это уменьшило его до 44 КБ. Значит, где-то произошел сбой.) Есть ли способ уменьшить размер PDF?
Edit: FormFlatenning не помогает. Файл шаблона pdf содержит только текст, строки и таблицы, без изображений.
вот мой код
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();
3 ответов
вот 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
вызов reader.removeUnusedObjects()
перед вызовом pst.close()
... нет необходимости в сплющивании.
сжать вещи немного больше вы можете pst.setFullCompression()
. YMMV.
EDIT: что касается примеров, я рекомендую получить iText в действии, 2-е издание. Много примеров всех видов вещей там, в том числе PdfCopy & PdfSmartCopy. Все примеры кода из книги на линии.
Я не делаю никаких денег, если вы покупаете книгу, но знаю автора от многочисленные онлайн-взаимодействия, и считайте его другом.
using iTextSharp.text;
using iTextSharp.text.pdf;
public void pdfcopyfile()
{
string pdfTemplatePath = @"D:.pdf";
string outputPdfPath = @"D:.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();
}