initial commit

This commit is contained in:
tomse 2023-12-21 01:31:35 +01:00
commit 220437e651
75 changed files with 6080 additions and 0 deletions

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,28 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.26430.14
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "05-AddMeta", "05-AddMeta\05-AddMeta.csproj", "{00A533D9-32DC-4A37-A202-322F15614B2F}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|x64 = Debug|x64
Release|Any CPU = Release|Any CPU
Release|x64 = Release|x64
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{00A533D9-32DC-4A37-A202-322F15614B2F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{00A533D9-32DC-4A37-A202-322F15614B2F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{00A533D9-32DC-4A37-A202-322F15614B2F}.Debug|x64.ActiveCfg = Debug|x64
{00A533D9-32DC-4A37-A202-322F15614B2F}.Debug|x64.Build.0 = Debug|x64
{00A533D9-32DC-4A37-A202-322F15614B2F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{00A533D9-32DC-4A37-A202-322F15614B2F}.Release|Any CPU.Build.0 = Release|Any CPU
{00A533D9-32DC-4A37-A202-322F15614B2F}.Release|x64.ActiveCfg = Release|x64
{00A533D9-32DC-4A37-A202-322F15614B2F}.Release|x64.Build.0 = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

View File

@ -0,0 +1,72 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{00A533D9-32DC-4A37-A202-322F15614B2F}</ProjectGuid>
<OutputType>Exe</OutputType>
<RootNamespace>_05_AddMeta</RootNamespace>
<AssemblyName>05-AddMeta</AssemblyName>
<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x64\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugType>full</DebugType>
<PlatformTarget>x64</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
<OutputPath>bin\x64\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<Optimize>true</Optimize>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x64</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup>
</configuration>

View File

@ -0,0 +1,306 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
namespace _05_AddMeta
{
class Program
{
static void Main(string[] args)
{
if (args.Length!=0)
{
foreach(string s in args)
{
string text = "Copyright (c) 2017 Retro-Commodore.eu pdf creating help utility" + Environment.NewLine;
switch (s)
{
case "-help":
text += "-help Help text";
break;
case "-v":
text += "Version 0.01" + Environment.NewLine;
break;
case "-meta":
add_meta_to_pdfs();
break;
case "-extract":
extract_pages_from_pdfs();
break;
case "-g4compress":
g4compress();
break;
case "-makepdf":
make_pdfs_in_dirs();
break;
case "-createtorrent":
create_torrent();
break;
default:
break;
}
Console.WriteLine(text);
}
}
extract_pages_from_pdfs();
//g4compress();
// make_pdfs_in_dirs();
//add_meta_to_pdfs();
// create_torrent();
Console.WriteLine("Jobs done...");
Console.ReadKey();
}
public static void add_meta_to_file(string filename, string outname)
{
ProcessStartInfo startInfo = new ProcessStartInfo()
{
FileName = "pdftk.exe",
Arguments = "\"" + filename + "\"" + " update_info G:\\Retro-Work\\metadata.txt output " + "\"" + outname + "\"",
UseShellExecute = false,
CreateNoWindow = true,
RedirectStandardError = true,
RedirectStandardOutput = true
};
Process p = new Process();
//p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
p.StartInfo = startInfo;
p.Start();
//p.BeginOutputReadLine();
string output = p.StandardOutput.ReadToEnd();
Console.WriteLine(output);
string err = p.StandardError.ReadToEnd();
Console.WriteLine(err);
p.WaitForExit();
}
public static void extract_images_from_pdf(string filename, string outdir)
{
string fArgument = "-q -dNOPAUSE -r600 -sDEVICE=tiff24nc -sCompression=lzw -sOutputFile=\"" + outdir + "\\_%04d.tif\" \"" + filename + "\" -c quit";
ProcessStartInfo startInfo = new ProcessStartInfo()
{
FileName = "c:\\Program Files\\gs\\gs9.27\\bin\\gswin64c.exe",
Arguments = fArgument,
UseShellExecute = false,
CreateNoWindow = true,
RedirectStandardError = true,
RedirectStandardOutput = true
};
Process p = new Process();
//p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
p.StartInfo = startInfo;
p.Start();
//p.BeginOutputReadLine();
string output = p.StandardOutput.ReadToEnd();
Console.WriteLine(output);
string err = p.StandardError.ReadToEnd();
Console.WriteLine(err);
p.WaitForExit();
}
static void add_meta_to_pdfs()
{
//var files = Directory.EnumerateFiles("C:\\path", "*.*", SearchOption.AllDirectories)
// .Where(s => s.EndsWith(".mp3") || s.EndsWith(".jpg"));
string[] files = Directory.GetFiles("G:\\Retro-Work\\Manual\\New folder\\", "*_recognized.pdf");
Parallel.ForEach(files, (file) =>
{
string outFileName = Path.GetFileNameWithoutExtension(file.Replace("_recognized", ""));
string outdir = "G:\\Retro-Work\\Manual\\New folder\\ToTorrent\\";
// if (!Directory.Exists(outdir + outFileName))
// {
// DirectoryInfo di = Directory.CreateDirectory(outdir + outFileName);
// }
add_meta_to_file(file, outdir + outFileName + ".pdf");
});
}
static void extract_pages_from_pdfs()
{
string[] files = Directory.GetFiles(@"G:\Retro-Work\Manual\PDF-Extract\", "*.pdf");
Parallel.ForEach(files, (file) =>
{
string outdir = @"G:\Retro-Work\Manual\PDF-Extract\";
string fileName = Path.GetFileNameWithoutExtension(file);
if (!Directory.Exists(outdir + fileName + "\\"))
{
DirectoryInfo di = Directory.CreateDirectory(outdir + fileName);
}
extract_images_from_pdf(file, outdir + fileName);
});
}
static void g4compress()
{
string[] dirs = Directory.GetDirectories("G:\\Retro-Work\\Manual\\New folder\\work\\");
foreach(string dir in dirs)
{
string outdir = dir + "\\g4out";
if (!Directory.Exists(outdir))
{
DirectoryInfo di = Directory.CreateDirectory(outdir);
}
g4compress_files(dir);
}
}
static void g4compress_files(string dir)
{
string[] files = Directory.GetFiles(dir, "*.tif");
Parallel.ForEach(files, (file) =>
{
string filename = Path.GetFileName(file);
string fArgument = "\"" + file + "\"" + " /tifc=4 /convert=\"" + dir + "\\g4out\\" + filename + "\"";
ProcessStartInfo startInfo = new ProcessStartInfo()
{
FileName = "c:\\Program Files (x86)\\IrfanView\\i_view32.exe",
Arguments = fArgument,
UseShellExecute = false,
CreateNoWindow = true,
RedirectStandardError = true,
RedirectStandardOutput = true
};
Process p = new Process();
//p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
p.StartInfo = startInfo;
p.Start();
//p.BeginOutputReadLine();
string output = p.StandardOutput.ReadToEnd();
Console.WriteLine(output);
string err = p.StandardError.ReadToEnd();
Console.WriteLine(err);
p.WaitForExit();
});
}
static void make_pdfs_in_dirs()
{
string[] dirs = Directory.GetDirectories("G:\\Retro-Work\\Manual\\New folder\\work\\");
foreach (string dir in dirs)
{
string outdir = dir + "\\pdf";
if (!Directory.Exists(outdir))
{
DirectoryInfo di = Directory.CreateDirectory(outdir);
}
make_pdf(dir);
}
}
static void make_pdf(string dir)
{
string[] files = Directory.GetFiles(dir, "*.tif");
Parallel.ForEach(files, (file) =>
{
string filename = Path.GetFileName(file);
string fArgument = "\"" + file + "\" " + "\"" + dir + "\\pdf\\" + filename + ".pdf\"";
ProcessStartInfo startInfo = new ProcessStartInfo()
{
FileName = "C:\\Program Files\\ImageMagick-6.9.3-Q16\\convert.exe",
Arguments = fArgument,
UseShellExecute = false,
CreateNoWindow = true,
RedirectStandardError = true,
RedirectStandardOutput = true
};
Process p = new Process();
p.StartInfo = startInfo;
p.Start();
string output = p.StandardOutput.ReadToEnd();
Console.WriteLine(output);
string err = p.StandardError.ReadToEnd();
Console.WriteLine(err);
p.WaitForExit();
});
string fileName = Path.GetFileName(dir);
string fArgumentPDF = "\"" + dir + "\\pdf\\*.pdf\" G:\\Retro-Work\\brought_to_you_by_[TABLET].pdf cat output \"" + dir + "\\..\\" + fileName + ".pdf\"";
ProcessStartInfo startInfo2 = new ProcessStartInfo()
{
FileName = "C:\\Program Files (x86)\\PDFtk Server\\bin\\pdftk.exe",
Arguments = fArgumentPDF,
UseShellExecute = false,
CreateNoWindow = true,
RedirectStandardError = true,
RedirectStandardOutput = true
};
Process p2 = new Process();
//p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
p2.StartInfo = startInfo2;
p2.Start();
//p.BeginOutputReadLine();
string output2 = p2.StandardOutput.ReadToEnd();
Console.WriteLine(output2);
string err2 = p2.StandardError.ReadToEnd();
Console.WriteLine(err2);
p2.WaitForExit();
}
static void create_torrent(string dir = "G:\\Retro-Work\\Manual\\New folder\\ToTorrent")
{
string comment = "\"From the archives of http://retro-commodore.eu\"";
string[] files = Directory.GetDirectories(dir);
Parallel.ForEach(files, (file) =>
{
string fileName = Path.GetFileNameWithoutExtension(file);
string fArgument = "-p -c " + comment + " -t udp://AmigaCity.xyz:6969 -o \"" + dir + "\\" + fileName + ".torrent\" \"" + file + "\"";
ProcessStartInfo startInfo = new ProcessStartInfo()
{
FileName = "C:\\Program Files\\Transmission\\transmission-create.exe",
Arguments = fArgument,
UseShellExecute = false,
CreateNoWindow = true,
RedirectStandardError = true,
RedirectStandardOutput = true
};
Process p = new Process();
//p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
p.StartInfo = startInfo;
p.Start();
//p.BeginOutputReadLine();
string output = p.StandardOutput.ReadToEnd();
Console.WriteLine(output);
string err = p.StandardError.ReadToEnd();
Console.WriteLine(err);
p.WaitForExit();
File.AppendAllText(file + ".txt", Environment.NewLine + "torrent: " + fileName + ".torrent" + Environment.NewLine);
});
}
}
}

View File

@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("05-AddMeta")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("05-AddMeta")]
[assembly: AssemblyCopyright("Copyright © 2017")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("00a533d9-32dc-4a37-a202-322f15614b2f")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup>
</configuration>

View File

@ -0,0 +1,4 @@
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.5.2", FrameworkDisplayName = ".NET Framework 4.5.2")]

View File

@ -0,0 +1 @@
e38c97fec5c79956b4cc71ae4769b605a35df62e

View File

@ -0,0 +1,7 @@
D:\CloudDrives\NextCloud\Projects\Code\05-AddMeta\05-AddMeta\bin\x64\Debug\05-AddMeta.exe.config
D:\CloudDrives\NextCloud\Projects\Code\05-AddMeta\05-AddMeta\bin\x64\Debug\05-AddMeta.exe
D:\CloudDrives\NextCloud\Projects\Code\05-AddMeta\05-AddMeta\bin\x64\Debug\05-AddMeta.pdb
D:\CloudDrives\NextCloud\Projects\Code\05-AddMeta\05-AddMeta\obj\x64\Debug\05-AddMeta.csproj.AssemblyReference.cache
D:\CloudDrives\NextCloud\Projects\Code\05-AddMeta\05-AddMeta\obj\x64\Debug\05-AddMeta.csproj.CoreCompileInputs.cache
D:\CloudDrives\NextCloud\Projects\Code\05-AddMeta\05-AddMeta\obj\x64\Debug\05-AddMeta.exe
D:\CloudDrives\NextCloud\Projects\Code\05-AddMeta\05-AddMeta\obj\x64\Debug\05-AddMeta.pdb

BIN
C# Projects/DatGenerator.7z Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,25 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.26730.15
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ScanAssistant", "ScanAssistant\ScanAssistant.csproj", "{3C1BF306-985D-4E0A-80B0-3C2F559227A6}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{3C1BF306-985D-4E0A-80B0-3C2F559227A6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3C1BF306-985D-4E0A-80B0-3C2F559227A6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3C1BF306-985D-4E0A-80B0-3C2F559227A6}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3C1BF306-985D-4E0A-80B0-3C2F559227A6}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {FF4FAE5D-20E5-4680-8142-BB726224BA08}
EndGlobalSection
EndGlobal

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
</startup>
</configuration>

View File

@ -0,0 +1,186 @@
namespace ScanAssistant
{
partial class DialogAbout
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(DialogAbout));
this.tableLayoutPanel = new System.Windows.Forms.TableLayoutPanel();
this.logoPictureBox = new System.Windows.Forms.PictureBox();
this.labelProductName = new System.Windows.Forms.Label();
this.labelVersion = new System.Windows.Forms.Label();
this.labelCopyright = new System.Windows.Forms.Label();
this.labelCompanyName = new System.Windows.Forms.Label();
this.textBoxDescription = new System.Windows.Forms.TextBox();
this.okButton = new System.Windows.Forms.Button();
this.tableLayoutPanel.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.logoPictureBox)).BeginInit();
this.SuspendLayout();
//
// tableLayoutPanel
//
this.tableLayoutPanel.ColumnCount = 2;
this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 33F));
this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 67F));
this.tableLayoutPanel.Controls.Add(this.logoPictureBox, 0, 0);
this.tableLayoutPanel.Controls.Add(this.labelProductName, 1, 0);
this.tableLayoutPanel.Controls.Add(this.labelVersion, 1, 1);
this.tableLayoutPanel.Controls.Add(this.labelCopyright, 1, 2);
this.tableLayoutPanel.Controls.Add(this.labelCompanyName, 1, 3);
this.tableLayoutPanel.Controls.Add(this.textBoxDescription, 1, 4);
this.tableLayoutPanel.Controls.Add(this.okButton, 1, 5);
this.tableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel.Location = new System.Drawing.Point(9, 9);
this.tableLayoutPanel.Name = "tableLayoutPanel";
this.tableLayoutPanel.RowCount = 6;
this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F));
this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F));
this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F));
this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F));
this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F));
this.tableLayoutPanel.Size = new System.Drawing.Size(417, 265);
this.tableLayoutPanel.TabIndex = 0;
//
// logoPictureBox
//
this.logoPictureBox.Dock = System.Windows.Forms.DockStyle.Fill;
this.logoPictureBox.Image = ((System.Drawing.Image)(resources.GetObject("logoPictureBox.Image")));
this.logoPictureBox.Location = new System.Drawing.Point(3, 3);
this.logoPictureBox.Name = "logoPictureBox";
this.tableLayoutPanel.SetRowSpan(this.logoPictureBox, 6);
this.logoPictureBox.Size = new System.Drawing.Size(131, 259);
this.logoPictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
this.logoPictureBox.TabIndex = 12;
this.logoPictureBox.TabStop = false;
//
// labelProductName
//
this.labelProductName.Dock = System.Windows.Forms.DockStyle.Fill;
this.labelProductName.Location = new System.Drawing.Point(143, 0);
this.labelProductName.Margin = new System.Windows.Forms.Padding(6, 0, 3, 0);
this.labelProductName.MaximumSize = new System.Drawing.Size(0, 17);
this.labelProductName.Name = "labelProductName";
this.labelProductName.Size = new System.Drawing.Size(271, 17);
this.labelProductName.TabIndex = 19;
this.labelProductName.Text = "Product Name";
this.labelProductName.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// labelVersion
//
this.labelVersion.Dock = System.Windows.Forms.DockStyle.Fill;
this.labelVersion.Location = new System.Drawing.Point(143, 26);
this.labelVersion.Margin = new System.Windows.Forms.Padding(6, 0, 3, 0);
this.labelVersion.MaximumSize = new System.Drawing.Size(0, 17);
this.labelVersion.Name = "labelVersion";
this.labelVersion.Size = new System.Drawing.Size(271, 17);
this.labelVersion.TabIndex = 0;
this.labelVersion.Text = "Version";
this.labelVersion.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// labelCopyright
//
this.labelCopyright.Dock = System.Windows.Forms.DockStyle.Fill;
this.labelCopyright.Location = new System.Drawing.Point(143, 52);
this.labelCopyright.Margin = new System.Windows.Forms.Padding(6, 0, 3, 0);
this.labelCopyright.MaximumSize = new System.Drawing.Size(0, 17);
this.labelCopyright.Name = "labelCopyright";
this.labelCopyright.Size = new System.Drawing.Size(271, 17);
this.labelCopyright.TabIndex = 21;
this.labelCopyright.Text = "Copyright";
this.labelCopyright.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// labelCompanyName
//
this.labelCompanyName.Dock = System.Windows.Forms.DockStyle.Fill;
this.labelCompanyName.Location = new System.Drawing.Point(143, 78);
this.labelCompanyName.Margin = new System.Windows.Forms.Padding(6, 0, 3, 0);
this.labelCompanyName.MaximumSize = new System.Drawing.Size(0, 17);
this.labelCompanyName.Name = "labelCompanyName";
this.labelCompanyName.Size = new System.Drawing.Size(271, 17);
this.labelCompanyName.TabIndex = 22;
this.labelCompanyName.Text = "Company Name";
this.labelCompanyName.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// textBoxDescription
//
this.textBoxDescription.Dock = System.Windows.Forms.DockStyle.Fill;
this.textBoxDescription.Location = new System.Drawing.Point(143, 107);
this.textBoxDescription.Margin = new System.Windows.Forms.Padding(6, 3, 3, 3);
this.textBoxDescription.Multiline = true;
this.textBoxDescription.Name = "textBoxDescription";
this.textBoxDescription.ReadOnly = true;
this.textBoxDescription.ScrollBars = System.Windows.Forms.ScrollBars.Both;
this.textBoxDescription.Size = new System.Drawing.Size(271, 126);
this.textBoxDescription.TabIndex = 23;
this.textBoxDescription.TabStop = false;
this.textBoxDescription.Text = "Description";
//
// okButton
//
this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.okButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.okButton.Location = new System.Drawing.Point(339, 239);
this.okButton.Name = "okButton";
this.okButton.Size = new System.Drawing.Size(75, 23);
this.okButton.TabIndex = 24;
this.okButton.Text = "&OK";
//
// AboutBox1
//
this.AcceptButton = this.okButton;
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(435, 283);
this.Controls.Add(this.tableLayoutPanel);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "AboutBox1";
this.Padding = new System.Windows.Forms.Padding(9);
this.ShowIcon = false;
this.ShowInTaskbar = false;
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "AboutBox1";
this.tableLayoutPanel.ResumeLayout(false);
this.tableLayoutPanel.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.logoPictureBox)).EndInit();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel;
private System.Windows.Forms.PictureBox logoPictureBox;
private System.Windows.Forms.Label labelProductName;
private System.Windows.Forms.Label labelVersion;
private System.Windows.Forms.Label labelCopyright;
private System.Windows.Forms.Label labelCompanyName;
private System.Windows.Forms.TextBox textBoxDescription;
private System.Windows.Forms.Button okButton;
}
}

View File

@ -0,0 +1,105 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace ScanAssistant
{
partial class DialogAbout : Form
{
public DialogAbout()
{
InitializeComponent();
this.Text = String.Format("About {0}", AssemblyTitle);
this.labelProductName.Text = AssemblyProduct;
this.labelVersion.Text = String.Format("Version {0}", AssemblyVersion);
this.labelCopyright.Text = AssemblyCopyright;
this.labelCompanyName.Text = AssemblyCompany;
this.textBoxDescription.Text = AssemblyDescription;
}
#region Assembly Attribute Accessors
public string AssemblyTitle
{
get
{
object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyTitleAttribute), false);
if (attributes.Length > 0)
{
AssemblyTitleAttribute titleAttribute = (AssemblyTitleAttribute)attributes[0];
if (titleAttribute.Title != "")
{
return titleAttribute.Title;
}
}
return System.IO.Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().CodeBase);
}
}
public string AssemblyVersion
{
get
{
return Assembly.GetExecutingAssembly().GetName().Version.ToString();
}
}
public string AssemblyDescription
{
get
{
object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyDescriptionAttribute), false);
if (attributes.Length == 0)
{
return "";
}
return ((AssemblyDescriptionAttribute)attributes[0]).Description;
}
}
public string AssemblyProduct
{
get
{
object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyProductAttribute), false);
if (attributes.Length == 0)
{
return "";
}
return ((AssemblyProductAttribute)attributes[0]).Product;
}
}
public string AssemblyCopyright
{
get
{
object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyCopyrightAttribute), false);
if (attributes.Length == 0)
{
return "";
}
return ((AssemblyCopyrightAttribute)attributes[0]).Copyright;
}
}
public string AssemblyCompany
{
get
{
object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyCompanyAttribute), false);
if (attributes.Length == 0)
{
return "";
}
return ((AssemblyCompanyAttribute)attributes[0]).Company;
}
}
#endregion
}
}

View File

@ -0,0 +1,603 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="logoPictureBox.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
</value>
</data>
</root>

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

View File

@ -0,0 +1,379 @@
namespace ScanAssistant
{
partial class FormMain
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormMain));
this.menuStrip1 = new System.Windows.Forms.MenuStrip();
this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.newProjectToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.openToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.closeProjectToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
this.quitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.helpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.aboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.panelNewOpenProject = new System.Windows.Forms.Panel();
this.panelMainWork = new System.Windows.Forms.Panel();
this.groupBox1 = new System.Windows.Forms.GroupBox();
this.comboBoxDPI = new System.Windows.Forms.ComboBox();
this.buttonCorrectDPI = new System.Windows.Forms.Button();
this.buttonG4Compress = new System.Windows.Forms.Button();
this.groupBoxPreScanTailor = new System.Windows.Forms.GroupBox();
this.textBoxWhite = new System.Windows.Forms.TextBox();
this.textBoxBlack = new System.Windows.Forms.TextBox();
this.progressBarInitiate = new System.Windows.Forms.ProgressBar();
this.buttonSetDefault = new System.Windows.Forms.Button();
this.buttonInitiate = new System.Windows.Forms.Button();
this.label4 = new System.Windows.Forms.Label();
this.label3 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.label1 = new System.Windows.Forms.Label();
this.btnNew = new System.Windows.Forms.Button();
this.btnOpen = new System.Windows.Forms.Button();
this.menuStrip1.SuspendLayout();
this.panelNewOpenProject.SuspendLayout();
this.panelMainWork.SuspendLayout();
this.groupBox1.SuspendLayout();
this.groupBoxPreScanTailor.SuspendLayout();
this.SuspendLayout();
//
// menuStrip1
//
this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.fileToolStripMenuItem,
this.helpToolStripMenuItem});
this.menuStrip1.Location = new System.Drawing.Point(0, 0);
this.menuStrip1.Name = "menuStrip1";
this.menuStrip1.Size = new System.Drawing.Size(593, 24);
this.menuStrip1.TabIndex = 0;
this.menuStrip1.Text = "menuStrip1";
//
// fileToolStripMenuItem
//
this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.newProjectToolStripMenuItem,
this.openToolStripMenuItem,
this.closeProjectToolStripMenuItem,
this.toolStripSeparator1,
this.quitToolStripMenuItem});
this.fileToolStripMenuItem.Name = "fileToolStripMenuItem";
this.fileToolStripMenuItem.Size = new System.Drawing.Size(37, 20);
this.fileToolStripMenuItem.Text = "&File";
//
// newProjectToolStripMenuItem
//
this.newProjectToolStripMenuItem.Name = "newProjectToolStripMenuItem";
this.newProjectToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
this.newProjectToolStripMenuItem.Text = "&New Project...";
this.newProjectToolStripMenuItem.Click += new System.EventHandler(this.newProjectToolStripMenuItem_Click);
//
// openToolStripMenuItem
//
this.openToolStripMenuItem.Name = "openToolStripMenuItem";
this.openToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
this.openToolStripMenuItem.Text = "&Open Project...";
this.openToolStripMenuItem.Click += new System.EventHandler(this.openToolStripMenuItem_Click);
//
// closeProjectToolStripMenuItem
//
this.closeProjectToolStripMenuItem.Name = "closeProjectToolStripMenuItem";
this.closeProjectToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
this.closeProjectToolStripMenuItem.Text = "&Close Project";
this.closeProjectToolStripMenuItem.Click += new System.EventHandler(this.closeProjectToolStripMenuItem_Click);
//
// toolStripSeparator1
//
this.toolStripSeparator1.Name = "toolStripSeparator1";
this.toolStripSeparator1.Size = new System.Drawing.Size(149, 6);
//
// quitToolStripMenuItem
//
this.quitToolStripMenuItem.Name = "quitToolStripMenuItem";
this.quitToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
this.quitToolStripMenuItem.Text = "&Quit";
this.quitToolStripMenuItem.Click += new System.EventHandler(this.quitToolStripMenuItem_Click);
//
// helpToolStripMenuItem
//
this.helpToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.aboutToolStripMenuItem});
this.helpToolStripMenuItem.Name = "helpToolStripMenuItem";
this.helpToolStripMenuItem.Size = new System.Drawing.Size(44, 20);
this.helpToolStripMenuItem.Text = "&Help";
//
// aboutToolStripMenuItem
//
this.aboutToolStripMenuItem.Name = "aboutToolStripMenuItem";
this.aboutToolStripMenuItem.Size = new System.Drawing.Size(107, 22);
this.aboutToolStripMenuItem.Text = "&About";
this.aboutToolStripMenuItem.Click += new System.EventHandler(this.aboutToolStripMenuItem_Click);
//
// panelNewOpenProject
//
this.panelNewOpenProject.Controls.Add(this.panelMainWork);
this.panelNewOpenProject.Controls.Add(this.btnNew);
this.panelNewOpenProject.Controls.Add(this.btnOpen);
this.panelNewOpenProject.Dock = System.Windows.Forms.DockStyle.Fill;
this.panelNewOpenProject.Location = new System.Drawing.Point(0, 24);
this.panelNewOpenProject.Name = "panelNewOpenProject";
this.panelNewOpenProject.Size = new System.Drawing.Size(593, 497);
this.panelNewOpenProject.TabIndex = 1;
//
// panelMainWork
//
this.panelMainWork.BackColor = System.Drawing.SystemColors.Control;
this.panelMainWork.Controls.Add(this.groupBox1);
this.panelMainWork.Controls.Add(this.groupBoxPreScanTailor);
this.panelMainWork.Location = new System.Drawing.Point(0, 0);
this.panelMainWork.Name = "panelMainWork";
this.panelMainWork.Size = new System.Drawing.Size(593, 497);
this.panelMainWork.TabIndex = 2;
this.panelMainWork.Visible = false;
//
// groupBox1
//
this.groupBox1.Controls.Add(this.comboBoxDPI);
this.groupBox1.Controls.Add(this.buttonCorrectDPI);
this.groupBox1.Controls.Add(this.buttonG4Compress);
this.groupBox1.Location = new System.Drawing.Point(12, 121);
this.groupBox1.Name = "groupBox1";
this.groupBox1.Size = new System.Drawing.Size(568, 208);
this.groupBox1.TabIndex = 10;
this.groupBox1.TabStop = false;
this.groupBox1.Text = "Options after ScanTailor";
//
// comboBoxDPI
//
this.comboBoxDPI.DisplayMember = "600";
this.comboBoxDPI.FormatString = "N0";
this.comboBoxDPI.FormattingEnabled = true;
this.comboBoxDPI.Items.AddRange(new object[] {
"150",
"300",
"600"});
this.comboBoxDPI.Location = new System.Drawing.Point(99, 21);
this.comboBoxDPI.Name = "comboBoxDPI";
this.comboBoxDPI.Size = new System.Drawing.Size(70, 21);
this.comboBoxDPI.TabIndex = 2;
//
// buttonCorrectDPI
//
this.buttonCorrectDPI.Location = new System.Drawing.Point(7, 20);
this.buttonCorrectDPI.Name = "buttonCorrectDPI";
this.buttonCorrectDPI.Size = new System.Drawing.Size(85, 23);
this.buttonCorrectDPI.TabIndex = 1;
this.buttonCorrectDPI.Text = "Correct DPI";
this.buttonCorrectDPI.UseVisualStyleBackColor = true;
//
// buttonG4Compress
//
this.buttonG4Compress.Location = new System.Drawing.Point(6, 58);
this.buttonG4Compress.Name = "buttonG4Compress";
this.buttonG4Compress.Size = new System.Drawing.Size(86, 23);
this.buttonG4Compress.TabIndex = 0;
this.buttonG4Compress.Text = "G4 Compress ";
this.buttonG4Compress.UseVisualStyleBackColor = true;
//
// groupBoxPreScanTailor
//
this.groupBoxPreScanTailor.Controls.Add(this.textBoxWhite);
this.groupBoxPreScanTailor.Controls.Add(this.textBoxBlack);
this.groupBoxPreScanTailor.Controls.Add(this.progressBarInitiate);
this.groupBoxPreScanTailor.Controls.Add(this.buttonSetDefault);
this.groupBoxPreScanTailor.Controls.Add(this.buttonInitiate);
this.groupBoxPreScanTailor.Controls.Add(this.label4);
this.groupBoxPreScanTailor.Controls.Add(this.label3);
this.groupBoxPreScanTailor.Controls.Add(this.label2);
this.groupBoxPreScanTailor.Controls.Add(this.label1);
this.groupBoxPreScanTailor.Location = new System.Drawing.Point(12, 15);
this.groupBoxPreScanTailor.Name = "groupBoxPreScanTailor";
this.groupBoxPreScanTailor.Size = new System.Drawing.Size(569, 100);
this.groupBoxPreScanTailor.TabIndex = 9;
this.groupBoxPreScanTailor.TabStop = false;
this.groupBoxPreScanTailor.Text = "Prepare for ScanTailor";
//
// textBoxWhite
//
this.textBoxWhite.Location = new System.Drawing.Point(152, 45);
this.textBoxWhite.Name = "textBoxWhite";
this.textBoxWhite.Size = new System.Drawing.Size(31, 20);
this.textBoxWhite.TabIndex = 10;
this.textBoxWhite.Text = "86";
this.textBoxWhite.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
//
// textBoxBlack
//
this.textBoxBlack.Location = new System.Drawing.Point(90, 45);
this.textBoxBlack.Name = "textBoxBlack";
this.textBoxBlack.Size = new System.Drawing.Size(31, 20);
this.textBoxBlack.TabIndex = 9;
this.textBoxBlack.Text = "11";
this.textBoxBlack.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
//
// progressBarInitiate
//
this.progressBarInitiate.Anchor = System.Windows.Forms.AnchorStyles.Right;
this.progressBarInitiate.Location = new System.Drawing.Point(420, 42);
this.progressBarInitiate.Name = "progressBarInitiate";
this.progressBarInitiate.Size = new System.Drawing.Size(143, 23);
this.progressBarInitiate.TabIndex = 8;
//
// buttonSetDefault
//
this.buttonSetDefault.Location = new System.Drawing.Point(319, 42);
this.buttonSetDefault.Name = "buttonSetDefault";
this.buttonSetDefault.Size = new System.Drawing.Size(85, 23);
this.buttonSetDefault.TabIndex = 7;
this.buttonSetDefault.Text = "Default Values";
this.buttonSetDefault.UseVisualStyleBackColor = true;
//
// buttonInitiate
//
this.buttonInitiate.Location = new System.Drawing.Point(6, 43);
this.buttonInitiate.Name = "buttonInitiate";
this.buttonInitiate.Size = new System.Drawing.Size(75, 23);
this.buttonInitiate.TabIndex = 0;
this.buttonInitiate.Text = "Initiate";
this.buttonInitiate.UseVisualStyleBackColor = true;
this.buttonInitiate.Click += new System.EventHandler(this.buttonInitiate_Click);
//
// label4
//
this.label4.AutoSize = true;
this.label4.Location = new System.Drawing.Point(149, 29);
this.label4.Name = "label4";
this.label4.Size = new System.Drawing.Size(35, 13);
this.label4.TabIndex = 6;
this.label4.Text = "White";
//
// label3
//
this.label3.AutoSize = true;
this.label3.Location = new System.Drawing.Point(89, 29);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(34, 13);
this.label3.TabIndex = 5;
this.label3.Text = "Black";
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(184, 48);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(15, 13);
this.label2.TabIndex = 4;
this.label2.Text = "%";
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(122, 48);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(15, 13);
this.label1.TabIndex = 3;
this.label1.Text = "%";
//
// btnNew
//
this.btnNew.Anchor = System.Windows.Forms.AnchorStyles.None;
this.btnNew.Font = new System.Drawing.Font("Microsoft Sans Serif", 16F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.btnNew.Location = new System.Drawing.Point(164, 204);
this.btnNew.Name = "btnNew";
this.btnNew.Size = new System.Drawing.Size(129, 88);
this.btnNew.TabIndex = 0;
this.btnNew.Text = "Pre ScanTailor";
this.btnNew.UseVisualStyleBackColor = true;
this.btnNew.Click += new System.EventHandler(this.btnNew_Click);
//
// btnOpen
//
this.btnOpen.Anchor = System.Windows.Forms.AnchorStyles.None;
this.btnOpen.Font = new System.Drawing.Font("Microsoft Sans Serif", 16F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.btnOpen.Location = new System.Drawing.Point(299, 204);
this.btnOpen.Name = "btnOpen";
this.btnOpen.Size = new System.Drawing.Size(128, 88);
this.btnOpen.TabIndex = 1;
this.btnOpen.Text = "Post ScanTailor";
this.btnOpen.UseVisualStyleBackColor = true;
//
// FormMain
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(593, 521);
this.Controls.Add(this.panelNewOpenProject);
this.Controls.Add(this.menuStrip1);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MainMenuStrip = this.menuStrip1;
this.Name = "FormMain";
this.Text = "ScanAssistant";
this.menuStrip1.ResumeLayout(false);
this.menuStrip1.PerformLayout();
this.panelNewOpenProject.ResumeLayout(false);
this.panelMainWork.ResumeLayout(false);
this.groupBox1.ResumeLayout(false);
this.groupBoxPreScanTailor.ResumeLayout(false);
this.groupBoxPreScanTailor.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.MenuStrip menuStrip1;
private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem openToolStripMenuItem;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
private System.Windows.Forms.ToolStripMenuItem quitToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem helpToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem aboutToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem newProjectToolStripMenuItem;
private System.Windows.Forms.Panel panelNewOpenProject;
private System.Windows.Forms.Button btnOpen;
private System.Windows.Forms.Button btnNew;
private System.Windows.Forms.ToolStripMenuItem closeProjectToolStripMenuItem;
private System.Windows.Forms.Panel panelMainWork;
private System.Windows.Forms.GroupBox groupBoxPreScanTailor;
private System.Windows.Forms.ProgressBar progressBarInitiate;
private System.Windows.Forms.Button buttonSetDefault;
private System.Windows.Forms.Button buttonInitiate;
private System.Windows.Forms.Label label4;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.TextBox textBoxWhite;
private System.Windows.Forms.TextBox textBoxBlack;
private System.Windows.Forms.GroupBox groupBox1;
private System.Windows.Forms.ComboBox comboBoxDPI;
private System.Windows.Forms.Button buttonCorrectDPI;
private System.Windows.Forms.Button buttonG4Compress;
}
}

View File

@ -0,0 +1,405 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace ScanAssistant
{
public partial class FormMain : Form
{
public string sourceDir;
public List<string> fileNames;
public string destinationDir;
public FormMain()
{
InitializeComponent();
comboBoxDPI.SelectedItem = 600;
}
private void btnNew_Click(object sender, EventArgs e)
{
panelMainWork.BringToFront();
FormOpenSourceDir opendir = new FormOpenSourceDir();
opendir.ShowDialog();
destinationDir = opendir.destinationDir;
sourceDir = opendir.sourceDir;
fileNames = opendir.fileNames;
if (!string.IsNullOrEmpty(sourceDir))
{
panelMainWork.Visible = true;
}
}
private void newProjectToolStripMenuItem_Click(object sender, EventArgs e)
{
panelMainWork.Visible = false;
}
private void closeProjectToolStripMenuItem_Click(object sender, EventArgs e)
{
panelMainWork.Visible = false;
}
private void openToolStripMenuItem_Click(object sender, EventArgs e)
{
panelMainWork.Visible = true;
panelNewOpenProject.Visible = false;
}
private void aboutToolStripMenuItem_Click(object sender, EventArgs e)
{
using (DialogAbout about = new DialogAbout())
{
about.ShowDialog();
}
}
private void quitToolStripMenuItem_Click(object sender, EventArgs e)
{
DialogResult quit = MessageBox.Show("Do you want to quit this application?", "Quit?", MessageBoxButtons.YesNo);
if(quit == DialogResult.Yes)
{
Application.Exit();
}
}
private void buttonInitiate_Click(object sender, EventArgs e)
{
if (Convert.ToInt32(textBoxBlack.Text) >= Convert.ToInt32(textBoxWhite.Text))
{
MessageBox.Show("White amount cannot be equal or less than black amount", "Blacker than black", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
else if (Directory.GetFiles(destinationDir).Count() > 0)
{
DialogResult dialog = MessageBox.Show("Destination directory contains files,\r\ncan't continue unless you delete the files.\r\nDo you want to delete the files in the directory?", "Delete files in destination directory?", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (dialog == DialogResult.Yes)
{
DirectoryInfo di = new DirectoryInfo(destinationDir);
foreach (FileInfo file in di.GetFiles())
{
file.Delete();
}
progressBarInitiate.Maximum = fileNames.Count();
progressBarInitiate.Value = 0;
initiate();
}
}
else
{
progressBarInitiate.Maximum = fileNames.Count();
progressBarInitiate.Value = 0;
initiate();
}
}
// todo make cofigurable default settings
private void buttonSetDefault_Click(object sender, EventArgs e)
{
textBoxBlack.Text = "11";
textBoxWhite.Text = "86";
}
// TODO - external apps should reside with this app
// Check on startup if required programs exist (perhaps check md5 sum of files?)
// fix paths
// cleanup code
// check for possibility to select/deselect -in app- the usage of one or more cores
// PRIMARY TODO -> New/Open Screen should change to "Pre Scantailor" and "Post Scantailor"
// post scantailor -> select working dirs
// evaluate if saving project settings is needed (atm not needed)
// Missing stuff yet to add
// select path for source images, post scantailor
// make selectable which files should be converted to grayscale - preview pics
// make selectable which files should be opened with your fav pic editor
// check during very first startup - mspaint, paint.net, gimp, adobe, make selectable which app should be default pic editor
// working temp dir needs defined, using %temp%\<generated random dir> ? - delete this after shutting down app.
// compress 1-bit to g4 fax sourceFile -> %temp% -> sourceFile
// make pdf
// sorting output : firstpage -> lastpage only (folded booklet with back/front, 2-3, 4-5 etc) ,
// (fullpage magazine scans) back/front; 2/second-last; third-last/3; 4/fourth-last
// (simplex scanned front to back, back to front) 1, 3, 5 .... 6, 4, 2
// generate tablet size version (150dpi)
// create sha1 + md5 files of output
// version 2.0
// add jobs to task manager
// Step 1 use convert (ImageMagick) to adjust contrast from files in sourceDir to destinationDir
private void initiate()
{
var parOptions = new ParallelOptions();
int degreeOfParallelism = Environment.ProcessorCount - 1;
parOptions.MaxDegreeOfParallelism = degreeOfParallelism;
Parallel.ForEach(fileNames, parOptions, (file) =>
{
// Progress bar that doesn't work atm -> 911 @ PET/Dexion
// Here it only shows progress after jobs are done
//BeginInvoke((Action)delegate { progressBarInitiate.Refresh(); });
//BeginInvoke((Action)delegate { progressBarInitiate.Value++; });
string destinationFile = destinationDir + "\\" + Path.GetFileNameWithoutExtension(file) + ".tif";
string sourceFile = sourceDir + "\\" + file;
string fArgument = "\"" + sourceFile + "\" -level " + textBoxBlack.Text + "%," + textBoxWhite.Text + "% \"" + destinationFile + "\"";
ProcessStartInfo startInfo = new ProcessStartInfo()
{
FileName = "C:\\Program Files\\ImageMagick-6.9.3-Q16\\convert.exe",
Arguments = fArgument,
UseShellExecute = false,
CreateNoWindow = true,
RedirectStandardError = true,
RedirectStandardOutput = true
};
Process p = new Process();
//p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
p.StartInfo = startInfo;
p.Start();
//p.BeginOutputReadLine();
string output = p.StandardOutput.ReadToEnd();
//Console.WriteLine(output);
string err = p.StandardError.ReadToEnd();
//Console.WriteLine(err);
BeginInvoke(new Action(() => progressBarInitiate.Value++));
//BeginInvoke(new Action(() => progressBarInitiate.Refresh()));
p.WaitForExit();
// here the progress shows correctly -make note of invoke/begininvoke- but never finishes
// 198 test files = only 160-175ish output files.
// progress bar code is in a trial and error state - unknown what happens if it runs now.
//Invoke(new Action(() => progressBarInitiate.Value++));
});
}
// Add metadata to PDF File
public static void add_meta_to_file(string filename, string outname)
{
// Requires PDFTK (server/console)
ProcessStartInfo startInfo = new ProcessStartInfo()
{
FileName = "pdftk.exe",
Arguments = "\"" + filename + "\"" + " update_info D:\\Retro-Work\\metadata.txt output " + "\"" + outname + "\"",
UseShellExecute = false,
CreateNoWindow = true,
RedirectStandardError = true,
RedirectStandardOutput = true
};
Process p = new Process();
p.StartInfo = startInfo;
p.Start();
string output = p.StandardOutput.ReadToEnd();
string err = p.StandardError.ReadToEnd();
p.WaitForExit();
}
// Add metadata to multiple PDF files - FIXME
static void add_meta_to_pdfs()
{
//var files = Directory.EnumerateFiles("C:\\path", "*.*", SearchOption.AllDirectories)
// .Where(s => s.EndsWith(".mp3") || s.EndsWith(".jpg"));
string[] files = Directory.GetFiles("D:\\Retro-Work\\Manual\\New folder\\", "*_recognized.pdf");
Parallel.ForEach(files, (file) =>
{
string outFileName = Path.GetFileNameWithoutExtension(file.Replace("_recognized", ""));
string outdir = "D:\\Retro-Work\\Manual\\New folder\\ToTorrent\\";
if (!Directory.Exists(outdir + outFileName))
{
DirectoryInfo di = Directory.CreateDirectory(outdir + outFileName);
}
add_meta_to_file(file, outdir + outFileName + ".pdf");
});
}
// Compress 1-Bit files with G4
static void g4compress_files(string dir)
{
// Requires ImageMagick's identify - TODO grab stdout 1-bit vs 8-bit and add to list
string[] files = Directory.GetFiles(dir, "*.tif");
// examine if files = 1bit : add to g4 compress list
Parallel.ForEach(files, (file) =>
{
string sourceFile = file;
string fArgument = "\"" + sourceFile + "\"";
ProcessStartInfo startInfo = new ProcessStartInfo()
{
FileName = "C:\\Program Files\\ImageMagick-6.9.3-Q16\\identify.exe",
Arguments = fArgument,
UseShellExecute = false,
CreateNoWindow = true,
RedirectStandardError = true,
RedirectStandardOutput = true
};
Process p = new Process();
p.StartInfo = startInfo;
p.Start();
//p.BeginOutputReadLine();
string output = p.StandardOutput.ReadToEnd();
string err = p.StandardError.ReadToEnd();
p.WaitForExit();
});
// compress 1-bit files to G4 - TODO use imagemagick instead
Parallel.ForEach(files, (file) =>
{
string filename = Path.GetFileName(file);
string fArgument = "\"" + file + "\"" + " /tifc=4 /convert=\"" + dir + "\\g4out\\" + filename + "\"";
ProcessStartInfo startInfo = new ProcessStartInfo()
{
FileName = "c:\\Program Files (x86)\\IrfanView\\i_view32.exe",
Arguments = fArgument,
UseShellExecute = false,
CreateNoWindow = true,
RedirectStandardError = true,
RedirectStandardOutput = true
};
Process p = new Process();
//p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
p.StartInfo = startInfo;
p.Start();
//p.BeginOutputReadLine();
string output = p.StandardOutput.ReadToEnd();
Console.WriteLine(output);
string err = p.StandardError.ReadToEnd();
Console.WriteLine(err);
p.WaitForExit();
});
}
// make pdf files from each dir's image files - nested - FIXME this is only used in specific times, make a console app for this?!?
static void make_pdfs_in_dirs()
{
string[] dirs = Directory.GetDirectories("D:\\Retro-Work\\Manual\\New folder\\work\\");
foreach (string dir in dirs)
{
string outdir = dir + "\\pdf";
if (!Directory.Exists(outdir))
{
DirectoryInfo di = Directory.CreateDirectory(outdir);
}
make_pdf(dir);
}
}
// Create a pdf file from working directory when everything else is in place
static void make_pdf(string dir)
{
string[] files = Directory.GetFiles(dir, "*.tif");
Parallel.ForEach(files, (file) =>
{
string filename = Path.GetFileName(file);
string fArgument = "\"" + file + "\" " + "\"" + dir + "\\pdf\\" + filename + ".pdf\"";
ProcessStartInfo startInfo = new ProcessStartInfo()
{
FileName = "C:\\Program Files\\ImageMagick-6.9.3-Q16\\convert.exe",
Arguments = fArgument,
UseShellExecute = false,
CreateNoWindow = true,
RedirectStandardError = true,
RedirectStandardOutput = true
};
Process p = new Process();
p.StartInfo = startInfo;
p.Start();
string output = p.StandardOutput.ReadToEnd();
Console.WriteLine(output);
string err = p.StandardError.ReadToEnd();
Console.WriteLine(err);
p.WaitForExit();
});
// TODO make selectable tablet or A4 to add as last page
string fileName = Path.GetFileName(dir);
string fArgumentPDF = "\"" + dir + "\\pdf\\*.pdf\" D:\\Retro-Work\\brought_to_you_by_[TABLET].pdf cat output \"" + dir + "\\..\\" + fileName + ".pdf\"";
ProcessStartInfo startInfo2 = new ProcessStartInfo()
{
FileName = "C:\\Program Files (x86)\\PDFtk Server\\bin\\pdftk.exe",
Arguments = fArgumentPDF,
UseShellExecute = false,
CreateNoWindow = true,
RedirectStandardError = true,
RedirectStandardOutput = true
};
Process p2 = new Process();
//p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
p2.StartInfo = startInfo2;
p2.Start();
//p.BeginOutputReadLine();
string output2 = p2.StandardOutput.ReadToEnd();
Console.WriteLine(output2);
string err2 = p2.StandardError.ReadToEnd();
Console.WriteLine(err2);
p2.WaitForExit();
}
// using transmission BT to create a torrent file from designated dir - TODO config/output dir
static void create_torrent()
{
string comment = "\"From the archives of http://retro-commodore.eu\"";
string dir = "D:\\Retro-Work\\Manual\\New folder\\ToTorrent";
string[] files = Directory.GetDirectories(dir);
Parallel.ForEach(files, (file) =>
{
string fileName = Path.GetFileNameWithoutExtension(file);
string fArgument = "-p -c " + comment + " -t udp://AmigaCity.xyz:6969 -o \"" + dir + "\\" + fileName + ".torrent\" \"" + file + "\"";
ProcessStartInfo startInfo = new ProcessStartInfo()
{
FileName = "C:\\Program Files\\Transmission\\transmission-create.exe",
Arguments = fArgument,
UseShellExecute = false,
CreateNoWindow = true,
RedirectStandardError = true,
RedirectStandardOutput = true
};
Process p = new Process();
//p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
p.StartInfo = startInfo;
p.Start();
//p.BeginOutputReadLine();
string output = p.StandardOutput.ReadToEnd();
Console.WriteLine(output);
string err = p.StandardError.ReadToEnd();
Console.WriteLine(err);
p.WaitForExit();
File.AppendAllText(file + ".txt", Environment.NewLine + "torrent: " + fileName + ".torrent" + Environment.NewLine);
});
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,163 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace ScanAssistant
{
public partial class FormOpenSourceDir : Form
{
public string sourceDir { get; set; }
public string destinationDir { get; set; }
public List<string> fileNames { get; set; }
public bool previousImage = false;
public FormOpenSourceDir()
{
InitializeComponent();
buttonOK.Enabled = false;
}
private void buttonBrowseSource_Click(object sender, EventArgs e)
{
FolderBrowserDialog folder = new FolderBrowserDialog();
if (!string.IsNullOrEmpty(textSourceDir.Text))
{
folder.SelectedPath = textSourceDir.Text;
}
if (DialogResult.OK == folder.ShowDialog())
{
textSourceDir.Clear();
textSourceDir.Text = sourceDir = folder.SelectedPath;
buttonSetDefault.Enabled = true;
string[] files = Directory.GetFiles(folder.SelectedPath);
//.Where(file => file.ToLower().EndsWith("jpg") || file.ToLower().EndsWith("png") || file.ToLower().EndsWith("tif") || file.ToLower().EndsWith("tiff"));
if (files.Length > 1)
{
foreach (string file in files)
{
listBoxSourceDir.Items.Add(Path.GetFileName(file));
}
labelSourceFileCount.Text = files.Count().ToString();
}
}
}
private void buttonBrowseDestination_Click(object sender, EventArgs e)
{
FolderBrowserDialog folder = new FolderBrowserDialog();
if (!string.IsNullOrEmpty(textDestinationDir.Text))
{
folder.SelectedPath = textSourceDir.Text;
}
if (DialogResult.OK == folder.ShowDialog())
{
textDestinationDir.Clear();
textDestinationDir.Text = destinationDir = folder.SelectedPath;
if (checkDestinationDirExists())
{
buttonOK.Enabled = true;
}
else
{
buttonOK.Enabled = false;
}
}
}
private void buttonSetDefault_Click(object sender, EventArgs e)
{
textDestinationDir.Clear();
DirectoryInfo parentDir = Directory.GetParent(textSourceDir.Text);
textDestinationDir.Text = parentDir + "\\work";
if (checkDestinationDirExists())
{
buttonOK.Enabled = true;
}
else
{
buttonOK.Enabled = false;
}
}
private void buttonOK_Click(object sender, EventArgs e)
{
sourceDir = textSourceDir.Text;
destinationDir = textDestinationDir.Text;
fileNames = listBoxSourceDir.Items.OfType<string>().ToList();
this.Close();
}
private void textSourceDir_KeyUp(object sender, KeyEventArgs e)
{
if (Directory.Exists(textSourceDir.Text))
{
buttonSetDefault.Enabled = true;
listBoxSourceDir.Items.Clear();
string[] files = Directory.GetFiles(textSourceDir.Text);
if (files.Length > 1)
{
foreach (string file in files)
{
listBoxSourceDir.Items.Add(Path.GetFileName(file));
}
labelSourceFileCount.Text = listBoxSourceDir.Items.Count.ToString();
}
sourceDir = textSourceDir.Text;
}
}
public bool checkDestinationDirExists()
{
if (!Directory.Exists(textDestinationDir.Text))
{
MessageBox.Show("Destination directory is not set," + Environment.NewLine + "or is not created!" , "Directory unknown", MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
destinationDir = textDestinationDir.Text;
return true;
}
private void listBoxSourceDir_SelectedIndexChanged(object sender, EventArgs e)
{
if(listBoxSourceDir.SelectedIndex != -1)
{
if (previousImage)
{
pictureBox1.InitialImage = null;
}
Application.UseWaitCursor = true;
pictureBox1.ImageLocation = textSourceDir.Text + "\\" + listBoxSourceDir.SelectedItem.ToString();
previousImage = true;
Application.UseWaitCursor = false;
}
}
private void textDestinationDir_KeyUp(object sender, KeyEventArgs e)
{
if(checkDestinationDirExists())
{
buttonOK.Enabled = true;
}
else
{
buttonOK.Enabled = false;
}
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,22 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace ScanAssistant
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new FormMain());
}
}
}

View File

@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("ScanAssistant")]
[assembly: AssemblyDescription("ScanAssistant is a program to assist ScanTailor with sorting, better compression of and more.")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Carsten Jensen")]
[assembly: AssemblyProduct("ScanAssistant")]
[assembly: AssemblyCopyright("Copyright © 2017 http://retro-commodore.eu")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("3c1bf306-985d-4e0a-80b0-3c2f559227a6")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View File

@ -0,0 +1,71 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace ScanAssistant.Properties
{
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources
{
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources()
{
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager
{
get
{
if ((resourceMan == null))
{
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ScanAssistant.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture
{
get
{
return resourceCulture;
}
set
{
resourceCulture = value;
}
}
}
}

View File

@ -0,0 +1,117 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,30 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace ScanAssistant.Properties
{
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
{
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default
{
get
{
return defaultInstance;
}
}
}
}

View File

@ -0,0 +1,7 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
<Settings />
</SettingsFile>

View File

@ -0,0 +1,136 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{3C1BF306-985D-4E0A-80B0-3C2F559227A6}</ProjectGuid>
<OutputType>WinExe</OutputType>
<RootNamespace>ScanAssistant</RootNamespace>
<AssemblyName>ScanAssistant</AssemblyName>
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<PublishUrl>publish\</PublishUrl>
<Install>true</Install>
<InstallFrom>Disk</InstallFrom>
<UpdateEnabled>false</UpdateEnabled>
<UpdateMode>Foreground</UpdateMode>
<UpdateInterval>7</UpdateInterval>
<UpdateIntervalUnits>Days</UpdateIntervalUnits>
<UpdatePeriodically>false</UpdatePeriodically>
<UpdateRequired>false</UpdateRequired>
<MapFileExtensions>true</MapFileExtensions>
<ApplicationRevision>0</ApplicationRevision>
<ApplicationVersion>1.0.0.%2a</ApplicationVersion>
<IsWebBootstrapper>false</IsWebBootstrapper>
<UseApplicationTrust>false</UseApplicationTrust>
<BootstrapperEnabled>true</BootstrapperEnabled>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup>
<ApplicationIcon>FormIcon.ico</ApplicationIcon>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.DirectoryServices" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Deployment" />
<Reference Include="System.Drawing" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="DialogAbout.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="DialogAbout.Designer.cs">
<DependentUpon>DialogAbout.cs</DependentUpon>
</Compile>
<Compile Include="ScanSettings.cs" />
<Compile Include="FormMain.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="FormMain.Designer.cs">
<DependentUpon>FormMain.cs</DependentUpon>
</Compile>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<EmbeddedResource Include="DialogAbout.resx">
<DependentUpon>DialogAbout.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="FormMain.resx">
<DependentUpon>FormMain.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="FormOpenSourceDir.resx">
<DependentUpon>FormOpenSourceDir.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
<SubType>Designer</SubType>
</EmbeddedResource>
<Compile Include="FormOpenSourceDir.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="FormOpenSourceDir.Designer.cs">
<DependentUpon>FormOpenSourceDir.cs</DependentUpon>
</Compile>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
</ItemGroup>
<ItemGroup>
<BootstrapperPackage Include=".NETFramework,Version=v4.6.1">
<Visible>False</Visible>
<ProductName>Microsoft .NET Framework 4.6.1 %28x86 and x64%29</ProductName>
<Install>true</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
<Visible>False</Visible>
<ProductName>.NET Framework 3.5 SP1</ProductName>
<Install>false</Install>
</BootstrapperPackage>
</ItemGroup>
<ItemGroup>
<Content Include="FormIcon.ico" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<PublishUrlHistory>publish\</PublishUrlHistory>
<InstallUrlHistory />
<SupportUrlHistory />
<UpdateUrlHistory />
<BootstrapperUrlHistory />
<ErrorReportUrlHistory />
<FallbackCulture>en-US</FallbackCulture>
<VerifyUploadedFiles>false</VerifyUploadedFiles>
</PropertyGroup>
</Project>

View File

@ -0,0 +1,33 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ScanAssistant
{
public class ScanSettings
{
string _sourceDir;
string _destinationDir;
string[] fileList;
public string SourceDir
{
get { return this._sourceDir; }
set { this._sourceDir = value; }
}
public string DestinationDir
{
get { return this._destinationDir; }
set { this._destinationDir = value; }
}
public void PopulateFileList(string[] value)
{
fileList = value;
}
}
}

View File

@ -0,0 +1,185 @@
namespace ScanAssistant
{
partial class FormOpenSourceDir
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormOpenSourceDir));
this.buttonBrowseSource = new System.Windows.Forms.Button();
this.buttonBrowseDestination = new System.Windows.Forms.Button();
this.textSourceDir = new System.Windows.Forms.TextBox();
this.textDestinationDir = new System.Windows.Forms.TextBox();
this.buttonSetDefault = new System.Windows.Forms.Button();
this.directoryEntry1 = new System.DirectoryServices.DirectoryEntry();
this.listBoxSourceDir = new System.Windows.Forms.ListBox();
this.buttonOK = new System.Windows.Forms.Button();
this.label1 = new System.Windows.Forms.Label();
this.labelSourceFileCount = new System.Windows.Forms.Label();
this.pictureBox1 = new System.Windows.Forms.PictureBox();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
this.SuspendLayout();
//
// buttonBrowseSource
//
this.buttonBrowseSource.Location = new System.Drawing.Point(214, 10);
this.buttonBrowseSource.Name = "buttonBrowseSource";
this.buttonBrowseSource.Size = new System.Drawing.Size(84, 23);
this.buttonBrowseSource.TabIndex = 0;
this.buttonBrowseSource.Text = "Source...";
this.buttonBrowseSource.UseVisualStyleBackColor = true;
this.buttonBrowseSource.Click += new System.EventHandler(this.buttonBrowseSource_Click);
//
// buttonBrowseDestination
//
this.buttonBrowseDestination.Location = new System.Drawing.Point(214, 39);
this.buttonBrowseDestination.Name = "buttonBrowseDestination";
this.buttonBrowseDestination.Size = new System.Drawing.Size(84, 23);
this.buttonBrowseDestination.TabIndex = 1;
this.buttonBrowseDestination.Text = "Destination...";
this.buttonBrowseDestination.UseVisualStyleBackColor = true;
this.buttonBrowseDestination.Click += new System.EventHandler(this.buttonBrowseDestination_Click);
//
// textSourceDir
//
this.textSourceDir.Location = new System.Drawing.Point(12, 12);
this.textSourceDir.Name = "textSourceDir";
this.textSourceDir.Size = new System.Drawing.Size(195, 20);
this.textSourceDir.TabIndex = 2;
this.textSourceDir.KeyUp += new System.Windows.Forms.KeyEventHandler(this.textSourceDir_KeyUp);
//
// textDestinationDir
//
this.textDestinationDir.Location = new System.Drawing.Point(12, 41);
this.textDestinationDir.Name = "textDestinationDir";
this.textDestinationDir.Size = new System.Drawing.Size(195, 20);
this.textDestinationDir.TabIndex = 3;
this.textDestinationDir.KeyUp += new System.Windows.Forms.KeyEventHandler(this.textDestinationDir_KeyUp);
//
// buttonSetDefault
//
this.buttonSetDefault.Enabled = false;
this.buttonSetDefault.Location = new System.Drawing.Point(304, 39);
this.buttonSetDefault.Name = "buttonSetDefault";
this.buttonSetDefault.Size = new System.Drawing.Size(75, 23);
this.buttonSetDefault.TabIndex = 4;
this.buttonSetDefault.Text = "Set Default";
this.buttonSetDefault.UseVisualStyleBackColor = true;
this.buttonSetDefault.Click += new System.EventHandler(this.buttonSetDefault_Click);
//
// listBoxSourceDir
//
this.listBoxSourceDir.FormattingEnabled = true;
this.listBoxSourceDir.HorizontalScrollbar = true;
this.listBoxSourceDir.Location = new System.Drawing.Point(13, 67);
this.listBoxSourceDir.Name = "listBoxSourceDir";
this.listBoxSourceDir.Size = new System.Drawing.Size(194, 446);
this.listBoxSourceDir.TabIndex = 5;
this.listBoxSourceDir.SelectedIndexChanged += new System.EventHandler(this.listBoxSourceDir_SelectedIndexChanged);
//
// buttonOK
//
this.buttonOK.Enabled = false;
this.buttonOK.Location = new System.Drawing.Point(12, 539);
this.buttonOK.Name = "buttonOK";
this.buttonOK.Size = new System.Drawing.Size(195, 23);
this.buttonOK.TabIndex = 11;
this.buttonOK.Text = "OK";
this.buttonOK.UseVisualStyleBackColor = true;
this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click);
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(12, 516);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(34, 13);
this.label1.TabIndex = 12;
this.label1.Text = "Files: ";
//
// labelSourceFileCount
//
this.labelSourceFileCount.AutoSize = true;
this.labelSourceFileCount.Location = new System.Drawing.Point(39, 516);
this.labelSourceFileCount.Name = "labelSourceFileCount";
this.labelSourceFileCount.Size = new System.Drawing.Size(13, 13);
this.labelSourceFileCount.TabIndex = 13;
this.labelSourceFileCount.Text = "0";
this.labelSourceFileCount.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
//
// pictureBox1
//
this.pictureBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.pictureBox1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
this.pictureBox1.Location = new System.Drawing.Point(214, 67);
this.pictureBox1.Name = "pictureBox1";
this.pictureBox1.Size = new System.Drawing.Size(421, 449);
this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
this.pictureBox1.TabIndex = 14;
this.pictureBox1.TabStop = false;
//
// FormOpenSourceDir
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(647, 577);
this.Controls.Add(this.pictureBox1);
this.Controls.Add(this.labelSourceFileCount);
this.Controls.Add(this.label1);
this.Controls.Add(this.buttonOK);
this.Controls.Add(this.listBoxSourceDir);
this.Controls.Add(this.buttonSetDefault);
this.Controls.Add(this.textDestinationDir);
this.Controls.Add(this.textSourceDir);
this.Controls.Add(this.buttonBrowseDestination);
this.Controls.Add(this.buttonBrowseSource);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MinimumSize = new System.Drawing.Size(498, 616);
this.Name = "FormOpenSourceDir";
this.Text = "Set working environment";
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Button buttonBrowseSource;
private System.Windows.Forms.Button buttonBrowseDestination;
private System.Windows.Forms.TextBox textSourceDir;
private System.Windows.Forms.TextBox textDestinationDir;
private System.Windows.Forms.Button buttonSetDefault;
private System.DirectoryServices.DirectoryEntry directoryEntry1;
private System.Windows.Forms.ListBox listBoxSourceDir;
private System.Windows.Forms.Button buttonOK;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label labelSourceFileCount;
private System.Windows.Forms.PictureBox pictureBox1;
}
}

View File

@ -0,0 +1,62 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE datafile PUBLIC "-//Logiqx//DTD ROM Management Datafile//EN" "http://www.logiqx.com/Dats/datafile.dtd">
<datafile>
<header>
<name>Commodore Amiga CD32 - Applications</name>
<description>Commodore Amiga CD32 - Applications (TOSEC-v2018-03-24)</description>
<category>TOSEC-ISO</category>
<version>2018-03-24</version>
<author>TOSEC-ISO</author>
<email>contact@tosecdev.org</email>
<homepage>TOSEC</homepage>
<url>http://www.tosecdev.org/</url>
</header>
<game name="Amiga Workbench CD - 32 3.0 (1993)(Commodore)(DE)(en)[!]">
<description>Amiga Workbench CD - 32 3.0 (1993)(Commodore)(DE)(en)[!]</description>
<rom name="Amiga Workbench CD - 32 3.0 (1993)(Commodore)(DE)(en)[!].cue" size="145" crc="8460835a" md5="30a2c963e0e9423a6632b27df77c94ba" sha1="1f0747ad240147ad575b89cefc38f9b9196c1f9e"/>
<rom name="Amiga Workbench CD - 32 3.0 (1993)(Commodore)(DE)(en)[!].iso" size="1634304" crc="844c763c" md5="e84c5c63b08a54175aa917a10e23647a" sha1="cbe8017a3ec655205ec7b65f24529c2cd9111249"/>
</game>
<game name="CD Micro French (1994)(LCL)">
<description>CD Micro French (1994)(LCL)</description>
<rom name="CD Micro French (1994)(LCL)(Track 1 of 7).iso" size="6277488" crc="b52bc676" md5="9964895dec22c3a6e47cb761ffa2e2bd" sha1="613dc0ba3c35512b4b3d0dccfde7050a3ed1bbbc"/>
<rom name="CD Micro French (1994)(LCL)(Track 2 of 7).wav" size="6733834" crc="aef8ba46" md5="a01437db64d6804ace1949ed6299d668" sha1="6003463eebb512bfc4c4ad6a5f8f8b4124fc6cd6"/>
<rom name="CD Micro French (1994)(LCL)(Track 3 of 7).wav" size="6075274" crc="d44e8e3f" md5="ac37a7a4b0adda81d8bcc334dca0a20b" sha1="3846c9d6bf69d3e224f82cccb46ed26d2f1e6172"/>
<rom name="CD Micro French (1994)(LCL)(Track 4 of 7).wav" size="6378682" crc="0295d271" md5="b7f4868d839627462404e4cb4674b376" sha1="97dde9931cd3fdaebe96c2972bdbc320a0fbbae6"/>
<rom name="CD Micro French (1994)(LCL)(Track 5 of 7).wav" size="6228154" crc="9d98fa61" md5="fb43bc6682b2d535c9c9cb71e7221a30" sha1="9d705d7330365a402a1618e35809904d2ce5b685"/>
<rom name="CD Micro French (1994)(LCL)(Track 6 of 7).wav" size="7133674" crc="2ea8b0a6" md5="1d92e0f3fc4f826171679a36dc449ebf" sha1="09d28269ef1961f7c8da46a482565617160de7e3"/>
<rom name="CD Micro French (1994)(LCL)(Track 7 of 7).wav" size="6604474" crc="87d4421c" md5="0595599eb945cbb9f8cea3c6d9d78497" sha1="9a223528065c52663a91b3c797ae3eccbe8eba1e"/>
<rom name="CD Micro French (1994)(LCL).cue" size="888" crc="e61e9e1c" md5="0bd32b309135b5509969b014b1309f8c" sha1="3da134671edfafc9a89ccace6ded547224821734"/>
</game>
<game name="Communicator II (1994)(Eureka)">
<description>Communicator II (1994)(Eureka)</description>
<rom name="Communicator II (1994)(Eureka).cue" size="119" crc="f3a3b4cb" md5="15fdaade632f57be6f9816f397e5c706" sha1="9412afb23d24acc5eb8d161c811998bd08690502"/>
<rom name="Communicator II (1994)(Eureka).iso" size="9054208" crc="76e53e5e" md5="c071ce18506bf317ca40996eb2fd2233" sha1="95cd99100c5e1a36dde658cef6e0e9b97525673b"/>
</game>
<game name="Communicator III (1994)(Eureka)(M3)[!]">
<description>Communicator III (1994)(Eureka)(M3)[!]</description>
<rom name="Communicator III (1994)(Eureka)(M3)[!].cue" size="127" crc="926cf966" md5="5b09000293e8b4dc67d52a005a4e90da" sha1="66465cb0e62ddd635286a32c0f0cd462cd4bd970"/>
<rom name="Communicator III (1994)(Eureka)(M3)[!].iso" size="48044032" crc="7eb8b58b" md5="ed02e5074b7ec923afef24ab16c57b73" sha1="2cea5dc40a8ab1883d50f4c1e82ff7d9ff22f50b"/>
</game>
<game name="FolioworX Player v1.34f (1995)(COME)[!][Amiga-CD32]">
<description>FolioworX Player v1.34f (1995)(COME)[!][Amiga-CD32]</description>
<rom name="FolioworX Player v1.34f (1995)(COME)[!][Amiga-CD32].cue" size="140" crc="52567d98" md5="d6fc5c90ab6a9fc2b1492de074cc1b2f" sha1="798de98096e868dbf9869f92ed856563842c317e"/>
<rom name="FolioworX Player v1.34f (1995)(COME)[!][Amiga-CD32].iso" size="1437696" crc="6d912b19" md5="a0ff8bf85fca2e4fae3d85bd520f79f5" sha1="650bc64432a330afdb9ea5871b4d084e41be6277"/>
</game>
<game name="Network CD Volume 2 (1995)(Weird Science)[!]">
<description>Network CD Volume 2 (1995)(Weird Science)[!]</description>
<rom name="Network CD Volume 2 (1995)(Weird Science)[!].cue" size="133" crc="014ad67c" md5="c9abd5b3057209dfc2e92cd9a3808fa7" sha1="b0a3052acad8781ee3f37aa1c6e55b85e80f325a"/>
<rom name="Network CD Volume 2 (1995)(Weird Science)[!].iso" size="659419136" crc="9d9ddf23" md5="150febdf82894474df1bcf1cf823c7dc" sha1="86208437e9b9663f4e0c5f59130b638dbe7ebd65"/>
</game>
<game name="PhotoLite (1994)(Eureka)(de-en)[!]">
<description>PhotoLite (1994)(Eureka)(de-en)[!]</description>
<rom name="PhotoLite (1994)(Eureka)(de-en)[!].cue" size="123" crc="1f6500ba" md5="e0e6c4117c05e7fe755b46d9233ad3c1" sha1="10b3c2abb8aa4917bf25fd3dc290ec3ecc127838"/>
<rom name="PhotoLite (1994)(Eureka)(de-en)[!].iso" size="1001472" crc="3a8f81a8" md5="c44aa4f6bc94dd6f11a3d2ee6f46ca06" sha1="ac30eb0d3cd51c524c704980ce6b2fdf451f1c1d"/>
</game>
<game name="Video Creator v1.1 (1994)(Almathera)[!][FMV enhanced]">
<description>Video Creator v1.1 (1994)(Almathera)[!][FMV enhanced]</description>
<rom name="Video Creator v1.1 (1994)(Almathera)(Track 1 of 2)[!][FMV enhanced].iso" size="121792512" crc="4b438965" md5="b5f7a1b93dd529dc62e8a5d198e6522b" sha1="7b44974534b0d03c4a098452feec465d40691e96"/>
<rom name="Video Creator v1.1 (1994)(Almathera)(Track 2 of 2)[!][FMV enhanced].wav" size="5202668" crc="89ef7e2a" md5="e9030c189538dd9fe035189e1a8482d1" sha1="3c9880777591da28d49fee19e7e5323841f163dd"/>
<rom name="Video Creator v1.1 (1994)(Almathera)[!][FMV enhanced].cue" size="303" crc="40e28a54" md5="ee4f9203b507f9b073b6638681d8bf55" sha1="7e7e195aacd7593d44f4164731320eb7e42c4b13"/>
</game>
</datafile>

View File

@ -0,0 +1,139 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE datafile PUBLIC "-//Logiqx//DTD ROM Management Datafile//EN" "http://www.logiqx.com/Dats/datafile.dtd">
<datafile>
<header>
<name>Commodore C64 - Animations - [D64]</name>
<description>Commodore C64 - Animations - [D64] (TOSEC-v2021-07-26)</description>
<category>TOSEC</category>
<version>2021-07-26</version>
<author>Duncan Twain</author>
<email>contact@tosecdev.org</email>
<homepage>TOSEC</homepage>
<url>http://www.tosecdev.org</url>
</header>
<game name="Max headroom (19xx)(FBI)">
<description>Max headroom (19xx)(FBI)</description>
<rom name="Max headroom (19xx)(FBI).d64" size="174848" crc="b3c1f35f" md5="85d6ed90b5cb1e8f32ff0133b7d198fd" sha1="0fe0405e0af14c83c0e5cf142eedc3a69162637e"/>
</game>
<game name="Max headroom (19xx)(FBI)[a]">
<description>Max headroom (19xx)(FBI)[a]</description>
<rom name="Max headroom (19xx)(FBI)[a].d64" size="174848" crc="09cf5bc6" md5="3aeae98b6568d559c644725a02eecc38" sha1="6060d350b1cc3370126af690c1959f273350574a"/>
</game>
<game name="Max headroom (19xx)(FBI)[a2]">
<description>Max headroom (19xx)(FBI)[a2]</description>
<rom name="Max headroom (19xx)(FBI)[a2].d64" size="174848" crc="baaadefe" md5="de4ff85f073e9df366b808c13032052f" sha1="24b9072a9d8387e24decb7b067876656c35f8ca3"/>
</game>
<game name="Max headroom (19xx)(FBI)[a3]">
<description>Max headroom (19xx)(FBI)[a3]</description>
<rom name="Max headroom (19xx)(FBI)[a3].d64" size="174848" crc="27027f91" md5="b835020e5a596fcea1ebff55d7276818" sha1="9d8e26b985432fc0b9bf2482d18595a10ec04ff1"/>
</game>
<game name="Max headroom (19xx)(FBI)[a4]">
<description>Max headroom (19xx)(FBI)[a4]</description>
<rom name="Max headroom (19xx)(FBI)[a4].d64" size="174848" crc="b27d9670" md5="8f29fe51dedf2de521b4549fdcd38857" sha1="5ccde20c08bb830ca3f959174b4f95e630abf2be"/>
</game>
<game name="Max headroom (19xx)(FBI)[a5]">
<description>Max headroom (19xx)(FBI)[a5]</description>
<rom name="Max headroom (19xx)(FBI)[a5].d64" size="174848" crc="9c5c8172" md5="32ba3c407a5305ae463fdca8a3174736" sha1="ddda9bd3fc709ab26a6b23435cc1f8d543b22dee"/>
</game>
<game name="Max headroom (19xx)(FBI)[a6]">
<description>Max headroom (19xx)(FBI)[a6]</description>
<rom name="Max headroom (19xx)(FBI)[a6].d64" size="174848" crc="01f4201d" md5="c2b598902d09ff23652be786d8410197" sha1="ee3b949aba51196fd89d6093b66c5421bd1ffd0b"/>
</game>
<game name="Notlandung (1985-02)(Schleeweiss, R)(de)">
<description>Notlandung (1985-02)(Schleeweiss, R)(de)</description>
<rom name="Notlandung (1985-02)(Schleeweiss, R)(de).d64" size="174848" crc="8b3836d4" md5="230ddd888a6ad1452ba37c2369604e8c" sha1="08e8ea0d97c80dcd7cfdcca73f49e0ad9f4d2e39"/>
</game>
<game name="Notlandung (1985-02)(Schleeweiss, R)(de)[a]">
<description>Notlandung (1985-02)(Schleeweiss, R)(de)[a]</description>
<rom name="Notlandung (1985-02)(Schleeweiss, R)(de)[a].d64" size="174848" crc="dda88c03" md5="8947ce581604b49b61c07f69459cccb4" sha1="4da7e09dc317f176b23b742d5eaed0035b912323"/>
</game>
<game name="Notlandung (1985-02)(Schleeweiss, R)(de)[a2]">
<description>Notlandung (1985-02)(Schleeweiss, R)(de)[a2]</description>
<rom name="Notlandung (1985-02)(Schleeweiss, R)(de)[a2].d64" size="174848" crc="908f2b9f" md5="c5042d9d36ddb7e2217d2c02648c9b0d" sha1="86e90401cc9542c45eec0f84322fcc4fbe9da819"/>
</game>
<game name="Notlandung (1985-02)(Schleeweiss, R)(de)[a3]">
<description>Notlandung (1985-02)(Schleeweiss, R)(de)[a3]</description>
<rom name="Notlandung (1985-02)(Schleeweiss, R)(de)[a3].d64" size="174848" crc="dff6500a" md5="532b13be4c1fadd2f32a8076a782570d" sha1="bba2c4941bbeb28004999a097963b20f18cc70cc"/>
</game>
<game name="Notlandung (1985-02)(Schleeweiss, R)(de)[a4]">
<description>Notlandung (1985-02)(Schleeweiss, R)(de)[a4]</description>
<rom name="Notlandung (1985-02)(Schleeweiss, R)(de)[a4].d64" size="174848" crc="8966eadd" md5="7ae26304635070620593249dac1b3960" sha1="0d1fea17e9803dc907831d29fa0f80d5835df8da"/>
</game>
<game name="Notlandung (1985-02)(Schleeweiss, R)(de)[h Vision]">
<description>Notlandung (1985-02)(Schleeweiss, R)(de)[h Vision]</description>
<rom name="Notlandung (1985-02)(Schleeweiss, R)(de)[h Vision].d64" size="174848" crc="060c53ac" md5="002e7071a23a793ae3d08b679f1b4a70" sha1="34979f75579aeb52f83f93083d2a7d257d9e773d"/>
</game>
<game name="Notlandung (1985-02)(Schleeweiss, R)(de)[h Vision][a]">
<description>Notlandung (1985-02)(Schleeweiss, R)(de)[h Vision][a]</description>
<rom name="Notlandung (1985-02)(Schleeweiss, R)(de)[h Vision][a].d64" size="174848" crc="7ee8f23e" md5="d895024f7d4b400b7042593ca8fbbb43" sha1="4c93ec0c7262b322c4364aae2aa96c7019dcc089"/>
</game>
<game name="Porn animation #3 (198x)(-)">
<description>Porn animation #3 (198x)(-)</description>
<rom name="Porn animation #3 (198x)(-).d64" size="174848" crc="7091a869" md5="da2122345ff9ab36a0b7351ffc50fdb1" sha1="b29ed359de0bfde776d25fbb6b504522af1984a1"/>
</game>
<game name="Porn animation #3 (198x)(-)[a]">
<description>Porn animation #3 (198x)(-)[a]</description>
<rom name="Porn animation #3 (198x)(-)[a].d64" size="174848" crc="ed390906" md5="5762cf966215e40dfe6491531fff072f" sha1="a17d55005cfef8cf9162988c307d6cd4b29ca611"/>
</game>
<game name="Porn animation #5 (198x)(-)">
<description>Porn animation #5 (198x)(-)</description>
<rom name="Porn animation #5 (198x)(-).d64" size="174848" crc="593246a6" md5="c06c8d4e0c3c65ad42d6dce34b897700" sha1="4b12baa4b8af95781fd79ea43bf02c2bbfefe593"/>
</game>
<game name="Porn animation #5 (198x)(-)[a]">
<description>Porn animation #5 (198x)(-)[a]</description>
<rom name="Porn animation #5 (198x)(-)[a].d64" size="174848" crc="ba0371da" md5="9cf01f86754f9c7c57d77a1bc0bda412" sha1="4172e4498ab8d875b48986e140bab6a4bf8a5fc2"/>
</game>
<game name="Porn animation #5 (198x)(-)[a2]">
<description>Porn animation #5 (198x)(-)[a2]</description>
<rom name="Porn animation #5 (198x)(-)[a2].d64" size="174848" crc="a3576c1a" md5="19320bc7866e0d404dd5b07b973f35b7" sha1="6724916a02343589378fa9617642c4a9106f25a5"/>
</game>
<game name="Porn animation #5 (198x)(-)[a3]">
<description>Porn animation #5 (198x)(-)[a3]</description>
<rom name="Porn animation #5 (198x)(-)[a3].d64" size="174848" crc="9ac35a9a" md5="3f1c6375e0d26cce00d8ff66b743a88f" sha1="f3a5cc546cedc05b499589af9fa38939046c0329"/>
</game>
<game name="Porn animation #5 (198x)(-)[a4]">
<description>Porn animation #5 (198x)(-)[a4]</description>
<rom name="Porn animation #5 (198x)(-)[a4].d64" size="174848" crc="06b42455" md5="418fe7fadb0069bbf9c6cc9ee2345500" sha1="119080f93c32f02f59d86422e179d94d802482f1"/>
</game>
<game name="Porn animation #5 (198x)(-)[a5]">
<description>Porn animation #5 (198x)(-)[a5]</description>
<rom name="Porn animation #5 (198x)(-)[a5].d64" size="174848" crc="9b1c853a" md5="a516bf86f7b394924b90ded7ffe67a46" sha1="d80580ccbd09f78e92ff830456533f34f73667bd"/>
</game>
<game name="Porn animation #5 (198x)(-)[a6]">
<description>Porn animation #5 (198x)(-)[a6]</description>
<rom name="Porn animation #5 (198x)(-)[a6].d64" size="174848" crc="579722bf" md5="746309569973c4dda103ca0a44501aed" sha1="45fbeab4bb1c6bd600556c7db6d977bff8bb90e0"/>
</game>
<game name="Porn animation #5 (198x)(-)[a7]">
<description>Porn animation #5 (198x)(-)[a7]</description>
<rom name="Porn animation #5 (198x)(-)[a7].d64" size="174848" crc="ca3f83d0" md5="05f4175cc02c31e635d934a7983843b6" sha1="0eaec3ac81d31f2fa9f4019462f54746ac9b687b"/>
</game>
<game name="Porno Movie 1 (1985)(Loverboy Crackings - The Wild Boys)">
<description>Porno Movie 1 (1985)(Loverboy Crackings - The Wild Boys)</description>
<rom name="Porno Movie 1 (1985)(Loverboy Crackings - The Wild Boys).d64" size="174848" crc="fa29ec36" md5="ab288b37fa34e90cb472b2e40b89013a" sha1="1d20f14c64f4cb604ed4a3d5b95999fc9219fce1"/>
</game>
<game name="Porno Movie 1 (1985)(Loverboy Crackings - The Wild Boys)[a]">
<description>Porno Movie 1 (1985)(Loverboy Crackings - The Wild Boys)[a]</description>
<rom name="Porno Movie 1 (1985)(Loverboy Crackings - The Wild Boys)[a].d64" size="174848" crc="7297d14a" md5="94a811f0160f40286c15b3d60d6aeaf6" sha1="879670fe9933e73d2c7c8d67776b0bed130e3fa1"/>
</game>
<game name="Porno Movie 1 (1985)(Loverboy Crackings - The Wild Boys)[a2]">
<description>Porno Movie 1 (1985)(Loverboy Crackings - The Wild Boys)[a2]</description>
<rom name="Porno Movie 1 (1985)(Loverboy Crackings - The Wild Boys)[a2].d64" size="174848" crc="87ace4cf" md5="e6651ae60ffa2caa1f95c7f0cdc587b9" sha1="f9266d082b999dcc7033d8be60ca80d137164c4b"/>
</game>
<game name="Porno Movie 1 (1985)(Loverboy Crackings - The Wild Boys)[a3]">
<description>Porno Movie 1 (1985)(Loverboy Crackings - The Wild Boys)[a3]</description>
<rom name="Porno Movie 1 (1985)(Loverboy Crackings - The Wild Boys)[a3].d64" size="174848" crc="2787c54a" md5="8a92a70c100c6f4a6006d64e77091c4e" sha1="9bcebe9e1e6f4e28240a41d3294c99095a8200bc"/>
</game>
<game name="Porno Movie 1 (1985)(Loverboy Crackings - The Wild Boys)[a4]">
<description>Porno Movie 1 (1985)(Loverboy Crackings - The Wild Boys)[a4]</description>
<rom name="Porno Movie 1 (1985)(Loverboy Crackings - The Wild Boys)[a4].d64" size="174848" crc="d8a99e69" md5="7531944ec53029b7ffbac03e53449446" sha1="3370e1ddda602d248e149e63e6d8ef1797a61566"/>
</game>
<game name="Porno Movie 1 (1985)(Loverboy Crackings - The Wild Boys)[a5]">
<description>Porno Movie 1 (1985)(Loverboy Crackings - The Wild Boys)[a5]</description>
<rom name="Porno Movie 1 (1985)(Loverboy Crackings - The Wild Boys)[a5].d64" size="174848" crc="45013f06" md5="8a6fd37e4f650f2bb5ced886be053d4e" sha1="a8dcda036b5b21d36e6a797665b584e98260c482"/>
</game>
<game name="Porno Movie 1 (1985)(Loverboy Crackings - The Wild Boys)[a6]">
<description>Porno Movie 1 (1985)(Loverboy Crackings - The Wild Boys)[a6]</description>
<rom name="Porno Movie 1 (1985)(Loverboy Crackings - The Wild Boys)[a6].d64" size="174848" crc="8cc1259d" md5="77371b38528d46e19042bf8d613b6340" sha1="7d1251216110cef5e6ff3ee0501f6a770d9a7d08"/>
</game>
</datafile>

Binary file not shown.

View File

@ -0,0 +1,28 @@
<html>
<head>
<script language="JavaScript">
function keyHandler(e)
{
var pressedKey;
if (document.all)
{
e = window.event;
}
if (document.layers || e.which)
{
pressedKey = e.which;
}
if (document.all)
{
pressedKey = e.keyCode;
}
pressedCharacter = String.fromCharCode(pressedKey);
alert(' Character = ' + pressedCharacter + ' [Decimal value = ' + pressedKey + ']');
}
document.onkeyup = keyHandler;
</script>
</head>
<body>
Press any key.
</body>
</html>

View File

@ -0,0 +1,21 @@
<?php
$cmd = "uname";
$OS = strtolower(trim(shell_exec($cmd)));
switch($OS){
case('linux'):
$cmd = "cat /proc/cpuinfo | grep processor | wc -l";
break;
case('freebsd'):
$cmd = "sysctl -a | grep 'hw.ncpu' | cut -d ':' -f2";
break;
default:
unset($cmd);
}
if ($cmd != ''){
$cpuCoreNo = intval(trim(shell_exec($cmd)));
}
?>

View File

@ -0,0 +1,50 @@
<?php
/* This file is meant to run from the CLI/Shell
* it extracts the first page of a pdf file and saves to
* jpg with same name + _thumb pic being 240pix wide
* Author Carsten Jensen aka Tomse @ http://awesome.commodore.me
* Copyright (C) 2012 Carsten Jensen
* This is distributed under GNU GPLv2
*/
/* Requirements:
* php (cli/shell version) / or as apache site
* imagemagick module
*/
/* Usage:
* Run the file from the browser (apache setup)
* or from cli : php -f extract
* thumb files will be saved in same dir as pdf files
*/
// Edit the path here where your PDF files are stored.
$dir = "./pages/";
// Edit width in pixels to change sizes
$size = 240;
// Replace false with true to make the script work
$work = false;
// code is here.. nothing more to modify
// -------------------------------------
if ($work == true)
{
$files = glob($dir . "*.[pP][dD][fF]");
foreach($files as $v)
{
$filename = substr($v, 0, strlen($v) - 4);
$thumb = new Imagick();
$thumb->setResolution(300, 300);
$thumb->readImage($v ."[0]");
$thumb->setImageFormat('jpeg');
$thumb->setImagecompression(imagick::COMPRESSION_JPEG);
$thumb->setImageCompressionQuality(75);
$thumb->resizeImage($size, 1024, imagick::FILTER_LANCZOS, 1, true);
$thumb->writeImage($filename . "_thumb.jpg");
$thumb->clear();
$thumb->destroy();
}
}
?>

Binary file not shown.

View File

@ -0,0 +1,7 @@
for %%i in (vids\*.*) DO (
ffmpeg -i %%i -ss 180 -vframes 1 -r 1 -s 320x200 -f image2 output\%%~ni.jpg
ffmpeg -i %%i -s 320x200 -acodec libvorbis -f webm -b:v 150k -bufsize 16k -vcodec libvpx output\%%~ni.webm -s 320x200 -acodec libmp3lame -b:v 150k -bufsize 16k -vcodec libx264 output\%%~ni.mp4
)
pause

17
ScanScripts/README.md Normal file
View File

@ -0,0 +1,17 @@
# ScanScripts
This is a collection of tools that I use for almost every PDF file I create
The following are Windows, Linux shell scripts might come at a later date if I or someone else care to write these.
Required installs for these scripts are IrfanView, ImageMagick (version 6), PDF Toolkit, PHP (5.6) CLI
The versions have been testet, newer versions aren't tested
https://www.irfanview.com/
https://www.imagemagick.org/script/download.php#windows
https://www.pdflabs.com/tools/pdftk-server/
https://windows.php.net/download#php-5.6

View File

@ -0,0 +1,14 @@
@echo off
rem Author: Carsten Jensen (Tomse)
rem Copyright (c) 2013-2018 http://retro-commodore.eu
rem Requires ImageMagick commandline in path
mkdir work
cd origs
for %%i in (*.tif) DO (
convert "%%i" -level 11%%,86%% "..\work\%%i"
)
for %%i in (*.png) DO (
convert "%%i" -level 11%%,86%% "..\work\%%i"
)

View File

@ -0,0 +1,14 @@
@echo off
rem Author: Carsten Jensen (Tomse)
rem Copyright (c) 2013-2018 http://retro-commodore.eu
rem Requires ImageMagick commandline in path
cd work/out
for %%i in (*.tif) DO (
convert -units PixelsPerInch "%%i" -density 600 "__%%i"
move "__%%i" "%%i"
)
for %%i in (*.png) DO (
convert -units PixelsPerInch "%%i" -density 600 "__%%i"
move "__%%i" "%%i"
)

View File

@ -0,0 +1,8 @@
@echo off
rem Author: Carsten Jensen (Tomse)
rem Copyright (c) 2013-2018 http://retro-commodore.eu
rem Requires IrfanView installed in path (or fix path)
mkdir work\out\g4compressed
cd work\out
"c:\Program Files (x86)\IrfanView\i_view32.exe" .\*.tif /tifc=4 /convert=.\g4compressed\*.tif

View File

@ -0,0 +1,48 @@
@echo off
rem Author: Carsten Jensen (Tomse)
rem Copyright (c) 2013-2018 http://retro-commodore.eu
rem Requires ImageMagick and pdf tool kit commandline in path
setlocal EnableDelayedExpansion
set folder=%cd%
cd work\out
choice /m "Fix paging "
if %errorlevel%==1 (
copy D:\Retro-Work\correct_pages.php .\ /y
php -f correct_pages.php
cd newpages
)
choice /C LSN /m "Use large (L), small (S) or no (N) lastpage "
if %errorlevel%==1 (
set page=brought_to_you_by.pdf
) else if %errorlevel%==2 (
set page=brought_to_you_by_[TABLET].pdf
)
if NOT EXIST output mkdir output
set thumb=1
for %%i in (*.tif) DO (
if !thumb!==1 (
convert %%i -resize 240x310^^! -quality 80%% "!folder!\thumb.jpg"
)
set thumb=2
convert %%i output\%%~ni.pdf
)
cd output
REM for %%i in (*.jpg) DO (
REM convert %%i %%~ni.pdf
REM )
REM del *.jpg /q
pdftk *.pdf "D:\Retro-Work\%page%" cat output "%folder%\_manual.pdf"
pdftk "%folder%\_manual.pdf" update_info D:\Retro-Work\metadata.txt output "%folder%\manual.pdf"
del *.pdf /q
REM del ..\*.* /q
del "%folder%\_manual.pdf" /q
pause

View File

@ -0,0 +1,9 @@
@echo off
rem Author: Carsten Jensen (Tomse)
rem Copyright (c) 2013-2018 http://retro-commodore.eu
rem Requires pdf tool kit commandline in path
set workdir="D:\Retro-Work\"
pdftotext manual_recognized.pdf manual2.ocr.txt
pdftk "manual_recognized.pdf" update_info %workdir%\metadata.txt output "manual2.pdf"

View File

@ -0,0 +1,22 @@
@echo off
rem Author: Carsten Jensen (Tomse)
rem Copyright (c) 2013-2018 http://retro-commodore.eu
rem Requires md5sum and sha1sum commandline tools in path
for %%i in (*.pdf) DO (
md5sum %%i > %%i.md5
sha1sum %%i > %%i.sha1
)
for %%i in (*.ocr.txt) DO (
md5sum %%i > %%i.md5
sha1sum %%i > %%i.sha1
)
for %%i in (*.zip) DO (
md5sum %%i > %%i.md5
sha1sum %%i > %%i.sha1
)

View File

@ -0,0 +1,3 @@
If you want to use the scripts keep the directory structure from this level and save in your D: drive
otherwise just edit the scripts to fit your needs.

View File

@ -0,0 +1,65 @@
<?php
// Author Carsten Jensen aka Tomse
// Copyright (c) 2013-2018 Carsten Jensen
// Released under GNU GPL v2
// Corrects page numbers from scanned full-paper pages
// which has been split into 2, and been edited in scan tailor
$ext = '.tif';
$files = glob('*.tif');
// set to 0 if back page lies first, or 1 if frontpage lies first
$up = 0;
$down = count($files);
$dest = 'newpages';
$pad = strlen($down)+1;
@mkdir($dest);
$again = 1;
$back = true;
foreach($files as $k => $v)
{
if($back === true)
{
copy($v, $dest . DIRECTORY_SEPARATOR . 'page' . padding($down, $pad) . $ext);
$down--;
if ($again > 2 OR $k == 0)
{
$again = 1;
$back = false;
}
echo "$k => $down \n";
$again++;
}
else
{
copy($v, $dest . DIRECTORY_SEPARATOR . 'page' . padding($up, $pad) . $ext);
$up++;
if ($again > 2)
{
$again = 1;
$back = true;
}
echo "$k => $up \n";
$again++;
}
}
/**
* Pads a number with zeroes to make a nice even lenghted result
* Author Carsten Jensen
* @param int $int number to be padded
* @param int $length of padding
* @return int padded number
*/
function padding($int, $length = 2)
{
return str_pad($int, $length, 0, STR_PAD_LEFT);
}
?>

View File

@ -0,0 +1,20 @@
@echo off
REM Script to be run from within dir with .dats (move script)
setlocal EnableDelayedExpansion
for %%i in (*.dat) do (
(echo %%~fi) > tempfile.txt
for %%? IN (tempfile.txt) DO ( SET /A strlength=%%~z? - 2 )
echo !strlength!
if !strlength! GTR 256 echo "%%i is too large"
)
del tempfile.txt /q
endlocal
REM Create dir script can begin here
pause

View File

@ -0,0 +1,53 @@
<?php
// Author Carsten Jensen aka Tomse
// Copyright (c) 2013 Carsten Jensen
// Released under GNU GPL v2
// Corrects page numbers from scanned full-paper pages
// which has been split into 2, and been edited in scan tailor
$ext = '.tif';
$files = glob('*.tif');
// set to 0 if back page lies first, or 1 if frontpage lies first
$up = 0;
$down = count($files);
$odd = 'odd';
$even = 'even';
$pad = strlen($down)+1;
@mkdir ($odd);
@mkdir ($even);
$again = 1;
$back = true;
foreach($files as $k => $v)
{
if ($up % 2) // Even pages
{
copy($v, $even . DIRECTORY_SEPARATOR . 'page' . padding($up, $pad) . $ext);
$up++;
echo "$k => even\\ $up \n";
}
else
{
copy($v, $odd . DIRECTORY_SEPARATOR . 'page' . padding($down, $pad) . $ext);
$up++;
$down--;
echo "$k => odd\\ $down \n";
}
}
/**
* Pads a number with zeroes to make a nice even lenghted result
* Author Carsten Jensen
* @param int $int number to be padded
* @param int $length of padding
* @return int padded number
*/
function padding($int, $length = 2)
{
return str_pad($int, $length, 0, STR_PAD_LEFT);
}
?>