Вы можете попробовать связать вручную.
Также проверьте эту проблему: https://github.com/kmagiera/react-native-gesture-handler/issues/205
Хорошо, Это не является прямым, но это работает и удивительно быстро. (И это использует 3-й файл, никакая такая вещь как открытый, и добавить.) Я 'обнаружил' это в документах/примерах. Вот код:
private void CombineMultiplePDFs( string[] fileNames, string outFile ) {
int pageOffset = 0;
ArrayList master = new ArrayList();
int f = 0;
Document document = null;
PdfCopy writer = null;
while ( f < fileNames.Length ) {
// we create a reader for a certain document
PdfReader reader = new PdfReader( fileNames[ f ] );
reader.ConsolidateNamedDestinations();
// we retrieve the total number of pages
int n = reader.NumberOfPages;
ArrayList bookmarks = SimpleBookmark.GetBookmark( reader );
if ( bookmarks != null ) {
if ( pageOffset != 0 ) {
SimpleBookmark.ShiftPageNumbers( bookmarks, pageOffset, null );
}
master.AddRange( bookmarks );
}
pageOffset += n;
if ( f == 0 ) {
// step 1: creation of a document-object
document = new Document( reader.GetPageSizeWithRotation( 1 ) );
// step 2: we create a writer that listens to the document
writer = new PdfCopy( document, new FileStream( outFile, FileMode.Create ) );
// step 3: we open the document
document.Open();
}
// step 4: we add content
for ( int i = 0; i < n; ) {
++i;
if ( writer != null ) {
PdfImportedPage page = writer.GetImportedPage( reader, i );
writer.AddPage( page );
}
}
PRAcroForm form = reader.AcroForm;
if ( form != null && writer != null ) {
writer.CopyAcroForm( reader );
}
f++;
}
if ( master.Count > 0 && writer != null ) {
writer.Outlines = master;
}
// step 5: we close the document
if ( document != null ) {
document.Close();
}
}
Да. Я видел класс под названием PdfManipulation, отправленный на iText форуме. Используя тот класс включил бы третий файл все же.
Класс находится первоначально в VB.Net. Я загрузил его с сообщения на vbforums.com. По-видимому, хотя, это не имеет функции файлов слияния, таким образом, я записал один на основе кода в том классе.
Это было записано на машине без iTextSharp. Это могло бы иметь ошибки. Я даже не уверен, на основе ли номера страниц 0 или на основе 1. Но дайте ему выстрел.
public static void MergePdfFiles(IEnumerable<string> files, string output) {
iTextSharp.text.Document doc;
iTextSharp.text.pdf.PdfCopy pdfCpy;
doc = new iTextSharp.text.Document();
pdfCpy = new iTextSharp.text.pdf.PdfCopy(doc, new System.IO.FileStream(output, System.IO.FileMode.Create));
doc.Open();
foreach (string file in files) {
// initialize a reader
iTextSharp.text.pdf.PdfReader reader = new iTextSharp.text.pdf.PdfReader(file);
int pageCount = reader.NumberOfPages;
// set page size for the documents
doc.SetPageSize(reader.GetPageSizeWithRotation(1));
for (int pageNum = 1; pageNum <= pageCount; pageNum++) {
iTextSharp.text.pdf.PdfImportedPage page = pdfCpy.GetImportedPage(reader, pageNum);
pdfCpy.AddPage(page);
}
reader.Close();
}
doc.Close();
}
Я не знаю, как сделать это для файлов PDF, но для постскриптума, Вы просто связываете файлы. Если у Вас есть pdf2ps, и установленный ps2pdf, ниже сделает задание:
pdf2ps file1.pdf file1.ps
pdf2ps file2.pdf file2.ps
cat file1.ps file2.ps > combined.ps
ps2pdf combined.ps combined.pdf
Я не эксперт по pdf2ps или ps2pdf. Я только когда-либо использовал ps2pdf, и когда я делаю так, он оставляет текст как текст (я могу все еще выбрать и скопировать текст с получающегося PDF). Когда я делаю вышеупомянутые шаги (PDF-> PS, объединение, PS-> PDF), я заканчиваю с получающимся PDF, который похож на изображение. Никакая идея, почему.
Я действительно могу чего-то упустить, но я сделал что-то гораздо более простое. Я признаю, что это решение, вероятно, не будет обновлять закладки (как в лучшем ответе здесь), но у меня оно работает безупречно. Поскольку я объединял документы с заполняемыми формами, я использовал PdfCopyFields вместо PdfCopy.
Вот код (я убрал всю обработку ошибок, чтобы сделать код более заметным, добавьте попытку .. наконец, чтобы закрыть открытые ресурсы, если вы планируете использовать код):
void MergePdfStreams(List<Stream> Source, Stream Dest)
{
PdfCopyFields copy = new PdfCopyFields(Dest);
foreach (Stream source in Source)
{
PdfReader reader = new PdfReader(source);
copy.AddDocument(reader);
}
copy.Close();
}
Вы можете передать любой поток , будь то FileStream, MemoryStream (полезно при чтении PDF-файлов из баз данных, нет необходимости во временных файлах и т. д.)
Пример использования:
void TestMergePdfStreams()
{
List<Stream> sources = new List<Stream>()
{
new FileStream("template1.pdf", FileMode.Open),
new FileStream("template2.pdf", FileMode.Open),
new MemoryStream((byte[])someDataRow["PDF_COLUMN_NAME"])
};
MergePdfStreams(sources, new FileStream("MergedOutput.pdf", FileMode.Create));
}