-
Notifications
You must be signed in to change notification settings - Fork 1
/
Program.cs
118 lines (107 loc) · 4.55 KB
/
Program.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
// See https://aka.ms/new-console-template for more information
using System.Linq;
using System.IO;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
using CommandLine;
class Program
{
public class Options
{
[Value(0, Required = true, HelpText = "Name of the output file.", MetaName = "Output")]
public string OutputFilename { set; get; }
[Value(1, Required = true, Min = 2, HelpText = "Names of files that need to be merged.", MetaName = "Filenames")]
public IEnumerable<string> Filenames { set; get; }
[Option('b', "set-page-breaks", Required = false, HelpText = "Set page breaks between each file.")]
public bool SetPageBreaks { set; get; }
}
static public void Main(string[] args)
{
var parseResult = Parser.Default.ParseArguments<Options>(args).WithParsed<Options>(o => {
// Console.Write(String.Join(", ", o.filenames));
File.Delete(o.OutputFilename);
var merger = new FileMerger(o.OutputFilename, o.Filenames, o.SetPageBreaks);
// merger.MergeFiles();
merger.MergeFiles();
});
if (parseResult.Errors.Count() == 0) {
Environment.Exit(0);
} else {
Environment.Exit(1);
}
}
}
class FileMerger
{
private IEnumerable<string> filenames;
private string outputFilename;
private bool setPageBreaks;
public FileMerger(string outputFilename, IEnumerable<string> filenames, bool setPageBreaks = false)
{
if (filenames.Count() < 2) {
throw new ArgumentException("Specified less then 2 files. Add 2 or more filenames.");
}
this.filenames = filenames;
this.setPageBreaks = setPageBreaks;
this.outputFilename = outputFilename;
}
public void MergeFiles()
{
File.Delete(outputFilename);
File.Copy(filenames.ElementAt(0), outputFilename);
for (int i = 1; i < filenames.Count(); i++)
{
if (setPageBreaks)
{
insertPageBreakToEndOfFile(outputFilename);
}
AppendDocToDoc(outputFilename, filenames.ElementAt(i));
}
}
public void AppendDocToDoc(string targetFilename, string tailFilename)
{
using (WordprocessingDocument myDoc = WordprocessingDocument.Open(targetFilename, true))
{
string altChunkId = "_" + Guid.NewGuid().ToString("d");
MainDocumentPart mainPart = myDoc.MainDocumentPart;
// if (setPageBreaks) {
// mainPart.Document.Body.InsertAfterSelf(new Paragraph(
// new Run(
// new Break { Type = BreakValues.Page })));
// }
AlternativeFormatImportPart chunk =
mainPart.AddAlternativeFormatImportPart(
AlternativeFormatImportPartType.WordprocessingML, altChunkId);
using (FileStream fileStream = File.Open(tailFilename, FileMode.Open))
chunk.FeedData(fileStream);
AltChunk altChunk = new AltChunk();
altChunk.Id = altChunkId;
mainPart.Document.Body
.InsertAfter(altChunk, mainPart.Document.Body
.Elements().Last());
mainPart.Document.Save();
}
}
private void insertPageBreakToEndOfFile (string filename)
{
WordprocessingDocument doc = WordprocessingDocument.Open(filename, true);
MainDocumentPart mainPart = doc.MainDocumentPart;
var pageBreak = new Paragraph(
new Run(
new Break { Type = BreakValues.Page }));
// Chose in which file to add pagebreak depending on is there already embeded files or not
if (mainPart.AlternativeFormatImportParts.Count() == 0)
{
mainPart.Document.Body.InsertAfter(pageBreak, mainPart.Document.Body
.Elements<Paragraph>().Last());
} else {
WordprocessingDocument externalDoc = WordprocessingDocument.Open(mainPart.AlternativeFormatImportParts.Last().GetStream(), true);
var externalMainPart = externalDoc.MainDocumentPart;
externalMainPart.Document.Body.InsertAfter(pageBreak, externalMainPart.Document.Body
.Elements<Paragraph>().Last());
externalDoc.Close();
}
doc.Close();
}
}
// WordprocessingDocument.Open("template.docx", true);