Muszę scalić wiele plików DOCX (utworzonych z DocX Package) w jeden duży plik. Udało mi się już scalić wiele plików, ale nie udało mi się scalić nagłówków i stopek (różnią się one między plikami, stronami). Próbowałem zarówno DocX package i MS Office COM Interop i po prostu nie chce scalić nagłówków/stopek. Są pomijane.Scalanie plików docx razem z nagłówkami, stopkami i obrazkami
Czy ktoś może zapewnić rozwiązanie, które zadziała? Może to być naprawdę wszystko (w tym konwersja do formatu PDF za pomocą COM PDFCreator lub Interop lub DocX).
Próbowałem również PDFCreator Sample w języku C# i konwertuje ładnie jeden dokument do formatu PDF, ale nie wiem, jak dostarczyć wiele dokumentów, aby utworzyć jeden duży plik PDF. Więc jeśli ktoś może zapewnić dobry (wolny) sposób, będzie to docenione.
To co mam użyć:
internal static class DocumentsMerging {
private static object missing = Type.Missing;
private static ApplicationClass wordApplication { get; set; }
private static void addDocument(object path, Document doc, bool firstDocument) {
object subDocPath = path;
var subDoc = wordApplication.Documents.Open(ref subDocPath, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing);
try {
if (!firstDocument) {
insertPageBreak(doc);
}
object docStart = doc.Content.End - 1;
object docEnd = doc.Content.End;
object start = subDoc.Content.Start;
object end = subDoc.Content.End;
Range rng = doc.Range(ref docStart, ref docEnd);
rng.FormattedText = subDoc.Range(ref start, ref end);
//if (!lastDocument) {
//}
} finally {
subDoc.Close(ref missing, ref missing, ref missing);
}
}
public static bool deleteFile(string fileName) {
if (File.Exists(fileName)) {
try {
File.Delete(fileName);
if (File.Exists(fileName)) {
return false;
}
return true;
} catch (IOException) {
DialogResult result = MessageBox.Show(new Form {TopMost = true}, "Plik " + fileName + " jest w użyciu lub nie masz uprawnień do zapisania raportu w tym miejscu. Czy chcesz spróbować ponownie?", "Błąd zapisu (000002)", MessageBoxButtons.YesNo, MessageBoxIcon.Stop);
if (result == DialogResult.No) {
return false;
}
if (deleteFile(fileName)) {
return true;
}
} catch (Exception e) {
MessageBox.Show(new Form {TopMost = true}, "Plik " + fileName + " nie może zostać skasowany. Błąd " + Environment.NewLine + Environment.NewLine + e, "Błąd zapisu (000003)", MessageBoxButtons.YesNo, MessageBoxIcon.Stop);
return false;
}
} else {
return true;
}
return false;
}
public static void documentsMerge(object fileName, List<string> arrayList) {
// object fileName = Path.Combine(Environment.CurrentDirectory, @"NewDocument.doc");
bool varTest = deleteFile(fileName.ToString());
if (varTest) {
try {
wordApplication = new ApplicationClass();
var doc = wordApplication.Documents.Add(ref missing, ref missing, ref missing, ref missing);
try {
doc.Activate();
int count = 0;
foreach (var alItem in arrayList) {
addDocument(alItem, doc, count == 0);
count++;
}
// addDocument(@"D:\Projects\WordTests\ConsoleApplication1\Documents\Doc1.doc", doc) ; //, false);
// addDocument(@"D:\Projects\WordTests\ConsoleApplication1\Documents\Doc2.doc", doc) ; //, true);
doc.SaveAs(ref fileName, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing);
} finally {
doc.Close(ref missing, ref missing, ref missing);
}
} finally {
wordApplication.Quit(ref missing, ref missing, ref missing);
}
} else {
return;
}
}
private static void insertPageBreak(Document doc) {
object docStart = doc.Content.End - 1;
object docEnd = doc.Content.End;
Range rng = doc.Range(ref docStart, ref docEnd);
// object pageBreak = WdBreakType.wdPageBreak;
object pageBreak = WdBreakType.wdSectionBreakNextPage;
rng.InsertBreak(ref pageBreak);
}
}
Niestety nie łączy to stopek i nagłówków z tym, co pamiętam, ponieważ pamiętam, jak próbowałem go jakiś czas temu. – MadBoy
Ok, będę majstrować przy tym rozwiązaniu, aby sprawdzić, czy można go zmodyfikować, aby to zrobić. – darkstar3d
Przepraszamy za opóźnienie, praca nadrobiła we mnie. Jeśli zmienisz linię przerywania strony w klasie rozwiązania, które również podłączyłem, to naprawi to za Ciebie. Zmień go na: object pageBreak = Word.WdBreakType.wdSectionBreakNextPage; – darkstar3d