두 개의 PDF 파일을 비교하는 간단한 Java 라이브러리입니다. 파일은 픽셀 단위로 렌더링되고 비교됩니다. 텍스트 비교가 없습니다.
종속성으로 포함하면 됩니다. 사용 가능한 최신 버전을 확인하세요.
< dependencies >
< dependency >
< groupId >de.redsix</ groupId >
< artifactId >pdfcompare</ artifactId >
< version >...</ version > <!-- see current version in the maven central tag above -->
</ dependency >
</ dependencies >
추가 인수(de.redsix.pdfcompare.Main 클래스 시작) 없이 jar 파일을 시작하면 간단한 대화형 UI가 있습니다. 비교할 파일을 선택하고 무시할 영역을 표시하여 무시 파일에 쓸 수 있습니다.
UI 옆에 CLI를 통해 예상 및 실제 파일과 추가 매개변수를 제공할 수 있습니다. CLI에 대한 도움말을 얻으려면 -h 또는 --help 옵션-을 사용하십시오.
usage: java -jar pdfcompare-x.x.x-full.jar [EXPECTED] [ACTUAL]
-h,--help Displays this text and exit
...
그러나 PdfCompare의 초점은 라이브러리로서 임베디드 사용에 있습니다.
new PdfComparator ( "expected.pdf" , "actual.pdf" ). compare (). writeTo ( "diffOutput" );
그러면 발견된 차이점에 대한 표시가 포함될 수 있는 출력 PDF가 생성됩니다. PdfCompare는 예상.pdf의 페이지와 실제.pdf의 동일한 페이지를 비트맵 이미지로 렌더링하고 이 두 이미지를 픽셀 단위로 비교합니다. 동일한 픽셀은 약간 희미해집니다. 서로 다른 픽셀은 빨간색과 녹색으로 표시됩니다. 예상.pdf에는 있지만 실제.pdf에는 없는 픽셀의 경우 녹색입니다. 실제.pdf에는 있지만 예상.pdf에는 없는 픽셀을 나타내는 빨간색입니다. 그리고 종이 가장자리에 마젠타색 표시가 있어서 빠르게 다른 영역을 찾을 수 있습니다. 무시된 영역은 노란색 배경으로 표시됩니다. 예상했지만 오지 않은 페이지에는 빨간색 테두리가 표시됩니다. 나타나지만 예상하지 못한 페이지에는 녹색 테두리가 표시됩니다.
비교 메서드는 쿼리할 수 있는 CompareResult를 반환합니다.
final CompareResult result = new PdfComparator ( "expected.pdf" , "actual.pdf" ). compare ();
if ( result . isNotEqual ()) {
System . out . println ( "Differences found!" );
}
if ( result . isEqual ()) {
System . out . println ( "No Differences found!" );
}
if ( result . hasDifferenceInExclusion ()) {
System . out . println ( "Differences in excluded areas found!" );
}
result . getDifferences (); // returns page areas, where differences were found
편의를 위해 writeTo는 같음 상태도 반환합니다.
boolean isEquals = new PdfComparator ( "expected.pdf" , "actual.pdf" ). compare (). writeTo ( "diffOutput" );
if (! isEquals ) {
System . out . println ( "Differences found!" );
}
비교 메소드는 파일 이름을 문자열, 파일, 경로 또는 입력스트림으로 호출할 수 있습니다.
비교 중에 무시되는 직사각형 영역을 정의하는 것도 가능합니다. 이를 위해서는 무시할 영역을 정의하는 파일을 생성해야 합니다. 파일 형식은 JSON(또는 실제로 HOCON이라는 상위 집합)이며 다음과 같은 형식을 갖습니다.
exclusions: [
{
page : 2
x1 : 300 // entries without a unit are in pixels. Pdfs are rendered by default at 300DPI
y1 : 1000
x2 : 550
y2 : 1300
} ,
{
// page is optional. When not given, the exclusion applies to all pages.
x1 : 130.5 mm // entries can also be given in units of cm, mm or pt (DTP-Point defined as 1/72 Inches)
y1 : 3.3 cm
x2 : 190 mm
y2 : 3.7 cm
} ,
{
page : 7
// coordinates are optional. When not given, the whole page is excluded.
}
]
제공된 제외 파일을 찾을 수 없는 경우 이를 무시하고 제외 없이 비교를 수행합니다.
코드에는 다음과 같은 제외 사항이 제공됩니다.
new PdfComparator ( "expected.pdf" , "actual.pdf" ). withIgnore ( "ignore.conf" ). compare ();
또는 다음과 같이 API를 통해 제외를 추가할 수 있습니다.
new PdfComparator ( "expected.pdf" , "actual.pdf" )
. withIgnore ( new PageArea ( 1 , 230 , 350 , 450 , 420 ))
. withIgnore ( new PageArea ( 2 ))
. compare ();
비밀번호로 보호된 PDF 파일을 비교하려는 경우 각각 withExpectedPassword(String 비밀번호) 또는 withActualPassword(String 비밀번호) 메소드를 통해 비교기에 비밀번호를 제공할 수 있습니다.
new PdfComparator ( "expected.pdf" , "actual.pdf" )
. withExpectedPassword ( "somePwd" )
. withActualPassword ( "anotherPwd" )
. compare ();
PdfCompare는 구성 파일로 구성할 수 있습니다. 기본 구성 파일은 "application.conf"이며 클래스 경로의 루트에 위치해야 합니다.
PdfCompare는 Lightbend Config(이전의 TypeSafe Config)를 사용하여 구성 파일을 읽습니다. 다른 구성 파일을 지정하려면 https://github.com/lightbend/config#standard-behavior에서 이에 대한 자세한 내용을 확인할 수 있습니다. 특히 -Dconfig.file=path/to/file 명령줄 인수를 사용하여 대체 구성 파일을 지정할 수 있습니다.
또는 시스템 환경 변수를 통해 또는 -DvariableName=을 사용하여 Jvm 매개변수로 매개변수를 지정할 수 있습니다.
프로그래밍 방식으로 다른 구성 위치를 지정하는 또 다른 방법은 새 ConfigFileEnvironment(...)를 생성하고 이를 PdfCompare.withEnvironment(...)에 전달하는 것입니다.
application.conf 파일을 통해 변경할 수 있는 모든 설정은 API를 통해 프로그래밍 방식으로 변경할 수도 있습니다. 이렇게 하려면 다음 코드를 사용할 수 있습니다.
new PdfComparator ( "expected.pdf" , "actual.pdf" )
. withEnvironment ( new SimpleEnvironment ()
. setActualColor ( Color . green )
. setExpectedColor ( Color . blue ))
. compare ();
SimpleEnvironment는 할당되지 않은 모든 설정을 기본 환경에 위임합니다.
환경을 통해 메모리 설정(위 참조)과 다음 설정을 구성할 수 있습니다.
DPI=300
PDF 페이지가 렌더링되는 DPI를 설정합니다. 기본값은 300입니다.
예상색상=00B400(녹색)
예상 색상은 예상했지만 존재하지 않는 픽셀에 사용되는 색상입니다. 색상은 HTML-Stlye 형식으로 지정됩니다(앞에 '#' 없이). 처음 두 문자는 색상의 빨간색 부분을 16진수로 정의합니다. 다음 두 문자는 색상의 녹색 부분을 정의합니다. 마지막 두 문자는 사용할 색상의 파란색 부분을 정의합니다.
실제색상=D20000(빨간색)
실제 색상은 존재하지만 예상하지 못한 픽셀에 사용되는 색상입니다. 색상은 HTML-Stlye 형식으로 지정됩니다(앞에 '#' 없이). 처음 두 문자는 색상의 빨간색 부분을 16진수로 정의합니다. 다음 두 문자는 색상의 녹색 부분을 정의합니다. 마지막 두 문자는 사용할 색상의 파란색 부분을 정의합니다.
tempDir=System.property("java.io.tmpdir")
임시 파일을 쓸 디렉터리를 설정합니다. java.io.tmpdir의 기본값은 대부분의 Unix 시스템에서 /tmp와 같이 일반적으로 시스템별 기본값을 결정하는 java 기본값입니다.
allowedDifferenceInPercentPerPage=0.2
페이지마다 다를 수 있는 픽셀의 비율입니다. 기본값은 0입니다. 어떤 이유로 인해 렌더링이 약간 벗어나거나 약간의 오류 마진이 허용되는 경우 비교 중에 무시되는 픽셀 비율을 구성할 수 있습니다. 이렇게 하면 주어진 픽셀 비율보다 더 많은 차이가 있을 때만 차이가 보고됩니다. 백분율은 페이지별로 계산됩니다. EqualPagesToResult를 추가할 때 출력 파일에 차이점이 계속 표시되는 것은 아닙니다.
병렬 처리=true
false로 설정하면 모든 병렬 처리가 비활성화되고 모든 것이 단일 스레드에서 처리됩니다.
addEqualPagesToResult=true
false로 설정하면 차이가 있는 페이지만 결과에 추가되며 이는 결과 차이 PDF 문서입니다.
failureOnMissingIgnoreFile=false
true로 설정하면 무시 파일이 누락되어 예외가 발생합니다. 그렇지 않으면 무시되고 정보 수준 로그 메시지만 기록됩니다.
다양한 특성을 지닌 CompareResults 구현이 몇 가지 있습니다. 시스템 동작의 특정 측면, 특히 메모리 소비를 제어하는 데 사용할 수 있습니다.
PdfCompare를 사용할 때 몇 가지 내부 기능을 아는 것이 좋습니다. 간단히 말해서 PdfCompare가 두 PDF를 비교할 때 수행하는 작업은 다음과 같습니다.
PdfCompare는 Apache PdfBox 라이브러리를 사용하여 PDF를 읽고 씁니다.
따라서 큰 PDF를 비교하면 많은 메모리를 사용할 수 있습니다. 아직 PdfBox를 사용하여 PDF 페이지를 점진적으로 작성하는 방법을 찾지 못했지만 몇 가지 해결 방법이 있습니다.
현재 페이지를 디스크로 교체하여 메모리 소비를 제한하는 전략이 다른 두 가지 CompareResult가 있습니다.
다음과 같이 다른 CompareResult 구현을 사용할 수 있습니다.
new PdfComparator ( "expected.pdf" , "actual.pdf" , new CompareResultWithPageOverflow ()). compare ();
또한 변경할 수 있는 메모리 제한에 대한 일부 내부 설정이 있습니다. 클래스패스의 루트에 "application.conf"라는 파일을 추가하기만 하면 됩니다. 이 파일에는 여기에 제공된 기본값을 덮어쓰기 위해 다음 설정 중 일부 또는 전부가 있을 수 있습니다.
imageCacheSizeCount=30
PdfBox가 캐시하는 이미지 수
maxImageSizeInCache=100000
매우 큰 이미지가 캐시되는 것을 방지하기 위해 캐시되는 대략적인 최대 이미지 크기
mergeCacheSizeMB=100
PDF가 부분적으로 기록되고 나중에 병합될 때 이는 병합을 수행하는 PdfBox 인스턴스에 대해 구성된 메모리 캐시입니다.
swapCacheSizeMB=100
PDF가 부분적으로 기록되는 경우 이는 부분 쓰기를 수행하는 PdfBox 인스턴스에 대해 구성된 메모리 캐시입니다.
documentCacheSizeMB=200
비교되는 문서를 로드하는 PdfBox 인스턴스에 대해 구성된 캐시 크기입니다.
병렬 처리=true
false로 설정하면 모든 병렬 처리가 비활성화되고 모든 것이 단일 스레드에서 처리됩니다.
전체TimeoutInMinutes=15
전체 시간 제한을 설정합니다. 이는 가능한 교착 상태를 감지하기 위한 안전 조치입니다. 복잡한 비교는 시간이 더 오래 걸릴 수 있으므로 이 값을 늘려야 할 수도 있습니다.
executorTimeoutInSeconds=60
전체 시간 초과에 도달한 후 실행기가 완료될 때까지 기다리도록 시간 초과를 설정합니다. 이를 변경할 필요는 거의 없습니다.
따라서 이 기본 구성에서 PdfBox는 디스크로 교체하기 전에 캐시에 최대 400MB의 RAM을 사용해야 합니다. JVM에 2GB 힙 공간을 부여한 좋은 경험이 있습니다.
메모리 부족 문제를 진단하는 데 도움을 주고 생성된 PDF의 부분 쓰기 및 병합에 대한 아이디어를 제공한 Chethan Rao [email protected]에게 큰 감사를 드립니다.