#pdf #itext
#PDF #itext
Вопрос:
Возможно ли объединить заполняемый PDF-файл с обычным PDF-файлом в asp.net C # с использованием itextsharp. Буду признателен за любую помощь.
Ответ №1:
Мне потребовалось много времени, чтобы разобраться в этом, но вот рабочий пример:
public static void MergeFiles(string destinationFile, string[] sourceFiles)
{
try
{
int f = 0;
String outFile = destinationFile;
Document document = null;
PdfCopy writer = null;
while (f < sourceFiles.Length) {
// Create a reader for a certain document
PdfReader reader = new PdfReader(sourceFiles[f]);
// Retrieve the total number of pages
int n = reader.NumberOfPages;
//Trace.WriteLine("There are " n " pages in " sourceFiles[f]);
if (f == 0)
{
// Step 1: Creation of a document-object
document = new Document(reader.GetPageSizeWithRotation(1));
// Step 2: Create a writer that listens to the document
writer = new PdfCopy(document, new FileStream(outFile, FileMode.Create));
// Step 3: Open the document
document.Open();
}
// Step 4: Add content
PdfImportedPage page;
for (int i = 0; i < n; )
{
i;
page = writer.GetImportedPage(reader, i);
writer.AddPage(page);
}
PRAcroForm form = reader.AcroForm;
if (form != null)
writer.CopyAcroForm(reader);
f ;
}
// Step 5: Close the document
document.Close();
}
catch(Exception)
{
//handle exception
}
}
Надеюсь, это поможет!
Источник: http://www.ujihara.jp/iTextdotNET/examples/concat_pdf.java
Комментарии:
1. Сработало как по волшебству, большое спасибо! (Я тоже поддержал ответ)
Ответ №2:
Да.
PdfCopyFields звучит примерно так. Таким образом, даже если ваш «обычный PDF-файл» содержит аннотации любого рода (ссылки, flash, что угодно), они все равно будут работать нормально.
В качестве альтернативы вы могли бы открыть форму с помощью PdfStamper и добавить PDF-импортированные страницы из «обычного» PDF. Это позволило бы сохранить все об исходном PDF (метаданные, структуру, скрипты на уровне документа и т.д.) И удалить страницы (без всего, что не было содержимым страницы) из «обычного pdf».
К сожалению, здесь нет идеального ответа, но есть по крайней мере два жизнеспособных варианта на выбор.
Ответ №3:
Вы можете использовать PdfCopyFields для объединения любых сложных заполняемых PDF-форм. Он поддерживает все стили, поля формы и функциональные возможности pdf, просто попробуйте этот код..
PdfReader readerfile1 = new PdfReader("File1");
PdfReader readerfile2 = new PdfReader("File2");
PdfCopyFields copyfile =
new PdfCopyFields(new FileStream("OutputFilewithFullPath", FileMode.Create));
copyfile.AddDocument(readerfile1);
copyfile.AddDocument(readerfile2);
copyfile.Close();
В результате будет создан новый файл, который вы указали, и это будет полная заполняемая форма.
Ответ №4:
Я понимаю, что это довольно старая тема, однако у меня была похожая проблема, и вот более чистое решение
public string GetMergedPdfPath(List<KeyValuePair<AccountHolder, string>> filePaths, string outputFilename)
{
string directory = ApplicationDeployment.IsNetworkDeployed ? ApplicationDeployment.CurrentDeployment.DataDirectory : NoticeConstants.Paths.TestDirectory;
string outputFilepath = directory "\" outputFilename;
Document outputDocument = null;
PdfCopy outputCopier = null;
try
{
using (outputDocument = new Document())
{
using (FileStream fs = new FileStream(outputFilepath, FileMode.Create))
{
using (outputCopier = new PdfCopy(outputDocument, fs))
{
outputDocument.Open();
for (int i = 0; i < filePaths.Count; i )
{
if (string.IsNullOrEmpty(filePaths[i].Value))
{
continue;
}
using (PdfReader reader = new PdfReader(filePaths[i].Value))
{
NoticeUtil.GetPdfPages(reader, ref outputCopier);
}
}
outputDocument.Close();
}
}
}
return outputFilepath;
}
catch (Exception ex)
{
Log.Error(ex.Message, ex);
return string.Empty;
}
}
private static List<PdfImportedPage> GetPdfPages(PdfReader reader, ref PdfCopy outputCopier)
{
List<PdfImportedPage> pages = new List<PdfImportedPage>();
try
{
for (int p = 1; p <= reader.NumberOfPages; p )
{
outputCopier.AddPage(outputCopier.GetImportedPage(reader, p));
}
}
catch (Exception ex)
{
Log.Error(ex.Message, ex);
}
return pages;
}