Birden çok DOCX dosyasını (DocX Package ile oluşturulan) tek bir dosyada birleştirmem gerekir. Birden çok dosyayı birleştirmeyi başardım ancak Başlıkları ve Altbilgileri birleştiremedim (dosyalar arasında farklılıklar var). Hem DocX package hem de MS Office COM Interop denedim ve sadece üstbilgi/altbilgi birleştirmek istemiyor. Atlanıyorlar.Başlıklar, alt bilgiler ve resimler dahil olmak üzere docx dosyalarını birleştirme
Herkes çalışacak bir çözüm sağlayabilir mi? Gerçekten de herhangi bir şey olabilir (PDFCreator COM veya Interop veya DocX kullanarak PDF'ye dönüştürme dahil).
Ayrıca C# içinde PDFCreator Örneğini denedim ve güzel bir belgeyi PDF'ye dönüştürdüm, ancak çok sayıda belgenin nasıl sağlanacağını bilmiyorum, böylece büyük bir PDF oluşturur. Yani herkes iyi (ücretsiz) bir yol sağlayabilirse takdir edilecektir.
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);
}
}
Ne yazık ki bu, bir süre önce denediğimi hatırladığımdan beri hatırladığım şeylerden altbilgileri ve başlıkları birleştirmiyor. – MadBoy
Tamam, bunun için değiştirilip değiştirilemeyeceğini görmek için bu çözümle uğraşacağım. – darkstar3d
Gecikme için özür dilerim, iş benimle yakalandı. Bağlantılı olduğum çözümün sınıfındaki sayfa sonu çizgisini de değiştirirseniz, bu sizin için düzeltecektir. Bunu aşağıdaki gibi değiştirin: object pageBreak = Word.WdBreakType.wdSectionBreakNextPage; – darkstar3d