Inicial
This commit is contained in:
25
UtilitatPdf.sln
Normal file
25
UtilitatPdf.sln
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
|
# Visual Studio Version 16
|
||||||
|
VisualStudioVersion = 16.0.30717.126
|
||||||
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UtilitatPdf", "UtilitatPdf\UtilitatPdf.csproj", "{A9DF4881-D24E-47F7-BA67-3DFC73ECE9FD}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|Any CPU = Debug|Any CPU
|
||||||
|
Release|Any CPU = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{A9DF4881-D24E-47F7-BA67-3DFC73ECE9FD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{A9DF4881-D24E-47F7-BA67-3DFC73ECE9FD}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{A9DF4881-D24E-47F7-BA67-3DFC73ECE9FD}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{A9DF4881-D24E-47F7-BA67-3DFC73ECE9FD}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
|
SolutionGuid = {B8A8AFEB-F7F6-49A6-A01F-39778DA34AC2}
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
||||||
9
UtilitatPdf/App.xaml
Normal file
9
UtilitatPdf/App.xaml
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<Application x:Class="UtilitatPdf.App"
|
||||||
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:local="clr-namespace:UtilitatPdf"
|
||||||
|
StartupUri="MainWindow.xaml">
|
||||||
|
<Application.Resources>
|
||||||
|
|
||||||
|
</Application.Resources>
|
||||||
|
</Application>
|
||||||
17
UtilitatPdf/App.xaml.cs
Normal file
17
UtilitatPdf/App.xaml.cs
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Configuration;
|
||||||
|
using System.Data;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Windows;
|
||||||
|
|
||||||
|
namespace UtilitatPdf
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Interaction logic for App.xaml
|
||||||
|
/// </summary>
|
||||||
|
public partial class App : Application
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
10
UtilitatPdf/AssemblyInfo.cs
Normal file
10
UtilitatPdf/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)
|
||||||
|
)]
|
||||||
80
UtilitatPdf/MainWindow.xaml
Normal file
80
UtilitatPdf/MainWindow.xaml
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
<Window x:Class="UtilitatPdf.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:UtilitatPdf"
|
||||||
|
mc:Ignorable="d"
|
||||||
|
Loaded="Window_Loaded"
|
||||||
|
Title="Utilitats Pdf" Height="450" Width="550" Icon="pdf.ico" WindowStartupLocation="CenterScreen" ResizeMode="NoResize">
|
||||||
|
|
||||||
|
<TabControl>
|
||||||
|
<TabItem Header="Merge PDF">
|
||||||
|
<Grid>
|
||||||
|
<StackPanel>
|
||||||
|
<Button x:Name="AfegirPdf" Content="Afegir Fitxers" Margin="0,10,0,10" Height="30" Width="180" HorizontalAlignment="Center" Click="SelectOpenFile_Button_Click"/>
|
||||||
|
<ListView x:Name="MyListView" Height="190" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
|
||||||
|
<ListView.View>
|
||||||
|
<GridView AllowsColumnReorder="true" ColumnHeaderToolTip="Arxius Pdf a Fusionar">
|
||||||
|
<GridViewColumn Header="Arxius a fusionar" Width="460">
|
||||||
|
<GridViewColumn.CellTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<StackPanel Width="300" >
|
||||||
|
<TextBlock Text="{Binding FileName}"/>
|
||||||
|
</StackPanel>
|
||||||
|
</DataTemplate>
|
||||||
|
</GridViewColumn.CellTemplate>
|
||||||
|
</GridViewColumn>
|
||||||
|
<GridViewColumn x:Name="gridClm_SelectRow" Width="90">
|
||||||
|
<GridViewColumn.CellTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<Button x:Name="btnDelete"
|
||||||
|
BorderThickness="0"
|
||||||
|
Tag="{Binding Index}"
|
||||||
|
HorizontalAlignment="Left"
|
||||||
|
VerticalAlignment="Top"
|
||||||
|
Click="btnDelete_Click">
|
||||||
|
<StackPanel>
|
||||||
|
<Image Source="delete.png" Width="20" Height="20" />
|
||||||
|
</StackPanel>
|
||||||
|
<Button.Background>
|
||||||
|
<SolidColorBrush Color="Gray" Opacity="0.0" />
|
||||||
|
</Button.Background>
|
||||||
|
</Button>
|
||||||
|
</DataTemplate>
|
||||||
|
</GridViewColumn.CellTemplate>
|
||||||
|
</GridViewColumn>
|
||||||
|
</GridView>
|
||||||
|
</ListView.View>
|
||||||
|
</ListView>
|
||||||
|
<Separator Height="10" Margin="15,15,15,0"/>
|
||||||
|
<DockPanel Margin="0,15,0,0">
|
||||||
|
<TextBlock Margin="5,0,0,0" Width="60">Destinació:</TextBlock>
|
||||||
|
<TextBox x:Name="MergeFileOut" Margin="20,0,0,0" Height="23" Width="400"/>
|
||||||
|
<Button x:Name="SelectFile7" Margin="0,0,0,0" Width="30" Click="SelectSaveFile_Button_Click">...</Button>
|
||||||
|
</DockPanel>
|
||||||
|
|
||||||
|
<Button Margin="130,30,130,0" Height="30" Click="MergeFile_Button_Click">Fusionar</Button>
|
||||||
|
|
||||||
|
</StackPanel>
|
||||||
|
</Grid>
|
||||||
|
</TabItem>
|
||||||
|
<TabItem Header="Treure Signatura">
|
||||||
|
<Grid>
|
||||||
|
<StackPanel Margin="0,20,0,0">
|
||||||
|
<DockPanel>
|
||||||
|
<TextBlock Width="60" Margin="5,0,0,0" HorizontalAlignment="Right">Origen:</TextBlock>
|
||||||
|
<TextBox x:Name="InSignFile" Margin="20,0,0,0" Height="23" Width="400"/>
|
||||||
|
<Button x:Name="SelectFile5" Margin="0,0,0,0" Width="30" Click="SelectOpenFile_Button_Click">...</Button>
|
||||||
|
</DockPanel>
|
||||||
|
<DockPanel Margin="0,15,0,0">
|
||||||
|
<TextBlock Width="60" Margin="5,0,0,0" HorizontalAlignment="Right">Destinació:</TextBlock>
|
||||||
|
<TextBox x:Name="OutSignFile" Margin="20,0,0,0" Height="23" Width="400"/>
|
||||||
|
<Button x:Name="SelectFile6" Margin="0,0,0,0" Width="30" Click="SelectSaveFile_Button_Click">...</Button>
|
||||||
|
</DockPanel>
|
||||||
|
<Button Margin="130,30,130,0" Height="30" Click="RemoveSign_Button_Click">Treure Signatura</Button>
|
||||||
|
</StackPanel>
|
||||||
|
</Grid>
|
||||||
|
</TabItem>
|
||||||
|
</TabControl>
|
||||||
|
</Window>
|
||||||
286
UtilitatPdf/MainWindow.xaml.cs
Normal file
286
UtilitatPdf/MainWindow.xaml.cs
Normal file
@@ -0,0 +1,286 @@
|
|||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using System.Windows;
|
||||||
|
using Microsoft.Win32;
|
||||||
|
using iText.Kernel.Pdf;
|
||||||
|
using iText.Forms;
|
||||||
|
using iText.Signatures;
|
||||||
|
using iText.Kernel.Pdf.Annot;
|
||||||
|
using iText.Forms.Fields;
|
||||||
|
using Org.BouncyCastle.X509;
|
||||||
|
using iText.Kernel.Pdf.Xobject;
|
||||||
|
using iText.Kernel.Pdf.Canvas.Parser.Listener;
|
||||||
|
using iText.Kernel.Pdf.Canvas.Parser;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
|
using iText.Layout.Element;
|
||||||
|
using Paragraph = iText.Layout.Element.Paragraph;
|
||||||
|
using Rectangle = iText.Kernel.Geom.Rectangle;
|
||||||
|
using System.Windows.Controls;
|
||||||
|
using Canvas = iText.Layout.Canvas;
|
||||||
|
using System.Collections.ObjectModel;
|
||||||
|
|
||||||
|
namespace UtilitatPdf
|
||||||
|
{
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Interaction logic for MainWindow.xaml
|
||||||
|
/// </summary>
|
||||||
|
public partial class MainWindow : Window
|
||||||
|
{
|
||||||
|
ObservableCollection<PdfInfo> list = new ObservableCollection<PdfInfo>();
|
||||||
|
public MainWindow()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
}
|
||||||
|
#region ButtonText
|
||||||
|
private void SelectOpenFile_Button_Click(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
string content = (sender as Button).Name;
|
||||||
|
string FileSelected = SelectOpenPDFile();
|
||||||
|
if(content == "AfegirPdf")
|
||||||
|
{
|
||||||
|
if (!string.IsNullOrEmpty(FileSelected))
|
||||||
|
{
|
||||||
|
list.Add(new PdfInfo(FileSelected));
|
||||||
|
SetOrder(list);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(content == "SelectFile5")
|
||||||
|
{
|
||||||
|
InSignFile.Text = FileSelected;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private void SelectSaveFile_Button_Click(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
string content = (sender as Button).Name;
|
||||||
|
string FileSelected = SaveFileDialog();
|
||||||
|
if (content == "SelectFile6")
|
||||||
|
{
|
||||||
|
OutSignFile.Text = FileSelected;
|
||||||
|
}
|
||||||
|
else if (content == "SelectFile7")
|
||||||
|
{
|
||||||
|
MergeFileOut.Text = FileSelected;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
public void SetOrder(ObservableCollection<PdfInfo> data)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < data.Count; i++)
|
||||||
|
{
|
||||||
|
PdfInfo ei = (PdfInfo)data[i];
|
||||||
|
ei.Index = i.ToString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void btnDelete_Click(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
Button btn = (Button)sender;
|
||||||
|
int index = int.Parse(btn.Tag.ToString());
|
||||||
|
list.RemoveAt(index);
|
||||||
|
SetOrder(list);
|
||||||
|
MyListView.ItemsSource = null;
|
||||||
|
MyListView.ItemsSource = list;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Window_Loaded(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
MyListView.ItemsSource = list;
|
||||||
|
}
|
||||||
|
|
||||||
|
#region ActionsRegion
|
||||||
|
private void MergeFile_Button_Click(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
if (list.Count == 0)
|
||||||
|
{
|
||||||
|
MessageBox.Show("Per a poder fusionar, has de seleccionar un fitxer com a mínim", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
string FinalPdfFile = MergeFileOut.Text;
|
||||||
|
if (string.IsNullOrEmpty(FinalPdfFile))
|
||||||
|
{
|
||||||
|
MessageBox.Show("El Fitxer de destí no pot estar buit.", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
FileInfo currentFile = new FileInfo(FinalPdfFile);
|
||||||
|
if (currentFile.Exists) File.Delete(FinalPdfFile);
|
||||||
|
if(list.Count == 1)
|
||||||
|
{
|
||||||
|
File.Copy(list[0].FileName, FinalPdfFile);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
PdfMergeFiles mClas = new PdfMergeFiles(FinalPdfFile);
|
||||||
|
|
||||||
|
foreach (PdfInfo fi in list)
|
||||||
|
{
|
||||||
|
mClas.AddFile(fi.FileName);
|
||||||
|
}
|
||||||
|
mClas.Copy();
|
||||||
|
}
|
||||||
|
catch (IOException ex)
|
||||||
|
{
|
||||||
|
MessageBox.Show("S'ha produit un error quan s'intentava escriure el fitxer:\n" + ex.Message,"Error", MessageBoxButton.OK,MessageBoxImage.Error);
|
||||||
|
}
|
||||||
|
catch(Exception exc)
|
||||||
|
{
|
||||||
|
MessageBox.Show("S'ha produit un error desconegut:\n" + exc.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
MergeFileOut.Text = string.Empty;
|
||||||
|
list.Clear();
|
||||||
|
MessageBox.Show("S'han fusionat correctament el fitxers.", "Info", MessageBoxButton.OK, MessageBoxImage.Information);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private void RemoveSign_Button_Click(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(InSignFile.Text) || string.IsNullOrEmpty(OutSignFile.Text))
|
||||||
|
{
|
||||||
|
MessageBox.Show("Has de seleccioner l'arxiu d'origen i destí.", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (ManipulatePdf(InSignFile.Text, OutSignFile.Text))
|
||||||
|
{
|
||||||
|
InSignFile.Text = string.Empty;
|
||||||
|
OutSignFile.Text = string.Empty;
|
||||||
|
MessageBox.Show("S'ha ocultat el Cif/Nif de les signatures del document.", "Info", MessageBoxButton.OK, MessageBoxImage.Information);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
#region File Dialogs
|
||||||
|
private string SaveFileDialog()
|
||||||
|
{
|
||||||
|
SaveFileDialog saveFileDialog = new SaveFileDialog();
|
||||||
|
saveFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
|
||||||
|
saveFileDialog.Filter = "pdf files (*.pdf)|*.pdf";
|
||||||
|
saveFileDialog.FilterIndex = 2;
|
||||||
|
if (saveFileDialog.ShowDialog() == true)
|
||||||
|
{
|
||||||
|
return saveFileDialog.FileName;
|
||||||
|
}
|
||||||
|
|
||||||
|
return string.Empty;
|
||||||
|
}
|
||||||
|
|
||||||
|
private string SelectOpenPDFile()
|
||||||
|
{
|
||||||
|
string fichero = string.Empty;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
OpenFileDialog openFileDialog = new OpenFileDialog();
|
||||||
|
openFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
|
||||||
|
openFileDialog.Filter = "pdf files (*.pdf)|*.pdf";
|
||||||
|
openFileDialog.FilterIndex = 2;
|
||||||
|
openFileDialog.RestoreDirectory = true;
|
||||||
|
|
||||||
|
if (openFileDialog.ShowDialog() == true)
|
||||||
|
{
|
||||||
|
fichero = openFileDialog.FileName;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
MessageBox.Show("Error: No es pot llegir el fitxer del disc.\n Original error: " + ex.Message);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return fichero;
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
#region RemoveSignature
|
||||||
|
private bool ManipulatePdf(string resource, string result)
|
||||||
|
{
|
||||||
|
string patronCif = @"([a-zA-Z]-?[0-9]{8})";
|
||||||
|
string patronNif = @"([0-9]{8}-?[a-zA-Z])";
|
||||||
|
string cleanRegex = string.Empty;
|
||||||
|
string widgetText = string.Empty;
|
||||||
|
bool doneOk = false;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
using (PdfReader pdfReader = new PdfReader(resource))
|
||||||
|
using (PdfWriter pdfWriter = new PdfWriter(result))
|
||||||
|
using (PdfDocument pdfDocument = new PdfDocument(pdfReader, pdfWriter))
|
||||||
|
{
|
||||||
|
SignatureUtil signatureUtil = new SignatureUtil(pdfDocument);
|
||||||
|
PdfAcroForm acroForm = PdfAcroForm.GetAcroForm(pdfDocument, false);
|
||||||
|
|
||||||
|
foreach (String name in signatureUtil.GetSignatureNames())
|
||||||
|
{
|
||||||
|
PdfPKCS7 pkcs7 = signatureUtil.ReadSignatureData(name);
|
||||||
|
X509Certificate signerCert = (X509Certificate)pkcs7.GetSigningCertificate();
|
||||||
|
String signerName = CertificateInfo.GetSubjectFields(signerCert).GetField("CN");
|
||||||
|
PdfFormField field = acroForm.GetField(name);
|
||||||
|
field.SetModified();
|
||||||
|
foreach (PdfWidgetAnnotation pdfWidgetAnnotation in field.GetWidgets())
|
||||||
|
{
|
||||||
|
widgetText = extractText(pdfWidgetAnnotation);
|
||||||
|
|
||||||
|
Regex regCif = new Regex(patronCif);
|
||||||
|
Regex regNif = new Regex(patronNif);
|
||||||
|
|
||||||
|
MatchCollection matchesCif = regCif.Matches(widgetText);
|
||||||
|
MatchCollection matchesNif = regNif.Matches(widgetText);
|
||||||
|
|
||||||
|
if (matchesCif.Count > 0 || matchesNif.Count > 0)
|
||||||
|
{
|
||||||
|
|
||||||
|
cleanRegex = Regex.Replace(widgetText, patronCif, "<NIF_EDITAT>");
|
||||||
|
cleanRegex = Regex.Replace(cleanRegex, patronNif, "<NIF_EDITAT>");
|
||||||
|
|
||||||
|
PdfArray annotationRect = pdfWidgetAnnotation.GetRectangle();
|
||||||
|
pdfWidgetAnnotation.SetRectangle(annotationRect);
|
||||||
|
|
||||||
|
PdfFormXObject form = new PdfFormXObject(new Rectangle(annotationRect.ToRectangle()));
|
||||||
|
Canvas canvas = new Canvas(form, pdfDocument);
|
||||||
|
canvas.Add(CreateNewCell(cleanRegex.Replace("\n", "").Replace("\r", "")).SetFontSize(7));
|
||||||
|
|
||||||
|
pdfWidgetAnnotation.SetNormalAppearance(form.GetPdfObject());
|
||||||
|
}
|
||||||
|
acroForm.PartialFormFlattening(name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
acroForm.FlattenFields();
|
||||||
|
doneOk = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (IOException ioException)
|
||||||
|
{
|
||||||
|
MessageBox.Show("S'ha produit un error:\n" + ioException.Message, "Eror", MessageBoxButton.OK, MessageBoxImage.Error);
|
||||||
|
}
|
||||||
|
|
||||||
|
return doneOk;
|
||||||
|
}
|
||||||
|
private static Cell CreateNewCell(string texto)
|
||||||
|
{
|
||||||
|
Cell celda = new Cell();
|
||||||
|
Paragraph p = new Paragraph(texto);
|
||||||
|
celda.Add(p);
|
||||||
|
return celda;
|
||||||
|
}
|
||||||
|
private String extractText(PdfWidgetAnnotation pdfWidgetAnnotation)
|
||||||
|
{
|
||||||
|
PdfDictionary normal = pdfWidgetAnnotation.GetNormalAppearanceObject();
|
||||||
|
if (normal is PdfStream appearance)
|
||||||
|
{
|
||||||
|
PdfDictionary resourceDictionary = appearance.GetAsDictionary(PdfName.Resources);
|
||||||
|
PdfResources resources = resourceDictionary != null ? new PdfResources(resourceDictionary) : new PdfResources();
|
||||||
|
ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy();
|
||||||
|
PdfCanvasProcessor parser = new PdfCanvasProcessor(strategy);
|
||||||
|
parser.ProcessContent(appearance.GetBytes(), resources);
|
||||||
|
return strategy.GetResultantText();
|
||||||
|
}
|
||||||
|
return string.Empty;
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
} // END Window Class
|
||||||
|
|
||||||
|
|
||||||
|
} // END Namespace
|
||||||
24
UtilitatPdf/PdfInfo.cs
Normal file
24
UtilitatPdf/PdfInfo.cs
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
|
||||||
|
namespace UtilitatPdf
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Class for ListView Filenames
|
||||||
|
/// </summary>
|
||||||
|
public class PdfInfo
|
||||||
|
{
|
||||||
|
private string _fileName;
|
||||||
|
public string FileName
|
||||||
|
{
|
||||||
|
get { return _fileName; }
|
||||||
|
set { _fileName = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public string Index { set; get; }
|
||||||
|
|
||||||
|
|
||||||
|
public PdfInfo(string filename)
|
||||||
|
{
|
||||||
|
_fileName = filename;
|
||||||
|
}
|
||||||
|
} // END PdfInfo Class
|
||||||
|
}
|
||||||
100
UtilitatPdf/PdfMergeFiles.cs
Normal file
100
UtilitatPdf/PdfMergeFiles.cs
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using iText.Kernel.Pdf;
|
||||||
|
using iText.Kernel.Utils;
|
||||||
|
|
||||||
|
namespace UtilitatPdf
|
||||||
|
{
|
||||||
|
public class PdfMergeFiles
|
||||||
|
{
|
||||||
|
private PdfDocument _pdfDocument = null;
|
||||||
|
private PdfDocument _pdfDocument2 = null;
|
||||||
|
private PdfMerger _pdfMerger = null;
|
||||||
|
|
||||||
|
private static string tmpFolder = System.IO.Path.GetTempPath();
|
||||||
|
private string _oldtmpFile = string.Empty;
|
||||||
|
private string _tmpFile = string.Empty;
|
||||||
|
private string _tmpFile2 = string.Empty;
|
||||||
|
private bool _mergeOK = false;
|
||||||
|
private string _FinalPdfFile = string.Empty;
|
||||||
|
|
||||||
|
public PdfMergeFiles(string FinalPdfFile, bool DeleteIfExists = true)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(FinalPdfFile))
|
||||||
|
{
|
||||||
|
throw new Exception();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_FinalPdfFile = FinalPdfFile;
|
||||||
|
if (DeleteIfExists)
|
||||||
|
{
|
||||||
|
if (new FileInfo(_FinalPdfFile).Exists) File.Delete(_FinalPdfFile);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public bool AddFile(string PdfFilename)
|
||||||
|
{
|
||||||
|
checkVars(PdfFilename);
|
||||||
|
|
||||||
|
if (_mergeOK)
|
||||||
|
{
|
||||||
|
Random numr = new Random();
|
||||||
|
_oldtmpFile = tmpFolder + numr.Next(1, 99999).ToString() + "tmpfile.pdf";
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
_pdfDocument = new PdfDocument(new PdfReader(_tmpFile), new PdfWriter(_oldtmpFile), new StampingProperties().UseAppendMode());
|
||||||
|
|
||||||
|
_pdfDocument2 = new PdfDocument(new PdfReader(_tmpFile2));
|
||||||
|
|
||||||
|
_pdfMerger = new PdfMerger(_pdfDocument);
|
||||||
|
_pdfMerger.Merge(_pdfDocument2, 1, _pdfDocument2.GetNumberOfPages());
|
||||||
|
|
||||||
|
this.Close();
|
||||||
|
}
|
||||||
|
catch (IOException)
|
||||||
|
{
|
||||||
|
throw new IOException();
|
||||||
|
}
|
||||||
|
catch(Exception)
|
||||||
|
{
|
||||||
|
throw new Exception();
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
_tmpFile = _oldtmpFile;
|
||||||
|
_tmpFile2 = string.Empty;
|
||||||
|
_oldtmpFile = string.Empty;
|
||||||
|
_mergeOK = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
public void Copy()
|
||||||
|
{
|
||||||
|
File.Copy(_tmpFile, _FinalPdfFile);
|
||||||
|
}
|
||||||
|
private void Close()
|
||||||
|
{
|
||||||
|
_pdfDocument?.Close();
|
||||||
|
_pdfDocument2?.Close();
|
||||||
|
_pdfMerger?.Close();
|
||||||
|
}
|
||||||
|
private void checkVars(string file)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(_tmpFile))
|
||||||
|
{
|
||||||
|
_tmpFile = file;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_tmpFile2 = file;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(_tmpFile) && !string.IsNullOrEmpty(_tmpFile2)) _mergeOK = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
17
UtilitatPdf/Properties/PublishProfiles/FolderProfile.pubxml
Normal file
17
UtilitatPdf/Properties/PublishProfiles/FolderProfile.pubxml
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
https://go.microsoft.com/fwlink/?LinkID=208121.
|
||||||
|
-->
|
||||||
|
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup>
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>Any CPU</Platform>
|
||||||
|
<PublishDir>C:\Users\Vicente\git-repos\UtilitatPdf\bin</PublishDir>
|
||||||
|
<PublishProtocol>FileSystem</PublishProtocol>
|
||||||
|
<TargetFramework>netcoreapp3.1</TargetFramework>
|
||||||
|
<SelfContained>false</SelfContained>
|
||||||
|
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
|
||||||
|
<PublishSingleFile>True</PublishSingleFile>
|
||||||
|
<PublishReadyToRun>False</PublishReadyToRun>
|
||||||
|
</PropertyGroup>
|
||||||
|
</Project>
|
||||||
33
UtilitatPdf/UtilitatPdf.csproj
Normal file
33
UtilitatPdf/UtilitatPdf.csproj
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>WinExe</OutputType>
|
||||||
|
<TargetFramework>netcoreapp3.1</TargetFramework>
|
||||||
|
<UseWPF>true</UseWPF>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
|
||||||
|
<DebugType>embedded</DebugType>
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||||
|
<DebugType>embedded</DebugType>
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<None Remove="delete.png" />
|
||||||
|
<None Remove="pdf.ico" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="itext7" Version="7.1.13" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Resource Include="delete.png" />
|
||||||
|
<Resource Include="pdf.ico" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
BIN
UtilitatPdf/delete.png
Normal file
BIN
UtilitatPdf/delete.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1006 B |
BIN
UtilitatPdf/pdf.ico
Normal file
BIN
UtilitatPdf/pdf.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 444 KiB |
Reference in New Issue
Block a user