první commit
This commit is contained in:
commit
641e9bc2e6
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
.vs
|
||||||
|
bin
|
||||||
|
obj
|
||||||
9
App.xaml
Normal file
9
App.xaml
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
<Application x:Class="Slučování_rozpisek.App"
|
||||||
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:local="clr-namespace:Slučování_rozpisek"
|
||||||
|
StartupUri="MainWindow.xaml">
|
||||||
|
<Application.Resources>
|
||||||
|
|
||||||
|
</Application.Resources>
|
||||||
|
</Application>
|
||||||
14
App.xaml.cs
Normal file
14
App.xaml.cs
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
using System.Configuration;
|
||||||
|
using System.Data;
|
||||||
|
using System.Windows;
|
||||||
|
|
||||||
|
namespace Slučování_rozpisek
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Interaction logic for App.xaml
|
||||||
|
/// </summary>
|
||||||
|
public partial class App : Application
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
10
AssemblyInfo.cs
Normal file
10
AssemblyInfo.cs
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
using System.Windows;
|
||||||
|
|
||||||
|
[assembly: ThemeInfo(
|
||||||
|
ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
|
||||||
|
//(used if a resource is not found in the page,
|
||||||
|
// or application resource dictionaries)
|
||||||
|
ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
|
||||||
|
//(used if a resource is not found in the page,
|
||||||
|
// app, or any theme specific resource dictionaries)
|
||||||
|
)]
|
||||||
59
MainWindow.xaml
Normal file
59
MainWindow.xaml
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
<Window x:Name="HlavniOkno" x:Class="SlucovaniRozpisek.MainWindow"
|
||||||
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
xmlns:local="clr-namespace:SlucovaniRozpisek"
|
||||||
|
mc:Ignorable="d"
|
||||||
|
Title="Slučování rozpisek" SizeToContent="WidthAndHeight" Background="WhiteSmoke" Icon=".\icopdf.ico"
|
||||||
|
WindowStartupLocation="Manual" Left="200" Top="200"
|
||||||
|
>
|
||||||
|
<Grid Margin="10">
|
||||||
|
<Grid.RowDefinitions>
|
||||||
|
<RowDefinition Height="20"/>
|
||||||
|
<RowDefinition Height="25"/>
|
||||||
|
<RowDefinition Height="20"/>
|
||||||
|
<RowDefinition Height="25"/>
|
||||||
|
<RowDefinition Height="20"/>
|
||||||
|
<RowDefinition Height="25"/>
|
||||||
|
<RowDefinition Height="50"/>
|
||||||
|
</Grid.RowDefinitions>
|
||||||
|
|
||||||
|
<StackPanel Grid.Row="0" Grid.Column="0" Orientation="Horizontal">
|
||||||
|
<TextBlock Text="Cesta ke složce s přílohami:" HorizontalAlignment="Left" Margin="0,0,0,0" VerticalAlignment="Top" FontSize="14"/>
|
||||||
|
</StackPanel>
|
||||||
|
|
||||||
|
<StackPanel Grid.Row="1" Grid.Column="0" Orientation="Horizontal">
|
||||||
|
<TextBox Name="cestaPrilohyBox" Margin="0, 0, 5, 0" Width="360" VerticalContentAlignment="Center" FontSize="14"
|
||||||
|
Text="{Binding CestaPrilohy, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
|
||||||
|
<Button Name="cestaPrilohyButton" Content="" Foreground="DarkOrange" FontFamily="Segoe MDL2 Assets" FontSize="15" Width="40" Click="btnCestaPrilohyClick"/>
|
||||||
|
</StackPanel>
|
||||||
|
|
||||||
|
<StackPanel Grid.Row="2" Grid.Column="0" Orientation="Horizontal">
|
||||||
|
<TextBlock Text="Cesta ke složce s rozpiskami:" HorizontalAlignment="Left" Margin="0,0,0,0" VerticalAlignment="Top" FontSize="14"/>
|
||||||
|
</StackPanel>
|
||||||
|
|
||||||
|
<StackPanel Grid.Row="3" Grid.Column="0" Orientation="Horizontal">
|
||||||
|
<TextBox Name="cestaRozpiskyBox" Margin="0, 0, 5, 0" Width="360" VerticalContentAlignment="Center" FontSize="14"
|
||||||
|
Text="{Binding CestaRozpisky, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
|
||||||
|
<Button Name="cestaRozpiskyButton" Content="" Foreground="DarkOrange" FontFamily="Segoe MDL2 Assets" FontSize="15" Width="40" Click="btnCestaRozpiskyClick"/>
|
||||||
|
</StackPanel>
|
||||||
|
|
||||||
|
<StackPanel Grid.Row="4" Grid.Column="0" Orientation="Horizontal">
|
||||||
|
<TextBlock Text="Cesta k výstupní složce:" HorizontalAlignment="Left" Margin="0,0,0,0" VerticalAlignment="Top" FontSize="14"/>
|
||||||
|
</StackPanel>
|
||||||
|
|
||||||
|
<StackPanel Grid.Row="5" Grid.Column="0" Orientation="Horizontal">
|
||||||
|
<TextBox Name="cestaVystupBox" Margin="0, 0, 5, 0" Width="360" VerticalContentAlignment="Center" FontSize="14"
|
||||||
|
Text="{Binding CestaVystup, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
|
||||||
|
<Button Name="cestaVystupButton" Content="" Foreground="DarkOrange" FontFamily="Segoe MDL2 Assets" FontSize="15" Width="40" Click="btnCestaVystupClick"/>
|
||||||
|
</StackPanel>
|
||||||
|
|
||||||
|
<StackPanel Grid.Row="6" Grid.Column="0" Orientation="Horizontal">
|
||||||
|
<Button Name="slucRozpisky" Content="Sloučit rozpisky" Width="180" Margin="10" Click="btnSlucRozpiskyClick" Foreground="Red"/>
|
||||||
|
<Button Name="Napoveda" Content="Nápověda" Width="180" Margin="10" Click="btnNapoveda"/>
|
||||||
|
</StackPanel>
|
||||||
|
|
||||||
|
|
||||||
|
</Grid>
|
||||||
|
</Window>
|
||||||
204
MainWindow.xaml.cs
Normal file
204
MainWindow.xaml.cs
Normal file
@ -0,0 +1,204 @@
|
|||||||
|
using Microsoft.Win32;
|
||||||
|
using System.ComponentModel;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.IO;
|
||||||
|
using System.Windows;
|
||||||
|
|
||||||
|
namespace SlucovaniRozpisek
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Interaction logic for MainWindow.xaml
|
||||||
|
/// </summary>
|
||||||
|
public partial class MainWindow : Window
|
||||||
|
{
|
||||||
|
public MainViewModel ViewModel { get; set; }
|
||||||
|
|
||||||
|
public MainWindow()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
ViewModel = new MainViewModel();
|
||||||
|
this.DataContext = ViewModel;
|
||||||
|
|
||||||
|
|
||||||
|
// jen pro testování
|
||||||
|
#if (DEBUG)
|
||||||
|
ViewModel.CestaPrilohy = "d:\\Přesunuté\\.NET\\Csharp_výuka\\SlucovaniPDF\\Přílohy";
|
||||||
|
ViewModel.CestaRozpisky = "d:\\Přesunuté\\.NET\\Csharp_výuka\\SlucovaniPDF\\Rozpisky";
|
||||||
|
ViewModel.CestaVystup = "d:\\Přesunuté\\.NET\\Csharp_výuka\\SlucovaniPDF\\Výstup";
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
private void btnCestaPrilohyClick(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
OpenFolderDialog folderDialog = new OpenFolderDialog();
|
||||||
|
folderDialog.Title = "Vyberte složku s přílohami";
|
||||||
|
|
||||||
|
if (folderDialog.ShowDialog() == true)
|
||||||
|
{
|
||||||
|
ViewModel.CestaPrilohy = folderDialog.FolderName;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void btnCestaRozpiskyClick(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
OpenFolderDialog folderDialog = new OpenFolderDialog();
|
||||||
|
folderDialog.Title = "Vyberte složku s rozpiskami";
|
||||||
|
|
||||||
|
if (folderDialog.ShowDialog() == true)
|
||||||
|
{
|
||||||
|
ViewModel.CestaRozpisky = folderDialog.FolderName;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void btnCestaVystupClick(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
OpenFolderDialog folderDialog = new OpenFolderDialog();
|
||||||
|
folderDialog.Title = "Vyberte výstupní složku";
|
||||||
|
|
||||||
|
if (folderDialog.ShowDialog() == true)
|
||||||
|
{
|
||||||
|
ViewModel.CestaVystup = folderDialog.FolderName;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void btnSlucRozpiskyClick(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
if (!Directory.Exists(ViewModel.CestaPrilohy))
|
||||||
|
{
|
||||||
|
MessageBox.Show("Složka s přílohami neexistuje,\nzadejte existující cestu.", "Kontrola složky",
|
||||||
|
MessageBoxButton.OK, MessageBoxImage.Error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!Directory.Exists(ViewModel.CestaRozpisky))
|
||||||
|
{
|
||||||
|
MessageBox.Show("Složka s rozpiskami neexistuje,\nzadejte existující cestu.", "Kontrola složky",
|
||||||
|
MessageBoxButton.OK, MessageBoxImage.Error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!Directory.Exists(ViewModel.CestaVystup))
|
||||||
|
{
|
||||||
|
MessageBox.Show("Výstupní složka neexistuje,\nzadejte existující cestu.", "Kontrola složky",
|
||||||
|
MessageBoxButton.OK, MessageBoxImage.Error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!PomocneMetody. ObsahujePdf(ViewModel.CestaPrilohy))
|
||||||
|
{
|
||||||
|
MessageBox.Show("Složka s přílohami neobsahuje žádná PDF,\nkterá by se mohla dát sloučit.", "Kontrola existence PDF",
|
||||||
|
MessageBoxButton.OK, MessageBoxImage.Warning);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
List<string> lstPrilohy = PomocneMetody.NactiPdfNazvyBezKoncovky(ViewModel.CestaPrilohy);
|
||||||
|
|
||||||
|
List<string> lstRozpisky = PomocneMetody.NactiPdfNazvyBezKoncovky(ViewModel.CestaRozpisky);
|
||||||
|
|
||||||
|
PdfRozdelovac pdfka = new PdfRozdelovac(lstPrilohy, lstRozpisky);
|
||||||
|
|
||||||
|
|
||||||
|
if (MessageBox.Show(pdfka.Zprava, "Přejete si pokračovat?",
|
||||||
|
MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.No)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
string cestaPrilohysLomitkem = PomocneMetody.NormalizujCestu(ViewModel.CestaPrilohy);
|
||||||
|
string cestaRozpiskysLomitkem = PomocneMetody.NormalizujCestu(ViewModel.CestaRozpisky);
|
||||||
|
string cestaVystupsLomitkem = PomocneMetody.NormalizujCestu(ViewModel.CestaVystup);
|
||||||
|
|
||||||
|
foreach (string pdf in pdfka.NeparovePrilohy)
|
||||||
|
{
|
||||||
|
PomocneMetody.KopirujSoubor(cestaPrilohysLomitkem + pdf + ".pdf", cestaVystupsLomitkem + pdf + ".pdf", true);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (string pdf in pdfka.NeparoveRozpisky)
|
||||||
|
{
|
||||||
|
PomocneMetody.KopirujSoubor(cestaRozpiskysLomitkem + pdf + ".pdf", cestaVystupsLomitkem + pdf + ".pdf", true);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (string pdf in pdfka.ParovePrilohy)
|
||||||
|
{
|
||||||
|
PomocneMetody.SloucitPdf(cestaPrilohysLomitkem + pdf + ".pdf", cestaRozpiskysLomitkem + pdf + "_rozpiska.pdf", cestaVystupsLomitkem + pdf + ".pdf", true);
|
||||||
|
}
|
||||||
|
|
||||||
|
MessageBox.Show("Rozpisky byly úspěšně sloučeny.", "Hotovo",
|
||||||
|
MessageBoxButton.OK, MessageBoxImage.Information);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void btnNapoveda(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
string helpFileName = "help.pdf"; // Název souboru s nápovědou
|
||||||
|
string helpFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, helpFileName);
|
||||||
|
|
||||||
|
if (File.Exists(helpFilePath))
|
||||||
|
{
|
||||||
|
Process.Start(new ProcessStartInfo(helpFilePath) { UseShellExecute = true });
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
MessageBox.Show("Soubor s nápovědou nebyl nalezen!", "Chyba", MessageBoxButton.OK, MessageBoxImage.Error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
MessageBox.Show($"Chyba při otevírání nápovědy: {ex.Message}", "Chyba", MessageBoxButton.OK, MessageBoxImage.Error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public class MainViewModel : INotifyPropertyChanged
|
||||||
|
{
|
||||||
|
private string _cestaPrilohy = string.Empty; // inicializace
|
||||||
|
public string CestaPrilohy
|
||||||
|
{
|
||||||
|
get { return _cestaPrilohy; }
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (_cestaPrilohy != value)
|
||||||
|
{
|
||||||
|
_cestaPrilohy = value;
|
||||||
|
OnPropertyChanged(nameof(CestaPrilohy));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private string _cestaRozpisky = string.Empty; // inicializace
|
||||||
|
public string CestaRozpisky
|
||||||
|
{
|
||||||
|
get { return _cestaRozpisky; }
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (_cestaRozpisky != value)
|
||||||
|
{
|
||||||
|
_cestaRozpisky = value;
|
||||||
|
OnPropertyChanged(nameof(CestaRozpisky));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private string _cestaVystup = string.Empty; // inicializace
|
||||||
|
public string CestaVystup
|
||||||
|
{
|
||||||
|
get { return _cestaVystup; }
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (_cestaVystup != value)
|
||||||
|
{
|
||||||
|
_cestaVystup = value;
|
||||||
|
OnPropertyChanged(nameof(CestaVystup));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public event PropertyChangedEventHandler? PropertyChanged; // nullable event
|
||||||
|
protected void OnPropertyChanged(string propertyName)
|
||||||
|
{
|
||||||
|
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
40
PdfRozdelovac.cs
Normal file
40
PdfRozdelovac.cs
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
namespace SlucovaniRozpisek
|
||||||
|
{
|
||||||
|
public class PdfRozdelovac
|
||||||
|
{
|
||||||
|
public List<string> ParovePrilohy { get; private set; }
|
||||||
|
public List<string> NeparovePrilohy { get; private set; }
|
||||||
|
public List<string> NeparoveRozpisky { get; private set; }
|
||||||
|
public string Zprava { get; private set; }
|
||||||
|
|
||||||
|
public PdfRozdelovac(List<string> lstPrilohy, List<string> lstRozpisky)
|
||||||
|
{
|
||||||
|
ParovePrilohy = new List<string>();
|
||||||
|
NeparovePrilohy = new List<string>();
|
||||||
|
NeparoveRozpisky = new List<string>(lstRozpisky);
|
||||||
|
Zprava = string.Empty;
|
||||||
|
RozdelPdfSoubor(lstPrilohy, lstRozpisky);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void RozdelPdfSoubor(List<string> lstPrilohy, List<string> lstRozpisky)
|
||||||
|
{
|
||||||
|
foreach (var priloha in lstPrilohy)
|
||||||
|
{
|
||||||
|
string rozpiska = priloha + "_rozpiska";
|
||||||
|
if (lstRozpisky.Contains(rozpiska))
|
||||||
|
{
|
||||||
|
ParovePrilohy.Add(priloha);
|
||||||
|
NeparoveRozpisky.Remove(rozpiska);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NeparovePrilohy.Add(priloha);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
NeparoveRozpisky = NeparoveRozpisky.Where(r => !r.EndsWith("_rozpiska")).ToList();
|
||||||
|
|
||||||
|
Zprava = $"Počet párových příloh: {ParovePrilohy.Count}\nPočet nepárových příloh: {NeparovePrilohy.Count}\nPočet nepárových rozpisek: {NeparoveRozpisky.Count}";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
138
PomocneMetody.cs
Normal file
138
PomocneMetody.cs
Normal file
@ -0,0 +1,138 @@
|
|||||||
|
using System.IO;
|
||||||
|
using System.Windows;
|
||||||
|
using PdfSharp.Pdf;
|
||||||
|
using PdfSharp.Pdf.IO;
|
||||||
|
using PdfSharp.Drawing;
|
||||||
|
|
||||||
|
public static class PomocneMetody
|
||||||
|
{
|
||||||
|
public static bool ObsahujePdf(string cestaSlozky)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrWhiteSpace(cestaSlozky) || !Directory.Exists(cestaSlozky))
|
||||||
|
{
|
||||||
|
throw new ArgumentException("Neplatná cesta ke složce.", nameof(cestaSlozky));
|
||||||
|
}
|
||||||
|
|
||||||
|
return Directory.GetFiles(cestaSlozky, "*.pdf").Length > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<string> NactiPdfZeSlozky(string cestaSlozky)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrWhiteSpace(cestaSlozky) || !Directory.Exists(cestaSlozky))
|
||||||
|
{
|
||||||
|
throw new ArgumentException("Neplatná cesta ke složce.", nameof(cestaSlozky));
|
||||||
|
}
|
||||||
|
|
||||||
|
return Directory.GetFiles(cestaSlozky, "*.pdf")
|
||||||
|
.Select(f => Path.GetFileName(f) ?? string.Empty)
|
||||||
|
.Where(f => !string.IsNullOrEmpty(f))
|
||||||
|
.ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<string> NactiPdfNazvyBezKoncovky(string cestaSlozky)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrWhiteSpace(cestaSlozky) || !Directory.Exists(cestaSlozky))
|
||||||
|
{
|
||||||
|
throw new ArgumentException("Neplatná cesta ke složce.", nameof(cestaSlozky));
|
||||||
|
}
|
||||||
|
|
||||||
|
return Directory.GetFiles(cestaSlozky, "*.pdf")
|
||||||
|
.Select(f => Path.GetFileNameWithoutExtension(f) ?? string.Empty)
|
||||||
|
.Where(f => !string.IsNullOrEmpty(f))
|
||||||
|
.ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string NormalizujCestu(string cesta)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrWhiteSpace(cesta))
|
||||||
|
{
|
||||||
|
throw new ArgumentException("Neplatná cesta ke složce.", nameof(cesta));
|
||||||
|
}
|
||||||
|
|
||||||
|
return cesta.EndsWith(Path.DirectorySeparatorChar) ? cesta : cesta + Path.DirectorySeparatorChar;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void KopirujSoubor(string zdrojovySoubor, string cilovySoubor, bool prepsatExistujici)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrWhiteSpace(zdrojovySoubor) || string.IsNullOrWhiteSpace(cilovySoubor))
|
||||||
|
{
|
||||||
|
throw new ArgumentException("Neplatná cesta ke zdrojovému nebo cílovému souboru.");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!File.Exists(zdrojovySoubor))
|
||||||
|
{
|
||||||
|
throw new FileNotFoundException("Zdrojový soubor neexistuje.", zdrojovySoubor);
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (File.Exists(cilovySoubor))
|
||||||
|
{
|
||||||
|
if (prepsatExistujici)
|
||||||
|
{
|
||||||
|
File.Copy(zdrojovySoubor, cilovySoubor, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
File.Copy(zdrojovySoubor, cilovySoubor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (IOException ex)
|
||||||
|
{
|
||||||
|
MessageBox.Show($"Chyba při kopírování souboru {zdrojovySoubor}: {ex.Message}", "Chyba", MessageBoxButton.OK, MessageBoxImage.Error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void SloucitPdf(string pdfJedna, string pdfDva, string vystupniPdf, bool prepsatExistujici)
|
||||||
|
{
|
||||||
|
if (!File.Exists(pdfJedna) || !File.Exists(pdfDva))
|
||||||
|
{
|
||||||
|
throw new FileNotFoundException("Jeden nebo oba vstupní PDF soubory neexistují.");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (File.Exists(vystupniPdf) && !prepsatExistujici)
|
||||||
|
{
|
||||||
|
throw new IOException("Výstupní PDF již existuje a přepsání není povoleno.");
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
using (PdfDocument docJedna = PdfReader.Open(pdfJedna, PdfDocumentOpenMode.Modify))
|
||||||
|
{
|
||||||
|
var strankaJedna = docJedna.Pages[0];
|
||||||
|
double sirkaJedna = strankaJedna.Width.Value;
|
||||||
|
double vyskaJedna = strankaJedna.Height.Value;
|
||||||
|
|
||||||
|
using (PdfDocument docDva = PdfReader.Open(pdfDva, PdfDocumentOpenMode.Import))
|
||||||
|
{
|
||||||
|
if (docDva.PageCount > 0)
|
||||||
|
{
|
||||||
|
XPdfForm form = XPdfForm.FromFile(pdfDva);
|
||||||
|
form.PageNumber = 1;
|
||||||
|
var strankaDva = docDva.Pages[0];
|
||||||
|
double sirkaDva = strankaDva.Width.Value;
|
||||||
|
double vyskaDva = strankaDva.Height.Value;
|
||||||
|
|
||||||
|
XRect pozice = new XRect(sirkaJedna - sirkaDva, vyskaJedna - vyskaDva, sirkaDva, vyskaDva);
|
||||||
|
|
||||||
|
using (XGraphics gfx = XGraphics.FromPdfPage(strankaJedna, XGraphicsPdfPageOptions.Prepend))
|
||||||
|
{
|
||||||
|
gfx.DrawImage(form, pozice);
|
||||||
|
}
|
||||||
|
|
||||||
|
docJedna.Save(vystupniPdf);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
MessageBox.Show("Druhý PDF dokument neobsahuje žádné stránky.", "Chyba", MessageBoxButton.OK, MessageBoxImage.Warning);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (IOException ex)
|
||||||
|
{
|
||||||
|
MessageBox.Show($"Chyba při práci s PDF soubory: {ex.Message}", "Chyba", MessageBoxButton.OK, MessageBoxImage.Error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
43
SlucovaniRozpisek.csproj
Normal file
43
SlucovaniRozpisek.csproj
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>WinExe</OutputType>
|
||||||
|
<TargetFramework>net8.0-windows</TargetFramework>
|
||||||
|
<RootNamespace>SlucovaniRozpisek</RootNamespace>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<UseWPF>true</UseWPF>
|
||||||
|
<UseWindowsForms>False</UseWindowsForms>
|
||||||
|
<ApplicationIcon>icopdf.ico</ApplicationIcon>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<None Remove="icopdf.ico" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Content Include="icopdf.ico">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</Content>
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="PDFsharp" Version="6.1.1">
|
||||||
|
<PrivateAssets></PrivateAssets>
|
||||||
|
</PackageReference>
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<None Update="help.pdf">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Page Update="MainWindow.xaml">
|
||||||
|
<Generator>XamlIntelliSenseFileGenerator</Generator>
|
||||||
|
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
|
||||||
|
</Page>
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
25
Slučování rozpisek.sln
Normal file
25
Slučování rozpisek.sln
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
|
# Visual Studio Version 17
|
||||||
|
VisualStudioVersion = 17.9.34728.123
|
||||||
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SlucovaniRozpisek", "SlucovaniRozpisek.csproj", "{275156B7-2F2D-4B71-99F8-8AB1A86BEF38}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|Any CPU = Debug|Any CPU
|
||||||
|
Release|Any CPU = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{275156B7-2F2D-4B71-99F8-8AB1A86BEF38}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{275156B7-2F2D-4B71-99F8-8AB1A86BEF38}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{275156B7-2F2D-4B71-99F8-8AB1A86BEF38}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{275156B7-2F2D-4B71-99F8-8AB1A86BEF38}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
|
SolutionGuid = {4539D8DF-ECA2-4E4E-A93F-51090E61F4B6}
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
||||||
BIN
icopdf.ico
Normal file
BIN
icopdf.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 100 KiB |
Loading…
Reference in New Issue
Block a user