Initial Commit

master
Harald Wolff 2020-02-04 21:47:37 +01:00
commit d4dac10701
7 changed files with 463 additions and 0 deletions

43
.gitignore vendored 100644
View File

@ -0,0 +1,43 @@
# Autosave files
*~
# build
[Oo]bj/
[Bb]in/
packages/
TestResults/
# globs
Makefile.in
*.DS_Store
*.sln.cache
*.suo
*.cache
*.pidb
*.userprefs
*.usertasks
config.log
config.make
config.status
aclocal.m4
install-sh
autom4te.cache/
*.user
*.tar.gz
tarballs/
test-results/
Thumbs.db
.vs/
# Mac bundle stuff
*.dmg
*.app
# resharper
*_Resharper.*
*.Resharper
# dotCover
*.dotCover
ln.logging

35
ln.pdfstamp.sln 100644
View File

@ -0,0 +1,35 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ln.pdfstamp", "ln.pdfstamp\ln.pdfstamp.csproj", "{46B56B79-78AC-44AF-A85C-B6A8E3F79420}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ln.http", "..\ln.http\ln.http.csproj", "{CEEEEB41-3059-46A2-A871-2ADE22C013D9}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ln.types", "..\ln.types\ln.types.csproj", "{8D9AB9A5-E513-4BA7-A450-534F6456BF28}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ln.logging", "..\ln.logging\ln.logging.csproj", "{D471A566-9FB6-41B2-A777-3C32874ECD0E}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x86 = Debug|x86
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{46B56B79-78AC-44AF-A85C-B6A8E3F79420}.Debug|x86.ActiveCfg = Debug|x86
{46B56B79-78AC-44AF-A85C-B6A8E3F79420}.Debug|x86.Build.0 = Debug|x86
{46B56B79-78AC-44AF-A85C-B6A8E3F79420}.Release|x86.ActiveCfg = Release|x86
{46B56B79-78AC-44AF-A85C-B6A8E3F79420}.Release|x86.Build.0 = Release|x86
{CEEEEB41-3059-46A2-A871-2ADE22C013D9}.Debug|x86.ActiveCfg = Debug|Any CPU
{CEEEEB41-3059-46A2-A871-2ADE22C013D9}.Debug|x86.Build.0 = Debug|Any CPU
{CEEEEB41-3059-46A2-A871-2ADE22C013D9}.Release|x86.ActiveCfg = Release|Any CPU
{CEEEEB41-3059-46A2-A871-2ADE22C013D9}.Release|x86.Build.0 = Release|Any CPU
{8D9AB9A5-E513-4BA7-A450-534F6456BF28}.Debug|x86.ActiveCfg = Debug|Any CPU
{8D9AB9A5-E513-4BA7-A450-534F6456BF28}.Debug|x86.Build.0 = Debug|Any CPU
{8D9AB9A5-E513-4BA7-A450-534F6456BF28}.Release|x86.ActiveCfg = Release|Any CPU
{8D9AB9A5-E513-4BA7-A450-534F6456BF28}.Release|x86.Build.0 = Release|Any CPU
{D471A566-9FB6-41B2-A777-3C32874ECD0E}.Debug|x86.ActiveCfg = Debug|Any CPU
{D471A566-9FB6-41B2-A777-3C32874ECD0E}.Debug|x86.Build.0 = Debug|Any CPU
{D471A566-9FB6-41B2-A777-3C32874ECD0E}.Release|x86.ActiveCfg = Release|Any CPU
{D471A566-9FB6-41B2-A777-3C32874ECD0E}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
EndGlobal

View File

@ -0,0 +1,146 @@
// /**
// * File: Daemon.cs
// * Author: haraldwolff
// *
// * This file and it's content is copyrighted by the Author and / or copyright holder.
// * Any use wihtout proper permission is illegal and may lead to legal actions.
// *
// *
// **/
using System;
using ln.http;
using ln.http.router;
using System.IO;
using ln.types.net;
using ln.http.message;
using ln.types;
using iTextSharp.text.pdf;
using System.Collections.Generic;
using iTextSharp.text;
namespace ln.pdfstamp
{
public class Daemon
{
public string SpoolPath { get; }
HTTPServer server;
SimpleRouter router;
public Daemon()
{
int prio = 1;
router = new SimpleRouter();
foreach (String p in new string[] { "www", "../../www" })
{
if (Directory.Exists(p))
{
StaticRouter staticRouter = new StaticRouter(p);
router.AddSimpleRoute("/*", staticRouter, prio++);
}
}
if (Directory.Exists("/var/spool/ln.pdfstamp"))
{
SpoolPath = "/var/spool/ln.pdfstamp";
}
else
{
SpoolPath = "./spool";
}
EnsureDirectory(SpoolPath);
EnsureDirectory(Path.Combine(SpoolPath, "stamps"));
EnsureDirectory(Path.Combine(SpoolPath, "stamped"));
StaticRouter spoolRouter = new StaticRouter(SpoolPath);
router.AddSimpleRoute("/spool/*", spoolRouter);
router.AddSimpleRoute("/api/stamp/:stamp", new RouterTarget(PostPDF));
}
public void EnsureDirectory(string path)
{
if (!Directory.Exists(path))
Directory.CreateDirectory(path);
}
public void Start()
{
server = new HTTPServer(new Endpoint(IPv6.ANY, 8888),
new LoggingRouter(router)
);
server.Start();
}
HttpResponse PostPDF(HttpRequest request)
{
MemoryStream pdfOutput = new MemoryStream();
Stream pdfInput = null;
if (request.Method.Equals("POST"))
{
switch (request.RequestHeaders["Content-Type"].Value)
{
case "application/pdf":
pdfInput = request.ContentStream;
break;
case "multipart/form-data":
pdfInput = FindMultipartPDF(request);
break;
default:
throw new NotSupportedException();
}
} else if (request.Method.Equals("PUT"))
{
pdfInput = request.ContentStream;
}
Stamp(
pdfInput,
request.GetParameter("stamp"),
float.Parse(request.Query.GetValue("left","20")),
float.Parse(request.Query.GetValue("top", "10")),
float.Parse(request.Query.GetValue("width", "70")),
pdfOutput
);
string spoolFileName = String.Format("{0}-stamped.pdf",DateTime.Now.ToString("yyyyMMdd-HHmmss"));
pdfOutput = new MemoryStream(pdfOutput.ToArray());
using (FileStream pdfOutputStream = new FileStream(Path.Combine(SpoolPath, "stamped", spoolFileName), FileMode.CreateNew))
{
pdfOutput.CopyTo(pdfOutputStream);
}
HttpResponse response = new HttpResponse(request);
response.StatusCode = 302;
response.AddHeader("Location", String.Format("/spool/stamped/{0}",spoolFileName));
return response;
}
public Stream FindMultipartPDF(HttpRequest request)
{
Message message = new Message(request.RequestHeaders, request.ContentStream.ReadToEnd());
foreach (Message part in message.Parts)
{
if (part.Headers["CONTENT-TYPE"].Value.Equals("application/pdf"))
return part.OpenBodyStream();
}
throw new KeyNotFoundException("Could not find valid PDF file to stamp");
}
public void Stamp(Stream pdfInput,string stampImageFileName,float left,float top,float width,Stream pdfOutput)
{
Image stampImage = Image.GetInstance(Path.GetFullPath(Path.Combine(SpoolPath, "stamps", stampImageFileName)));
PDFStamp.Stamp(pdfInput, stampImage, left, top, width, pdfOutput);
}
}
}

View File

@ -0,0 +1,63 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
<ProjectGuid>{46B56B79-78AC-44AF-A85C-B6A8E3F79420}</ProjectGuid>
<OutputType>Exe</OutputType>
<RootNamespace>ln.pdfstamp</RootNamespace>
<AssemblyName>ln.pdfstamp</AssemblyName>
<TargetFrameworkVersion>v4.7</TargetFrameworkVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug</OutputPath>
<DefineConstants>DEBUG;</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<PlatformTarget>x86</PlatformTarget>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
<Optimize>true</Optimize>
<OutputPath>bin\Release</OutputPath>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<PlatformTarget>x86</PlatformTarget>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\..\ln.types\ln.types.csproj">
<Project>{8D9AB9A5-E513-4BA7-A450-534F6456BF28}</Project>
<Name>ln.types</Name>
</ProjectReference>
<ProjectReference Include="..\..\ln.logging\ln.logging.csproj">
<Project>{D471A566-9FB6-41B2-A777-3C32874ECD0E}</Project>
<Name>ln.logging</Name>
</ProjectReference>
<ProjectReference Include="..\..\ln.http\ln.http.csproj">
<Project>{CEEEEB41-3059-46A2-A871-2ADE22C013D9}</Project>
<Name>ln.http</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<Compile Include="pdfstamp.cs" />
<Compile Include="Daemon.cs" />
</ItemGroup>
<ItemGroup>
<None Include="packages.config" />
<None Include="www\index.html">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
<ItemGroup>
<Reference Include="iTextSharp">
<HintPath>..\packages\iTextSharp-LGPL.4.1.6\lib\iTextSharp.dll</HintPath>
</Reference>
<Reference Include="System" />
</ItemGroup>
<ItemGroup>
<Folder Include="www\" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
</Project>

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="iTextSharp-LGPL" version="4.1.6" targetFramework="net47" />
</packages>

View File

@ -0,0 +1,160 @@
// /**
// * File: pdfstamp.cs
// * Author: haraldwolff
// *
// * This file and it's content is copyrighted by the Author and / or copyright holder.
// * Any use wihtout proper permission is illegal and may lead to legal actions.
// *
// *
// **/
using System;
using ln.types;
using iTextSharp.text.pdf;
using System.IO;
using ln.logging;
using iTextSharp.text;
namespace ln.pdfstamp
{
public class PDFStamp
{
public static void Main(String[] args)
{
ArgumentContainer argumentContainer = new ArgumentContainer();
argumentContainer.Add(new Argument('x', null, "0"));
argumentContainer.Add(new Argument('y', null, "0"));
argumentContainer.Add('s', "stamp", null);
argumentContainer.Add('o', "output", ".");
argumentContainer.Add('e', "extension", ".stamped");
argumentContainer.Add('d', "dpi", "72");
argumentContainer.Add('w', "width", null);
argumentContainer.Add('h', "height", null);
argumentContainer.Add((char)0, "daemon");
argumentContainer.Parse(args);
if (argumentContainer["daemon"].IsSet)
{
Daemon daemon = new Daemon();
daemon.Start();
return;
}
Image stampImage = Image.GetInstance(Path.GetFullPath(argumentContainer['s'].Value));
if (stampImage == null)
{
throw new FileNotFoundException(argumentContainer['s'].Value);
}
float lx = (float)(argumentContainer['x'].DoubleValue / 25.4 * 72);
float ly = (float)(argumentContainer['y'].DoubleValue / 25.4 * 72);
double stampDpiX = stampImage.DpiX == 0 ? 72 : stampImage.DpiX; // / argumentContainer['d'].DoubleValue;
double stampDpiY = stampImage.DpiY == 0 ? 72 : stampImage.DpiY; // / argumentContainer['d'].DoubleValue;
double stampWidth = stampImage.Width / stampDpiX * 25.4;
double stampHeight = stampImage.Height / stampDpiY * 25.4;
Logging.Log(LogLevel.DEBUG, "Stamp: {0}/{1}", stampWidth, stampHeight);
if (argumentContainer['w'].HasValue && argumentContainer['h'].HasValue)
{
Logging.Log(LogLevel.DEBUG, "WH");
stampWidth = (float)argumentContainer['w'].DoubleValue;
stampHeight = (float)argumentContainer['h'].DoubleValue;
}
else if (argumentContainer['w'].HasValue && !argumentContainer['h'].HasValue)
{
Logging.Log(LogLevel.DEBUG, "W");
stampHeight *= argumentContainer['w'].DoubleValue / stampWidth;
stampWidth = (float)argumentContainer['w'].DoubleValue;
}
else if (!argumentContainer['w'].HasValue && argumentContainer['h'].HasValue)
{
Logging.Log(LogLevel.DEBUG, "H");
stampWidth *= argumentContainer['h'].DoubleValue / stampHeight;
stampHeight = (float)argumentContainer['h'].DoubleValue;
}
stampWidth = stampWidth / 25.4 * 72.0;
stampHeight = stampHeight / 25.4 * 72.0;
Logging.Log(LogLevel.DEBUG, "Stamp: {0}/{1}",stampWidth,stampHeight);
foreach (string filename in argumentContainer.AdditionalArguments)
{
string outputFilename = Path.Combine(
argumentContainer['o'].Value,
string.Format("{0}{1}.pdf",Path.GetFileNameWithoutExtension(filename), argumentContainer['e'].Value)
);
Logging.Log(LogLevel.INFO, "{0} -> {1}", filename, outputFilename);
using (FileStream outputStream = new FileStream(outputFilename, FileMode.Create))
{
PdfReader pdfReader = new PdfReader(filename);
PdfStamper pdfStamper = new PdfStamper(pdfReader, outputStream);
for (int p = 0; p < pdfReader.NumberOfPages; p++)
{
Rectangle pageSize = pdfReader.GetPageSize(p + 1);
PdfContentByte overContent = pdfStamper.GetOverContent(p+1);
overContent.AddImage(stampImage, (float)stampWidth, 0, 0, (float)stampHeight, lx, (float)(pageSize.Height - ly - stampHeight));
}
pdfStamper.Close();
pdfReader.Close();
outputStream.Close();
}
}
}
public static void Stamp(Stream pdfStream,Image stampImage,float left,float top,float width,Stream outputStream)
{
float lx = (float)(left / 25.4 * 72);
float ly = (float)(top / 25.4 * 72);
double stampDpiX = stampImage.DpiX == 0 ? 72 : stampImage.DpiX; // / argumentContainer['d'].DoubleValue;
double stampDpiY = stampImage.DpiY == 0 ? 72 : stampImage.DpiY; // / argumentContainer['d'].DoubleValue;
double stampWidth = stampImage.Width / stampDpiX * 25.4;
double stampHeight = stampImage.Height / stampDpiY * 25.4;
Logging.Log(LogLevel.DEBUG, "Stamp: (pre ) {0}/{1}", stampWidth, stampHeight);
stampHeight = stampHeight * width / stampWidth;
stampWidth = width;
stampWidth = stampWidth / 25.4 * 72.0;
stampHeight = stampHeight / 25.4 * 72.0;
Logging.Log(LogLevel.DEBUG, "Stamp: (final) {0}/{1}", stampWidth, stampHeight);
PdfReader pdfReader = new PdfReader(pdfStream);
PdfStamper pdfStamper = new PdfStamper(pdfReader, outputStream);
for (int p = 0; p < pdfReader.NumberOfPages; p++)
{
Rectangle pageSize = pdfReader.GetPageSize(p + 1);
PdfContentByte overContent = pdfStamper.GetOverContent(p + 1);
overContent.AddImage(stampImage, (float)stampWidth, 0, 0, (float)stampHeight, lx, (float)(pageSize.Height - ly - stampHeight));
}
pdfStamper.Close();
pdfReader.Close();
}
}
}

View File

@ -0,0 +1,12 @@
<html>
<head>
<title></title>
</head>
<body>
<form action="/api/stamp/logo_mfb.png" method="POST" enctype="multipart/form-data">
PDF Datei wählen:
<input type="file" name="pdffile"><br>
<input type="submit" value="Upload">
</form>
</body>
</html>